【正解】C
【0からの解説】
S3 のアクセス許可では、操作の対象が「バケットそのもの」なのか「バケット内のオブジェクト」なのかで、ARN(リソース指定)の書き方が変わります。
・バケット自体に対する操作(例: s3:ListBucket)→ ARN は
arn:aws:s3:::バケット名(末尾なし)
・オブジェクトに対する操作(例: s3:GetObject、s3:PutObject)→ ARN は
arn:aws:s3:::バケット名/*(末尾に /* が必要)
この問題のポリシーは Action が s3:GetObject(=オブジェクトの読み取り)であるにもかかわらず、Resource が arn:aws:s3:::DOC-EXAMPLE-BUCKET(バケット自体)になっています。GetObject はオブジェクトレベルの操作なので、このリソース指定ではどのオブジェクトにも一致せず、Lambda 関数はアクセス拒否(Access Denied)になります。
そこで Resource を
arn:aws:s3:::DOC-EXAMPLE-BUCKET/* に変更し、「バケット内のすべてのオブジェクト」を対象にすれば、s3:GetObject が正しく許可され、関数はオブジェクトを読み取れるようになります。
【誤りの選択肢】
A:Principal の Service は lambda.amazonaws.com で、Lambda がサービスとしてアクセスする際の指定として妥当です。Condition の aws:SourceArn は特定の関数だけに限定する正しい制限であり、削除や Principal 変更は問題の原因(リソース ARN の不一致)を解決しません。
B:Action は s3:GetObject であり、オブジェクト読み取りには正しい権限です。問題はアクションではなくリソース ARN にあるため変更不要です。
D:Resource を Lambda 関数の ARN に変えるのは誤りです。S3 バケットポリシーの Resource は S3 リソース(バケットやオブジェクト)を指す必要があり、Lambda 関数 ARN を指定しても S3 オブジェクトへのアクセスは許可されません。
【参考】
Amazon S3 のバケットポリシーの例Amazon S3 リソースの ARN 形式