Cognito のサインイン後に Lambda を実行する方法 ── 認証後トリガーでサインインを記録する

目次

概要

アプリケーションにサインアップ・サインインの機能を付けたうえで、「ユーザーがサインインするたびに、独自の分析システムへ記録を送りたい」という要件はよくあります。認証の仕組みを自前で作り、その中に記録の処理を書き足すこともできますが、認証そのものは Amazon Cognito ユーザープール に任せ、サインインの後の処理だけを自分で書くほうが安全で手早く作れます。

Cognito ユーザープールには、認証の流れの決まったタイミングで Lambda 関数を呼び出す Lambda トリガーがあります。サインインが成功した直後に呼ばれるのが 認証後(Post authentication)トリガーです。

この記事では、Cognito ユーザープールでできることと Lambda トリガーの種類、そして IAM との役割の違いを整理します。実践では、ユーザープールに認証後トリガーを設定し、CLI でサインインして、Lambda がサインインの記録を DynamoDB に書くことを確かめます。

サインインが成功した直後に、認証後トリガーの Lambda が記録を残す
サインインが成功した直後に、認証後トリガーの Lambda が記録を残す
クラウドおさる

門番(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 に返します。

Lambda トリガーを差し込めるタイミング(サインインの流れ)
Lambda トリガーを差し込めるタイミング(サインインの流れ)
クラウドおさる

認証後トリガーは「通ったあと」に呼ばれるのでござる。通すかどうかを決めたいなら認証前、通った記録を残したいなら認証後。差し込む場所を取り違えぬことでござるな。

トリガーの設定と呼び出し権限

コンソールでユーザープールにトリガーを設定すると、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 の利用が推奨されます。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド6 ステップ画面 4 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

ユーザープール 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-authPython 3.13。認証後トリガーのイベントから userName・userPoolId・callerContext.clientId・triggerSource を取り出し、サインインした時刻(signedInAt)と一緒にテーブルに書き、イベントをそのまま返すAWS Lambda で関数を作成しイベント駆動で実行する
IAM ロールdva-cognito-post-auth-role上の関数の実行ロール。ログ出力とテーブルへの PutItem を許可―

作成するリソース一覧

リソース種別リソース名用途
Cognito ユーザープールdva-signin-poolアプリのユーザーの認証
アプリケーションクライアントdva-signin-clientCLI からのサインインに使う
ユーザー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 を指定)
Lambda トリガーの追加画面(認証後トリガーに dva-cognito-post-auth を指定)

「Lambda トリガー」の一覧に、認証後トリガーとして dva-cognito-post-auth が表示されることを確認します。

手順 3: CLI でサインインできるようにする

左側ナビゲーションの「アプリケーションクライアント」から dva-signin-client を開き、「アプリケーションクライアントに関する情報」の「編集」をクリックします。「認証フロー」で「ALLOW_USER_PASSWORD_AUTH」にチェックを入れて「変更を保存」をクリックします。クライアント ID をコピーしておきます。

アプリケーションクライアントの認証フローに ALLOW_USER_PASSWORD_AUTH を追加した画面
アプリケーションクライアントの認証フローに ALLOW_USER_PASSWORD_AUTH を追加した画面

左側ナビゲーションの「ユーザー」で「ユーザーを作成」をクリックし、ユーザー名に 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 件増えます。

dva-signin-events にサインインの記録が追加された状態
dva-signin-events にサインインの記録が追加された状態

Lambda コンソールで dva-cognito-post-auth の「モニタリング」タブ →「CloudWatch Logs を表示」を開くと、関数が受け取ったイベント(triggerSource と userName)のログも確認できます。

試しに、間違ったパスワードで initiate-auth を実行すると NotAuthorizedException になり、テーブルの項目は増えません。認証後トリガーは、サインインが成功したときにだけ呼ばれます。

クラウドおさる

通行手形が本物と確かめられたときだけ、記録係が帳面に書いたでござる。偽の手形では帳面は増えない。認証後トリガーは「通った後」と、身をもって分かったでござるな。

まとめ

要件選ぶもの
アプリにサインアップ・サインインを付けるCognito ユーザープール(IAM ではない)
サインインのたびに独自の処理を実行する認証後トリガーの Lambda 関数
サインインの前に通すかどうかを判断する認証前トリガー
トークンに独自のクレームを足すトークン生成前トリガー
  • Cognito ユーザープールはアプリのエンドユーザーの認証を担い、IAM は AWS を操作する人やサービスの認証と権限を担う
  • Lambda トリガーで、認証の流れの決まったタイミングに独自の処理を差し込める。認証後トリガーはサインインの成功後に呼ばれる
  • コンソールでトリガーを設定すると、Cognito から関数を呼ぶ許可が自動で追加される
  • トリガーの処理には時間の制限がある。重い処理は非同期に回す

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次