CodePipeline で AmazonS3FullAccess を付与しても S3:AccessDenied が発生するときの対処方法
困っていた内容
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.