Cognito のサインイン後に Lambda を実行する方法 ── 認証後トリガーでサインインを記録する
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| DynamoDB テーブル | dva-signin-events | パーティションキー userName、ソートキー signedInAt(どちらも文字列) | Amazon DynamoDB でテーブルを作り Lambda から読み書きする |
| Lambda 関数 | dva-cognito-post-auth | Python 3.13。認証後トリガーのイベントから userName・userPoolId・callerContext.clientId を取り出してテーブルに書き、イベントをそのまま返す | 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 になり、テーブルの項目は増えません。認証後トリガーは、サインインが成功したときにだけ呼ばれます。