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