はじめに
WebアプリやモバイルアプリのバックエンドとしてAPIを公開する際、「誰でもアクセスできてしまうのは困る」「認証されたユーザーだけに使わせたい」といったニーズはよくあります。
そこで活躍するのが、API GatewayとCognitoを組み合わせた認証付きAPIの構築です。
本記事では、AWS API Gatewayにユーザー認証を導入する方法を初心者向けにわかりやすく解説します。特に、CognitoというAWSの認証基盤を使って、認証されたユーザーだけがアクセスできるセキュアなAPIを作成する手順を中心に紹介します。
認証付きAPIの全体構成の概要
本記事で構築する認証付きAPIは、「API Gateway + Cognito + Lambda」の3つのサービスを連携させて実現します。以下にその全体像を簡単に紹介します。
全体構成のイメージ図

各サービスの役割
- Cognito(コグニート)
AWSが提供するユーザー管理・認証サービスです。ログインやサインアップを管理し、ユーザーにJWTトークン(IDトークンやアクセストークン)を発行します。 - API Gateway
外部からのリクエストを受け取る入口です。Cognitoオーソライザーを設定することで、トークンを検証し、認証済みのリクエストだけをLambdaへ流すことができます。 - Lambda
実際のAPI処理を行うサーバーレス関数です。たとえば「ユーザーの情報を取得する」「データベースに保存する」などの処理をここで実装します。
Cognito User Poolの作成
認証付きAPIを実現するには、まずユーザーの情報を管理する仕組み=Cognito User Pool(ユーザープール)を作成する必要があります。
ここでは、AWSマネジメントコンソールを使ってユーザープールを作成する手順を紹介します。
Cognitoの画面を開く
- AWSマネジメントコンソール にログイン
- 検索バーに「Cognito」と入力し、Cognitoのサービスページへ移動
新しいユーザープールを作成する
新しいユーザープールを作成

今回は、シングルページアプリケーション(SPA)で行なっていきます。

オプション設定下記画像のようにして、作成します。

ユーザー登録方法
ユーザーを手動作成方法
- ユーザープールの「ユーザー」タブを選択

- 「ユーザーを作成」ボタンを押す

- 下記内容を設定します。
カテゴリ | 項目 | 今回の選択肢 | 備考 |
---|---|---|---|
招待方法 | 招待メッセージ | 招待を送信しない | 招待メッセージの送信方法を選択 |
ユーザー情報 | ユーザー名(必須) | user-a | サインインに使用される一意のID |
Eメールアドレス | usera@example.com | サインイン・パスワードリセット等に使用 | |
Eメールを検証済みにする | チェック | Eメール確認ステップをスキップ可能 | |
電話番号 | 未入力 | 任意(MFAや通知用途) | |
パスワード | 仮パスワードの設定方法 | 手動入力 | 仮パスワードの設定 |
確認ステータスの更新
ユーザーを作成したら下記表示になってます。
確認ステータスがパスワードを強制的に変更になっており、このままだとユーザーとして利用できないので変更していきます。

clooudshellを開きます。

下記コマンドを叩きます。
user-pool-id、username、passwordは自身の環境に置き換えてください。
aws cognito-idp admin-set-user-password \
--user-pool-id ap-northeast-1_xxxxxx \
--username user-a \
--password password \
--permanent
確認済みになれば成功です。

API Gatewayでオーソライザーの設定
Cognitoでユーザープールを作成したら、次はAPI Gatewayにその認証情報を連携させましょう。
ここでは、Cognito User Poolを使ったJWTオーソライザーの作成方法を解説します。
APIの作成
APIの作成方法~Lambda関数との接続方法は下記記事に掲載しています。

オーソライザーの作成
- 対象API「オーソライザー」メニューを開く

- 「オーソライザーを作成」をクリック

- 以下の情報を入力します
項目 | 内容 |
---|---|
オーソライザー名 | 任意の名前(例:CognitoAuth ) |
タイプ | Cognito を選択 |
ユーザープール | 作成済みのCognito User Poolを選択 |
トークンのソース | Authorization |

ALLOW_ADMIN_USER_PASSWORD_AUTHを有効化する
トークンをCLIで簡単に取得できるようにするために、ALLOW_ADMIN_USER_PASSWORD_AUTHを有効にします。
Cognitoのアプリケーションクライアント名をクリックし、アプリケーションクライアントにアクセスします。

編集をクリックする。

ALLOW_ADMIN_USER_PASSWORD_AUTHを有効化します。

メソッドにオーソライザーを適用する
- API Gatewayの「リソース」設定へ進む
- 任意のエンドポイント(例:
GET /hello
)を選択 - メソッドリクエストの編集を選択

- 認可で先ほどのオーソライザーを選択

- 保存してデプロイ
認証付きAPIのテスト
Cognitoによるユーザー認証と、API Gatewayオーソライザー、Lambda関数の統合が完了したら、実際にAPIが正しく動作しているかをテストしてみましょう。
IDトークンの取得
Cognitoにログインしたユーザーが取得できる IDトークン(JWT) が必要です。
CloudShellから下記コマンドを叩いて取得します。
aws cognito-idp admin-initiate-auth \
--user-pool-id ap-northeast-1_xxxxxx \
--client-id xxxxxxxxxxxxxxxxxx \
--auth-flow "ADMIN_USER_PASSWORD_AUTH" \
--auth-parameters USERNAME=user-a,PASSWORD=password
認証なしで呼び出してみる(失敗パターン)
curl https://your-api-id.execute-api.ap-northeast-1.amazonaws.com
結果:403 Forbidden
{
"message":"Unauthorized"
}
これはトークンが指定されていないため、API Gatewayがアクセスを拒否したことを示しています。
認証ありで呼び出す(成功パターン)
ID_TOKENにIDトークンを指定します。
curl -X GET your-api-id.execute-api.ap-northeast-1.amazonaws.com \
-H "Authorization: Bearer ID_TOKEN"
結果:200 OK
{
"statusCode":200,
"body":"\"Hello from Lambda!\""
}
参考リンク
- Amazon Cognito ユーザープールとは – AWS公式
ユーザープールの基本、認証フロー、トークンの仕組みなどを網羅的に解説しています。 - API Gateway オーソライザーの使用 – AWS公式
LambdaオーソライザーとJWTオーソライザーの違いや使い方を詳しく解説。 - HTTP API と Cognito の連携設定(JWT認証)
HTTP APIでCognito認証を組み合わせる手順を記載。今回の構成にマッチします。
コメント