CodePipeline で AmazonS3FullAccess を付与しても S3:AccessDenied が発生するときの対処方法

2022.05.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

CodePipeline で CodeCommit のコードをデプロイするパイプラインを構築しました。実行すると S3 へのAccessDeniedが記録され、失敗しました。
トラブルシューティングも参考に、サービスロールにAmazonS3FullAccessポリシーを付与しましたが、同じエラーが記録されます。パイプラインを正常に実行するにはどうしたら良いでしょうか?

アクセス権限がありません
The service role or action role doesn’t have the permissions required to access the Amazon S3 bucket named codepipeline-ap-northeast-1-123456789012. Update the IAM role permissions, and then try again.
Error: Amazon S3:AccessDenied:User: arn:aws:sts::123456789012:assumed-role/AWSCodePipelineServiceRole-ap-northeast-1-hato-DeployPipeline/123456789012 is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:ap-northeast-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab because no identity-based policy allows the kms:GenerateDataKey action (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: XXXX; S3 Extended Request ID: YYY; Proxy: null)

どう対応すればいいの?

CodePipeline に設定した IAM ロール(サービスロール)のアクセス許可をご確認ください。

CodePipeline のアーティファクトは暗号化され、S3 に保管されます。暗号化は「AWS マネージドキー」と「カスタマーマネージドキー」から選択できますが「カスタマーマネージドキー」を選択した場合、KMS へのアクセス許可が必要となります。

AWS KMS の認証とアクセスコントロール - AWS Key Management Service

そのため、「カスタマーマネージドキー」を選択している場合は、CodePipeline に設定した IAM ロールから KMS へのアクセスが許可されているかご確認ください。

なお、現時点で CodePipeline コンソールからサービスロールを自動作成した場合、IAM ポリシーの許可に KMS は含まれません。

サービスロールのポリシーステートメントは、パイプラインで使用する前に、デフォルトのサービスロールのポリシーステートメントに含まれていない AWS サービスのアクセス許可で更新する必要があります。

サービスロールの確認方法

CodePipeline のサービスロールは、CodePipeline コンソールもしくは AWS CLI のget-pipeline コマンドから確認できます。

CodePipeline コンソールから確認する場合は、パイプラインをクリックします。

「設定」をクリックします。
※2箇所あるのでご注意ください。

「サービスロール ARN」を確認します。

参考資料

Data in CodePipeline is encrypted at rest using AWS KMS keys. Code artifacts are stored in a customer-owned S3 bucket and encrypted with either the AWS managed key or a customer managed key.