Cognito

AWS Cognito 入門:ユーザープールとIDプールで認証・認可を分離する方法

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

1️⃣ Cognito の基本概念と認証‑認可の分担

1.1 用語解説

用語 意味
ユーザープール ユーザー情報(メール・パスワード等)を管理し、サインアップ/サインインや MFA を提供する認証基盤。成功すると JWT (ID トークン/アクセストークン) が発行される。
ID プール(アイデンティティプール) ユーザープールから取得した JWT を受け取り、AWS の一時的クレデンシャルを生成する認可基盤。IAM ロールへマッピングしてリソースアクセスを制御できる。
IAM ロール AWS リソースへの権限集合。Cognito が発行したクレデンシャルはこのロールに紐付くことで実際の操作が可能になる。
トークンからロール選択 (Token from role selection) JWT に埋め込まれた情報(例: cognito:groups) を基に、どの IAM ロールを取得すべきか自動的に決定する方式。

1.2 認証・認可フロー(Mermaid 図)

  • 認証:ユーザープールが行う(ステップ A→B)。
  • 認可:ID プールが JWT を元に IAM ロールを決定し、一時的クレデンシャルを発行(ステップ D→F)。

公式ドキュメントは AWS の開発者ガイド「Amazon Cognito Identity Pools – 開始ガイド」をご参照ください。


2️⃣ IAM カスタムロールの作成と信頼ポリシー設定

2.1 ロール作成手順(コンソール編)

  1. IAM コンソール → ロール → ロールを作成 を選択。
  2. 信頼されたエンティティとして 「Cognito」 > 「Cognito ID プール」 を指定し、対象の ID プール ID を入力。
  3. 必要最小限の権限(例: AmazonS3ReadOnlyAccess)をポリシーでアタッチ。
  4. ロール名は cognito-{appName}-{rolePurpose} という規則に従うと管理しやすい(例: cognito-inventory-readonly)。

2.2 信頼ポリシーの正しい記述例

  • aud:対象の ID プール ID(必ず実際の文字列に置き換える)。
  • amrauthenticated にすると、認証済みユーザーだけがロール取得できる。

※上記は公式サンプルと同一です。(IAM ロールの信頼ポリシー – AWS Docs


3️⃣ ユーザープールグループ ↔ IAM ロール の紐付け

3.1 グループ作成とロール割り当て(コンソール)

手順 内容
Cognito → ユーザープール → グループadmineditor 等のグループを作成。
各グループ編集画面の 「IAM ロール」 欄に、先ほど作成したカスタムロール ARN を入力(例: arn:aws:iam::123456789012:role/cognito-inventory-admin)。
ID プール → 認証されたロール → Role mapping「Token from role selection」 を選択し、「Choose role from token」 に設定。

3.2 背景と効果

  • ユーザープール側でグループにロール ARN を埋め込むだけで、ID プールは JWT の cognito:groups クレームを参照し自動的に対応ロールを選択します。
  • アプリ側のコードは 「Cognito がロールマッピングをやってくれる」 という前提で実装できるため、認可ロジックが宣言的かつ保守性が向上します。

同様の手順は Zenn 記事「Cognito の ID プールでロールベースアクセス制御を行う」でも紹介されています(外部リンクは公式情報に準拠しています)。


4️⃣ Role Mapping の API/SDK による動的設定

4.1 SetIdentityPoolRoles API の正しいリクエスト構造

AWS CLI・SDK が期待する JSON は RoleMappings キーが「プロバイダー名 → マッピング情報」のマップ形式です。以下は公式ドキュメントに沿ったサンプルです。

mapping.json の例(Token based mapping)

  • cognito-idp.<region>.amazonaws.com/<USER_POOL_ID> が対象のユーザープールを指すキーです。
  • AmbiguousRoleResolutionDeny を設定すると、どのルールにもマッチしなかった場合はロール取得が拒否されます(安全策)。

詳細は公式リファレンス SetIdentityPoolRoles – AWS CLI Command Reference を参照してください。

4.2 SDK 実装例(JavaScript / Amplify)

  • Amplify は内部で cognito-identityGetIdGetCredentialsForIdentity を呼び出し、取得したクレデンシャルは自動的にキャッシュします。

4.3 SDK 実装例(Python / boto3)

  • ポイントRoleMappings のキーは必ず cognito-idp.<region>.amazonaws.com/<USER_POOL_ID> 形式で指定する必要があります。

4.4 インフラコードへの組み込み例(AWS CDK)

  • CDK を利用すれば コードベースでロールマッピングを管理 でき、CI/CD パイプラインに組み込むのが容易です。

5️⃣ カスタムロール適用のテスト・エラーハンドリング・ベストプラクティス

5.1 テストフロー(実際に一時的クレデンシャルを取得)

  1. サインアップ → サインイン をアプリ側で完了させる。
  2. Amplify の Auth.currentCredentials() または boto3 の get_id + get_credentials_for_identity一時的クレデンシャル を取得。
  3. 取得した AccessKeyId/SecretAccessKey で AWS CLI(例: aws s3 ls --profile temporary) を実行し、期待通りのリソースにアクセスできるか確認する。

公式サンプルアプリは Cognito Identity Pools – Getting Started Application にあります。

5.2 よくあるエラーと対策

エラー 原因 推奨対処
InvalidIdentityPoolConfigurationException Role Mapping が未設定、または信頼ポリシーに cognito-identity.amazonaws.com が欠如 コンソール/CLI で Token from role selection を有効化し、信頼ポリシーを再確認
AccessDenied(S3 等) ロールに必要な権限が不足している IAM ポリシーに対象アクション (s3:GetObject, dynamodb:Query など) を追加。最小権限の原則で見直し
JWT に cognito:groups が無い ユーザープール側でグループ割り当てが漏れている 管理コンソールまたは自動化スクリプトで対象ユーザーを正しいグループに所属させる

5.3 運用上のベストプラクティス

  1. 最小権限
  2. ロールごとに必要最低限のポリシーだけを付与し、IAM Access Analyzer で過剰権限が無いか定期的に検査。

  3. 命名規則の徹底

  4. cognito-{appName}-{rolePurpose}(例: cognito-inventory-admin)とすれば、ロール一覧から目的を瞬時に把握できる。

  5. 監査ログの活用

  6. CloudTrail の AssumeRoleWithWebIdentity イベントを有効化し、誰がどのロールを取得したか を可視化。異常取得は EventBridge でアラート化すると即応可能。

  7. インフラコードで一元管理

  8. CDK・Terraform・CloudFormation のいずれかで ユーザープール、ID プール、IAM ロール、Role Mapping を同時にデプロイし、環境差分がコードレビューで把握できるようにする。

  9. テスト自動化

  10. CI パイプラインに aws sts get-caller-identity などの簡易コマンドを組み込み、デプロイ後にロール取得と権限検証をスクリプトで実行する。

📚 まとめ(全体像)

  1. 認証はユーザープール、認可は ID プール が基本構造。
  2. IAM カスタムロール は最小権限で作成し、cognito-identity.amazonaws.com を信頼ポリシーに必ず入れる。
  3. ユーザープールグループ ↔ IAM ロール の 1 対 1 紐付けで、トークンベースのロール選択が自動化できる。
  4. SetIdentityPoolRoles API と SDK(Amplify / boto3)を活用すれば、環境ごとや条件分岐に応じたロールマッピングをコード化・自動化可能。
  5. テスト・監査・最小権限の徹底 が運用上の成功要因。CloudTrail と IAM Access Analyzer を併用し、定期的なレビューと CI での検証を組み込むことが推奨される。

これらの手順とベストプラクティスを踏まえて実装すれば、Cognito の認証・認可機構を安全かつスケーラブルに活用できるでしょう。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Cognito