エラー内容
AWS Codepipelineで手動リリースしたら以下のエラーになりました。
SourceステージはGithub Webhook、BuildステージではCodeBuildを選んでいました。
[GitHub] Upload to S3 failed with the following error: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID:...
原因
S3バケットへのアクセス許可に関する問題が原因と言われています。
CodeBuildプロジェクトがS3バケットに対する必要なアクセス許可を持っていない場合に発生するらしい。
ということで、CodepipelineのRoleを見てみます。
CodePipeLineRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
-
Effect: Allow
Principal:
Service:
- codepipeline.amazonaws.com
Action:
- sts:AssumeRole
Path: /
RoleName: CodePipeLineRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSCodePipeline_FullAccess
- arn:aws:iam::aws:policy/AWSCodeCommitFullAccess
- arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess
- arn:aws:iam::aws:policy/CloudWatchFullAccess
- arn:aws:iam::aws:policy/AmazonECS_FullAccess
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
- arn:aws:iam::aws:policy/AmazonS3FullAccess
S3FullAccess
があるので問題なさそう...
同様にCodebuildのRoleにもS3へのアクセス許可は記載していました。
おかしいなぁ...と思ってよく見ると、凡ミスであることが分かりました。
アーティファクトストアの場所が誤っていたのです。
CodePipeLineでは以下のようにArtifactStore
の場所を定義します。
Artifact
とは中間生成物のことであり、通常S3バケットに保存されます。
CodePipeLineAppBuild:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStore:
Location: !Sub ${SysTag}-xxx-codepipeline # ここで定義
Type: S3
Name: !Sub ${SysTag}-xxx-ECR
RoleArn: !GetAtt CodePipeLineRole.Arn
Stages:
- Name: Source
##略##
しかし、Location
に記載されたバケット名でS3バケットを作っていなかったのです。正確に言うと、あとでS3バケット名を変えたのですが、ArtifactStore
の方を変えないままCloudFormationテンプレートを更新していたのです。更新時は特にエラーは出ません。
このLocation
でミスっていると、上述のアクセス許可エラーになります。
Access Denied
と言われているので、RoleとかACLとか、バケットポリシーとかいろいろ見てしまい遠回りしましたが、ただ単に存在しない場所にはアップロードできないよと怒られていたのでした。。正しく設定してあげたら無事に走りました。一件落着。