モバイルアプリのユーザーが Google アカウントでサインインし、認証後に DynamoDB へ直接アクセスする要件がある。アプリに AWS の長期的な認証情報を埋め込まずに実装するには、どの構成が最も適切か。
正解: Cognito ユーザープールで Google フェデレーションを構成し、認証後に Cognito アイデンティティプール(Identity Pool)を使って一時的な IAM 認証情報を取得する。 Cognito アイデンティティプールは外部 IdP(Identity Provider / ID プロバイダー)のトークンを STS の AssumeRoleWithWebIdentity に渡し、一時的な IAM 認証情報を発行する。アプリに長期認証情報を埋め込む必要がなく、IAM ロールで DynamoDB アクセスを制御できる。ユーザープールは認証、アイデンティティプールは AWS リソースへの認可を担う役割分担が重要。【Aが誤りの理由】JWT トークンは AWS の認証情報ではなく、DynamoDB の API リクエストには SigV4 署名(IAM 認証情報)が必要なため、JWT をそのまま API 呼び出しに使用することはできない。【Cが誤りの理由】STS の GetSessionToken は既存の IAM ユーザーが MFA を使用する際に呼び出すものであり、外部 IdP(Google)の ID トークンを引数として受け付けない。外部 IdP 連携による一時認証情報取得には AssumeRoleWithWebIdentity が必要であり、Cognito アイデンティティプールがこれを内部で自動実行する。【Dが誤りの理由】ユーザーごとに IAM ユーザーを作成してアクセスキーをモバイルアプリに配布することは、長期的な認証情報をクライアント端末に埋め込む形となりセキュリティリスクが極めて高い。漏洩時の影響範囲が広く、認証情報のローテーションも困難になる。