ある企業がスマートフォン向けヘルスケアアプリを開発しています。アプリユーザーは自分自身の健康データのみを閲覧・更新でき、他のユーザーのデータには一切アクセスできない要件があります。データはDynamoDBテーブルに保存されており、パーティションキーは各ユーザーの一意のIDです。アクセス制御はAWSサービスレベルで強制する必要があり、アプリケーションコードのみへの依存は許容されません。最も適切な実装方法はどれですか?
Amazon Cognito IDプール(Federated Identities)は、認証されたユーザーにAWS STSを通じた一時的なIAM認証情報を発行するサービスです。認証済みユーザーに紐づくIAMロールのポリシーに`dynamodb:LeadingKeys`条件キーを使用することで、DynamoDBのパーティションキーへのアクセスをAWSサービスレベルで制限できます。 `${cognito-identity.amazonaws.com:sub}`はCognito IDのユーザー識別子(Cognito Identity ID)を参照するIAMポリシー変数です。この設定により、各ユーザーが保有するIAM一時認証情報は、自分のCognito Identity IDと一致するパーティションキーを持つアイテムへのアクセスのみIAMが許可するため、アプリケーションコードとは独立したAWSサービスレベルのアクセス強制が実現します。 選択肢AのCognito ユーザープール+LambdaフィルタリングはDynamoDBへのアクセス制御がLambda内コードへの依存となりAWSサービスレベルの強制ではない。Lambda迂回時やDynamoDBへの直接アクセス時に制御が無効化される。 選択肢CのAppSyncリゾルバーによるフィルタも同様にアプリケーション層の制御であり、IAMレベルでDynamoDBアクセスを直接制限するものではない。 選択肢DのCognito IDプールの動的ロールマッピングは有効な機能だが、DynamoDBリソースARNにはパーティションキー値を含めることができないため、この方法でアイテムレベルの制御は実現できない。