👨‍💻

[2021-07] CodePipeline (CodeBuild, CodeDeploy) 'deploy' 수행 시 Artifact S3 권한 문제 (ECS Blue/Green)

July 20, 2021 By Bogeun Kim (bokunn91@gmail.com)
CI / CD 구성을 위해 CodePipeline 을 설정하다 보면 에러 메세지 만으로는 파악하기 힘든 상황이 나온다.
특히 'deploy' 단계에서 deploy 수행을 하다보면 시작과 거의 동시에 S3 에서 빌드 후 생성된 Artifact 를 찾지만 권한 문제로 접근할 수 없다는 에러 메세지를 볼 수 있다.
(나는 특히 ECS Blue/Green 배포를 수행하던 상황이었다.)

결론

(나의 경우에는) S3 권한 문제가 아니었다.
'deploy' 단계에서 CodeDeploy 를 활용하여 배포를 수행하는데 배포시 필요한 taskdef.json, appspec.yml 파일 등이 S3 경로에 없어서 발생하는 문제이다. (ECS Blue/Green 배포를 위해 CodeDeploy 는 taskdef.json, appspec.yml 파일을 활용한다.)

추적

많은 사용자들이 여러 글에서 해당 에러 메세지 (S3 권한 문제) 로 혼란을 겪었다고 한다. 그리고 그에 따른 해결책도 제시하고 있다.
StackOverflow 의 'Rszalski' 씨가 해당 에러 메세지로 혼란을 겪고 있다.
Ref
모두들 CodeBuild, CodeDeploy, CodePipeline 의 Service Role 에 S3 Full 권한을 주었지만 해결할 수 없었다고 한다.
(나의 경우에도) S3 권한 문제는 아니었고,,, 해당 링크에서도 적절한 해결책을 찾기 어려웠다. (AWS Case Open 으로 전달받았던 내용도 해당 링크들이었다. )

해결

CodePipeline 설정과 CodeDeploy 관련 문서를 찾아보다가 조금 마음에 걸리는 것들이 있었는데,,,
CodeDeploy 로 배포 수행시 taskdef.json, appspec.yml 파일을 참조할 수 있어야 하는데 'Deploy' 단계에서 해당 파일을 참조할 수 없어서 발생하는 에러로 보였다.
CodePipeline 'build' 단계에서 Artifact 로 'BuildArtifact' 를 지정하고 S3 로 해당 파일 (taskdef.json, appspec.yml) 을 업로드 하는데 어떠한 파일도 업로드하고 있지 않았던 것이다.
관련 파일을 BuildArtifact 내 포함될 수 있도록 buildspec.yml 을 수정하였고 'build' 단계 후 S3 로 BuildArtifact (taskdef.json, appspec.yml) 들이 zip 으로 압축되어 잘 업로드되었다.
활용했던 buildspec.yml
version: 0.2 phases: pre_build: on-failure: ABORT commands: - echo Logging in to Amazon ECR... - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com build: on-failure: ABORT commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG post_build: on-failure: ABORT commands: - echo Build completed on `date` - echo Pushing the Docker image... - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG # 추가한 부분. # 프로젝트 내 taskdef.json, appspec.yml 을 추가하고 build 단계 후 해당 파일들만을 # BuildArtifact 로 지정하여 S3 업로드 될 수 있도록 설정하였다. artifacts: files: - taskdef.json - appspec.yml
YAML
잘 된다.
Ref