ある企業が、Amazon Cognito ユーザープールを使ったモバイルアプリを運用している。ユーザーがサインインした後、アプリから直接 S3 バケットにファイルをアップロードできるようにしたい。各ユーザーは自分のプレフィックス(/private/<ユーザーID>/)以下のみに書き込みでき、他のユーザーのデータにはアクセスできないようにしたい。最も適切なアーキテクチャはどれか。
- A. Amazon Cognito Identity Pool(フェデレーテッドアイデンティティ)を使い、認証済みユーザーに一時的な IAM 認証情報を付与する。IAM ロールのポリシーで cognito-identity.amazonaws.com:sub 変数を使ってユーザー固有のプレフィックスのみへのアクセスを許可する。
- B. Lambda 関数を経由してすべての S3 アクセスを行い、Lambda でユーザーの権限チェックをする。
- C. すべてのユーザーが使う共通の IAM ユーザーのアクセスキーをアプリに埋め込み、S3 にアクセスする。
- D. すべてのユーザーに同一の IAM ロールをアタッチし、S3 バケット全体への読み書き権限を付与する。
解答と解説を見る
正解: A
Amazon Cognito Identity Pool は Cognito User Pool での認証後にフェデレーテッドアイデンティティとして一時的な AWS 認証情報を発行する。IAM ロールのポリシーで ${cognito-identity.amazonaws.com:sub} ポリシー変数を Resource ARN に組み込むことで、ユーザーごとに自分の Cognito Identity ID に対応するプレフィックスのみへのアクセスを許可できる。静的なアクセスキー不要で、認証情報が自動ローテーションされる安全な設計。選択肢Cの共通アクセスキーのアプリ埋め込みは、キーが漏洩するリスクが非常に高く、ユーザーごとのアクセス分離もできない。選択肢BのLambda 経由は機能するが、アップロードファイルが Lambda の最大ペイロード(6MB)を超えられない制限があり、大容量ファイルには向かない。選択肢DはS3 全体への読み書きを全ユーザーに付与しており、最小権限の原則に反し他ユーザーのデータへのアクセスも可能になる。
📚 関連サービスの解説: Amazon Cognito ・ AWS IAM