🎫 Cognito IDプール IAMロール

図書館の利用カードで理解する!アクセス権限の仕組み

📚 図書館のたとえで超わかりやすく!

Cognito IDプール = 図書館のアクセス管理システム

図書館には「ビジター」と「会員」がいますよね?
それぞれに 違う利用カード を渡して、 利用できるサービス を制限します。

ビジター :一時的な利用者カード(未認証ロール)
会員 :正式な会員カード(認証済みロール)

Cognito IDプールは、AWSリソースへのアクセスを
誰が・どのように・何にアクセスできるか を管理する仕組みです!✨

🎫
未認証ロール
Unauthenticated Role

📚 図書館の例え:

飛び込みで来たビジター。身分証明なしで入館できますが、利用できるのは 公開エリアのみ

🔑 できること:

  • 雑誌コーナーの閲覧(限定的なデータ取得)
  • パンフレットの受け取り(公開コンテンツ)
  • 館内地図の閲覧(基本情報)
  • 本の貸出不可(書き込み操作不可)
  • 会員専用エリア立入禁止
💡 AWS例:
S3の公開バケットの読み取りのみ
CloudWatchログへの書き込み不可
DynamoDBへのアクセス不可
💳
認証済みロール
Authenticated Role

📚 図書館の例え:

正式な会員登録を済ませた利用者。 身分証明済み なので、全サービスを利用できます!

🔑 できること:

  • 本の貸出・返却(データの読み書き)
  • 学習室の予約(リソース予約)
  • パソコン利用(高度な機能)
  • 会員専用データベース検索
  • 個人のページ(マイライブラリ)
💡 AWS例:
S3の特定バケットへの読み書き
DynamoDBへのCRUD操作
Lambda関数の実行
CloudWatchへのログ記録

📖 図書館での1日:ロールの切り替え

🚶 シーン1:初めての来館

👤 佐藤さん(ビジター)

初めて図書館に来ました。
受付で「 ビジターパス 」をもらいます。

雑誌コーナー閲覧OK
公開エリアのみ
本の貸出NG
🎫 受け取るもの:
未認証ロール(制限付きアクセス)

👨‍💼 佐藤さん(会員登録後)

気に入ったので会員登録!
身分証明書を見せて「 会員カード 」を取得。

全エリアアクセスOK
本の貸出OK(10冊まで)
学習室予約OK
💳 受け取るもの:
認証済みロール(フルアクセス)
🔄 これがCognito IDプールの仕組み!

1️⃣ 最初は全員がビジターパス(未認証ロール)
→ アプリを開いた瞬間、誰でも使える最低限の機能

2️⃣ ログインすると会員カード(認証済みロール)にアップグレード
→ Google/Facebook/メールでログイン = 身分証明
→ より多くの機能とデータにアクセス可能に!

3️⃣ ログアウトするとビジターパスに戻る
→ セキュリティのため、認証が切れると権限も制限される

🔄 ロール取得の流れ

1 アプリ起動
📱 ユーザーがアプリを開く
この時点では誰だか分からない状態。Cognito IDプールに「一時的なアクセス権をください」とリクエスト。

🎫 受け取るもの:
未認証ロール + 一時的なAWSクレデンシャル
⬇️
2 制限付きアクセス
👀 公開データのみ閲覧可能
• S3の公開バケットから画像取得
• API Gatewayの公開エンドポイント呼び出し
• AppSyncの公開クエリ実行

❌ できないこと:
個人データへのアクセス、データの書き込み、プライベートリソースへのアクセス
⬇️
3 ユーザー認証
🔐 ログイン処理
• Cognito User Poolsでログイン
• Google/Facebook/Appleでソーシャルログイン
• SAMLフェデレーション(企業のSSO)

✅ 認証成功:
IDトークン(JWTトークン)を取得 → 「この人は本人確認済みです」という証明書
⬇️
4 認証済みロールに切り替え
💳 会員カードにアップグレード!
Cognito IDプールにIDトークンを提示すると、認証済みロールの一時クレデンシャルを発行。

🎉 できるようになること:
• ユーザー専用のS3フォルダへのアクセス
• DynamoDBへの個人データ読み書き
• Lambda関数の実行
• プライベートAPIへのアクセス

⏱️ クレデンシャルの有効期限: 通常15分〜1時間(自動更新)

🎯 高度な機能:ルールベースマッピング

会員にも 「一般会員」「プレミアム会員」「VIP会員」 がいるように、
認証済みユーザーでも 異なるIAMロール を割り当てられます!

🥉

一般会員

条件:
無料プランのユーザー

権限:
• 基本機能のみ
• ストレージ5GBまで
• 広告表示あり
# カスタム属性でマッピング Claim: "custom:plan" Value: "free" Role: FreeUserRole
🥈

プレミアム会員

条件:
月額500円のユーザー

権限:
• 全機能利用可能
• ストレージ100GBまで
• 広告なし
# カスタム属性でマッピング Claim: "custom:plan" Value: "premium" Role: PremiumUserRole
🥇

管理者

条件:
管理者グループに所属

権限:
• 全ユーザーデータ閲覧
• システム設定変更
• レポート出力
# グループでマッピング Claim: "cognito:groups" Value: "Admins" Role: AdminRole

🎨 ルールの設定例

// Cognito IDプールのルール設定(Terraform例) resource "aws_cognito_identity_pool_roles_attachment" "main" { identity_pool_id = aws_cognito_identity_pool.main.id # デフォルトのロール roles = { "authenticated" = aws_iam_role.authenticated.arn "unauthenticated" = aws_iam_role.unauthenticated.arn } # ルールベースマッピング role_mapping { identity_provider = "cognito-idp.ap-northeast-1.amazonaws.com/YOUR_USER_POOL_ID" type = "Rules" mapping_rule { claim = "custom:plan" match_type = "Equals" value = "premium" role_arn = aws_iam_role.premium_user.arn } mapping_rule { claim = "cognito:groups" match_type = "Contains" value = "Admins" role_arn = aws_iam_role.admin.arn } } }

📊 詳細比較表

項目 未認証ロール 🎫 認証済みロール 💳
取得タイミング アプリ起動時(即座) ログイン成功後
必要なもの なし(誰でもOK) IDトークン(認証証明)
典型的な権限 S3公開バケット読み取りのみ 個人データの読み書き
アクセス範囲 公開リソースのみ ユーザー専用リソース
セキュリティレベル 低(最小限の権限) 高(本人確認済み)
クレデンシャル有効期限 通常1時間 通常1時間(自動更新)
使用例 トップページ閲覧、公開コンテンツ マイページ、個人データ保存
カスタマイズ 1つのロールのみ ルールベースで複数ロール可能

💼 実際のユースケース

📱

SNSアプリ

未認証:
• タイムラインの閲覧のみ
• プロフィール閲覧不可

認証済み:
• 投稿・いいね・コメント
• プロフィール編集
• S3に画像アップロード
• DynamoDBに投稿データ保存

🔑 ポイント:
未認証でも基本的な閲覧ができるので、ユーザー登録を促しやすい
🎮

ゲームアプリ

未認証:
• チュートリアルプレイ
• ローカル保存のみ

認証済み:
• クラウドセーブ(S3)
• ランキング参加(DynamoDB)
• アイテム購入履歴
• マルチプレイ参加

🔑 ポイント:
ゲストプレイから会員登録への導線がスムーズ
🛒

ECサイト

未認証:
• 商品一覧閲覧
• 検索機能利用

認証済み(一般):
• カートに追加
• 購入履歴閲覧
• レビュー投稿

認証済み(プレミアム):
• 先行販売アクセス
• 特別割引

🔑 ポイント:
会員ランクに応じて異なるロールを適用
📊

社内ダッシュボード

未認証:
• 使用不可(ログイン必須)

認証済み(一般社員):
• 自部門のレポート閲覧
• 個人データの編集

認証済み(管理者):
• 全部門のデータ閲覧
• ユーザー管理
• システム設定変更

🔑 ポイント:
グループベースで細かい権限制御
💡 ベストプラクティス
1. 最小権限の原則:
未認証ロールは必要最小限の権限のみ。「とりあえず全部許可」は絶対NG!

2. 明確な境界線を設ける:
• 未認証:公開データの読み取りのみ
• 認証済み:個人データへのアクセス
明確に線引きすることでセキュリティが向上します。

3. S3のパスベースアクセス制御:
認証済みロールでは s3:GetObject on arn:aws:s3:::bucket/${cognito-identity.amazonaws.com:sub}/*
のように、ユーザーIDでフォルダを分けることで個人データを保護。

4. 定期的な権限レビュー:
アプリの機能追加時には、IAMロールの権限も見直しを。不要な権限は即削除!

5. ルールベースマッピングの活用:
ユーザー属性やグループに応じて異なるロールを割り当てることで、きめ細かいアクセス制御が可能に。

6. クレデンシャルのキャッシュ:
AWS SDK(Amplify等)は自動でクレデンシャルをキャッシュして更新してくれます。開発者は認証状態の管理に集中できます!

7. エラーハンドリング:
権限不足エラー(403)が出た場合は、ユーザーにログインを促すなど、適切なUXを提供しましょう。

🎓 まとめ

📚 図書館 = Cognito IDプール

ビジターパス(未認証)と会員カード(認証済み)の
2種類の利用カードで、 誰が何にアクセスできるか を管理!

🎫
未認証ロール

誰でも使える
最小限の権限
公開データのみ
💳
認証済みロール

本人確認済み
個人データアクセス
フル機能利用可能

🎯 重要ポイント:

✅ ログイン状態に応じて 自動的にロールが切り替わる

✅ 各ロールには IAMポリシーで細かく権限を設定

✅ ルールベースマッピングで ユーザーごとに異なる権限 も可能

✅ セキュリティの基本は 「最小権限の原則」

Cognito IDプールを使えば、
ユーザーの認証状態に応じた柔軟なアクセス制御 が実現できます!
セキュアで使いやすいアプリを作りましょう!🎉

Created by SSuzuki1063

AWS SAP Learning Resources