概要
アプリケーションにサインアップ・サインインの機能を付けたうえで、「ユーザーがサインインするたびに、独自の分析システムへ記録を送りたい」という要件はよくあります。認証の仕組みを自前で作り、その中に記録の処理を書き足すこともできますが、認証そのものは Amazon Cognito ユーザープール に任せ、サインインの後の処理だけを自分で書くほうが安全で手早く作れます。
Cognito ユーザープールには、認証の流れの決まったタイミングで Lambda 関数を呼び出す Lambda トリガーがあります。サインインが成功した直後に呼ばれるのが 認証後(Post authentication)トリガーです。
この記事では、Cognito ユーザープールでできることと Lambda トリガーの種類、そして IAM との役割の違いを整理します。実践では、ユーザープールに認証後トリガーを設定し、CLI でサインインして、Lambda がサインインの記録を DynamoDB に書くことを確かめます。

クラウドおさる門番(Cognito)が通行手形を確かめたあとで、記録係(Lambda)に「いま誰が通ったか」を書き留めさせるのでござる。門番の仕事は門番に任せて、記録だけを自分で作るでござるよ。
この記事のメリット
- Cognito ユーザープールと IAM の役割の違い(アプリのユーザーか、AWS を操作する人やサービスか)を説明できるようになる
- Cognito ユーザープールの Lambda トリガーの種類と、呼ばれるタイミングが分かる
- 認証後トリガーで、サインインのたびに独自の処理(記録・外部 API の呼び出し)を実行できるようになる
- メールを受信しなくても、管理者の操作と CLI でサインインを試せるようになる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
Cognito ユーザープールと IAM
| 項目 | Cognito ユーザープール | IAM |
|---|---|---|
| 対象 | Web・モバイルアプリケーションのエンドユーザー | AWS のリソースを操作する人やサービス |
| 提供するもの | サインアップ、サインイン、パスワードのリセット、トークン(ID・アクセス・リフレッシュ)の発行 | AWS の API を呼ぶための認証と権限 |
| ユーザー数 | 数百万規模のアプリのユーザー | アカウントの管理者や開発者、ワークロード |
アプリケーションのユーザーのサインアップ・サインインを IAM ユーザーで作るのは筋違いです。エンドユーザーの認証は Cognito ユーザープールに任せます。
Lambda トリガー
ユーザープールの認証の流れには、Lambda 関数を差し込めるタイミングがあります。主なものは次のとおりです。
| トリガー | 呼ばれるタイミング | 使いどころの例 |
|---|---|---|
| サインアップ前 | サインアップの前 | 登録できるメールドメインを制限する |
| サインアップ後の確認 | ユーザーがアカウントを確認した後 | ウェルカムメッセージを送る、外部のデータベースに登録する |
| 認証前 | サインインの前 | 特定の条件でサインインを拒否する |
| 認証後 | サインインが成功した後 | サインインの記録を残す、分析システムに送る |
| トークン生成前 | トークンを発行する前 | トークンにクレームを足す・消す |
認証後トリガーの Lambda には、ユーザー名(userName)、ユーザープール ID(userPoolId)、アプリケーションクライアント ID(callerContext.clientId)、ユーザーの属性(request.userAttributes)などが入ったイベントが渡されます。関数は、受け取ったイベントをそのまま Cognito に返します。





認証後トリガーは「通ったあと」に呼ばれるのでござる。通すかどうかを決めたいなら認証前、通った記録を残したいなら認証後。差し込む場所を取り違えぬことでござるな。
トリガーの設定と呼び出し権限
コンソールでユーザープールにトリガーを設定すると、Cognito が Lambda 関数を呼び出すための許可(関数のリソースベースポリシー)が自動で追加されます。CLI や IaC でトリガーを設定する場合は、cognito-idp.amazonaws.com に lambda:InvokeFunction を許可する設定を自分で追加します。
トリガーの関数は、決められた時間内に応答する必要があります。外部の API を呼ぶ処理で時間がかかると、サインインそのものが失敗するので、重い処理はキューなどに渡して非同期にする設計も検討します。



記録係がもたもたしていると、門の前で旅人が待たされ、ついには追い返されてしまうでござる。トリガーの処理は軽く、が鉄則でござるぞ。
サインインの方法とアプリケーションクライアント
アプリケーションは、ユーザープールのアプリケーションクライアントを通してサインインします。サインインの方法(認証フロー)はクライアントごとに有効・無効を設定します。
| 認証フロー | 内容 |
|---|---|
ALLOW_USER_SRP_AUTH | パスワードを送らずに SRP プロトコルで検証する(推奨) |
ALLOW_USER_PASSWORD_AUTH | ユーザー名とパスワードをそのまま送って検証する |
ALLOW_REFRESH_TOKEN_AUTH | リフレッシュトークンで新しいトークンを得る |
実践では CLI からサインインを試すため、ALLOW_USER_PASSWORD_AUTH を一時的に有効にします。本番のアプリケーションでは SRP の利用が推奨されます。
実践
ユーザープール dva-signin-pool を作り、認証後トリガーに用意済みの Lambda 関数 dva-cognito-post-auth を設定します。メールの受信が要らないように、テストユーザーはコンソールで作り、パスワードを CLI で確定させてからサインインします。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| DynamoDB テーブル | dva-signin-events | パーティションキー userName、ソートキー signedInAt(どちらも文字列) | Amazon DynamoDB でテーブルを作り Lambda から読み書きする |
| Lambda 関数 | dva-cognito-post-auth | Python 3.13。認証後トリガーのイベントから userName・userPoolId・callerContext.clientId・triggerSource を取り出し、サインインした時刻(signedInAt)と一緒にテーブルに書き、イベントをそのまま返す | AWS Lambda で関数を作成しイベント駆動で実行する |
| IAM ロール | dva-cognito-post-auth-role | 上の関数の実行ロール。ログ出力とテーブルへの PutItem を許可 | ― |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| Cognito ユーザープール | dva-signin-pool | アプリのユーザーの認証 |
| アプリケーションクライアント | dva-signin-client | CLI からのサインインに使う |
| ユーザー | banana-taro | テストユーザー |
手順 1: ユーザープールを作る
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに Cognito と入力し、「Cognito」を選択します。
「ユーザープールを作成」をクリックし、以下を設定します。
- アプリケーションタイプ: 「シングルページアプリケーション (SPA)」(クライアントシークレットを持たないクライアントが作られます)
- アプリケーションに名前を付ける:
dva-signin-client - サインイン識別子のオプション: 「ユーザー名」
- サインアップのための必須属性:
email(サインイン識別子をユーザー名だけにすると、メールアドレスか電話番号を必須属性に選ばないと作成できません) - その他の項目はデフォルトのまま


「ユーザーディレクトリを作成する」をクリックします。作成されたユーザープールの名前(自動で付きます)は、「概要」の「名前の変更」から dva-signin-pool に変えておくと見分けやすくなります。
手順 2: 認証後トリガーを設定する
作成したユーザープールの左側ナビゲーションで「認証」の下の「拡張機能」を選択し、「Lambda トリガーを追加」をクリックします。以下を選択して「Lambda トリガーを追加」をクリックします。
- トリガーのタイプ: 「認証」
- 認証: 「認証後トリガー」
- Lambda 関数:
dva-cognito-post-auth


「Lambda トリガー」の一覧に、認証後トリガーとして dva-cognito-post-auth が表示されることを確認します。
手順 3: CLI でサインインできるようにする
左側ナビゲーションの「アプリケーションクライアント」から dva-signin-client を開き、「アプリケーションクライアントに関する情報」の「編集」をクリックします。「認証フロー」で「ALLOW_USER_PASSWORD_AUTH」にチェックを入れて「変更を保存」をクリックします。クライアント ID をコピーしておきます。


左側ナビゲーションの「ユーザー」で「ユーザーを作成」をクリックし、ユーザー名に banana-taro、メールアドレスに banana-taro@example.com(必須属性のため。メールは送りません)を入力します。招待メッセージは「招待を送信しない」、仮パスワードは「パスワードの設定」で任意の値を入力して「ユーザーを作成」をクリックします。作成直後のユーザーは、初回サインイン時にパスワードの変更が必要な状態です。
コンソール上部の CloudShell のアイコンから CloudShell を開き、次のコマンドでパスワードを確定させます。<ユーザープール ID> はユーザープールの「概要」で確認できます。
aws cognito-idp admin-set-user-password \
--user-pool-id <ユーザープール ID> \
--username banana-taro \
--password 'Banana-Handson-2026!' \
--permanentコンソールの「ユーザー」で、banana-taro の「確認ステータス」が「確認済み」になったことを確認します。
手順 4: サインインして、トリガーが動いたことを確かめる
CloudShell で次のコマンドを実行し、banana-taro としてサインインします。
aws cognito-idp initiate-auth \
--client-id <クライアント ID> \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters USERNAME=banana-taro,PASSWORD='Banana-Handson-2026!' \
--query 'AuthenticationResult.ExpiresIn'サインインに成功すると、トークンの有効期間(秒数)が表示されます(トークンそのものは表示しないようにしています)。
DynamoDB のコンソールの左側ナビゲーションで「項目を探索」を選択し、テーブルの一覧から dva-signin-events を選びます。userName が banana-taro、triggerSource が PostAuthentication_Authentication(列の幅によっては途中で切れて表示されます)の項目が追加されています。同じコマンドをもう一度実行すると、サインインした時刻(signedInAt)の違う項目が 1 件増えます。


Lambda コンソールで dva-cognito-post-auth の「モニタリング」タブ →「CloudWatch Logs を表示」を開くと、関数が受け取ったイベント(triggerSource と userName)のログも確認できます。
試しに、間違ったパスワードで initiate-auth を実行すると NotAuthorizedException になり、テーブルの項目は増えません。認証後トリガーは、サインインが成功したときにだけ呼ばれます。



通行手形が本物と確かめられたときだけ、記録係が帳面に書いたでござる。偽の手形では帳面は増えない。認証後トリガーは「通った後」と、身をもって分かったでござるな。
まとめ
| 要件 | 選ぶもの |
|---|---|
| アプリにサインアップ・サインインを付ける | Cognito ユーザープール(IAM ではない) |
| サインインのたびに独自の処理を実行する | 認証後トリガーの Lambda 関数 |
| サインインの前に通すかどうかを判断する | 認証前トリガー |
| トークンに独自のクレームを足す | トークン生成前トリガー |
- Cognito ユーザープールはアプリのエンドユーザーの認証を担い、IAM は AWS を操作する人やサービスの認証と権限を担う
- Lambda トリガーで、認証の流れの決まったタイミングに独自の処理を差し込める。認証後トリガーはサインインの成功後に呼ばれる
- コンソールでトリガーを設定すると、Cognito から関数を呼ぶ許可が自動で追加される
- トリガーの処理には時間の制限がある。重い処理は非同期に回す
参照先
- Amazon Cognito user pools – Amazon Cognito
- Lambda トリガーを使用したユーザープールワークフローのカスタマイズ – Amazon Cognito
- 認証後の Lambda トリガー – Amazon Cognito
- 認証フロー – Amazon Cognito
- 管理者としてのユーザーアカウントの作成 – Amazon Cognito















