AWS ECS + CodePipeline(CodeDeploy) 트러블슈팅
2020년 04월 15일 작성TL;DR
The provided role does not have sufficient permissions to access CodeDeploy
- ECS Fargate 로 CodeDeploy 를 쓸때 권한이 없다고 하면
taskdef.json
,appspec.yaml
,imageDetail.json
이 정상적인 값으로 생성되었는지 먼저 확인해보자. - CDK 밖에서 만든 CodeDeploy DeploymentGroup 의 세팅이 CDK 의 설정과 일치하는지 확인해보자. (특히 배포방식에서 DeploymentType)
시작하며
요새 대략 위와 같은 작업을 CDK 를 이용해서 구성하고 있는데 삽질을 많이 하게 된다.
관련된 내용은 시간이 나면 정리하고, 오늘은 삽질을 많이 했던 부분만 공유해본다.
위의 구성을 만들때 다른건 다 쉬웠는데, 아래의 2개가 대부분의 시간을 잡아먹었다.
- CodePipline 의 CodeDeploy 스테이지에서 ECS 로 디플로이 할 때,
The provided role does not have sufficient permissions to access CodeDeploy
가 나오는 문제 - API Gateway 에서 ALB 로 Proxy 연결시
Internal Server Error
가 나오는 문제 (ALB 로 접근하면 문제가 없이 잘 출력되고, 클라우드 워치에도 제대로 된 로그가 안나옴)
이 글에서는 1번만 간단하게 설명한다.
문제상황
위의 문제가 발생하는 2개의 경우가 있는데,
- CodeDeploy ECS 로 배포할때 ECSAllAtOnce 가 아니라 Canary 옵션으로 배포하는 경우
- Docker 이미지를 빌드하고 결과를 아티팩트로 전달하는데 이 때, 이미지 주소가 잘못된 경우
Canary 배포시 에러
사실 이건 Canary 배포시 문제가 아니었다.
DeploymentGroup 는 생성시 수동으로 생성해줘야하는데 이때 DeploymentType 옵션을 CDK 와 다르게 주면 권한이 없다는 에러가 나온다.
따라서 CDK 에서 카나리로 설정해뒀으면 카나리로, 일시배포면 일시배포로 옵션을 동일하게 맞춰주면 해결할 수 있다.
이미지 주소가 잘못된 경우
CodeDeploy 는 빌드 과정에서 taskdef.json 에 있는 placeholder(여기서는
따라서 prototyping.aws.com/myapp:14
를 빌드했다고 하면 해당 이미지를 여기1 에 나온대로 imageDetail.json
파일로 저장해서 containerImageInputs
파라미터로 전달해줘야 한다.
const devDeployStage = pipeline.addStage({ stageName: 'DevDeploy' });
devDeployStage.addAction(new cpactions.CodeDeployEcsDeployAction({
actionName: `DevDeploy`,
deploymentGroup,
taskDefinitionTemplateFile: codepipeline.ArtifactPath.artifactPath(output.artifactName!, 'taskdef.json'),
appSpecTemplateFile: codepipeline.ArtifactPath.artifactPath(output.artifactName!, 'appspec.yaml'),
containerImageInputs: [
{
input: output,
taskDefinitionPlaceholder: 'IMAGE'
},
],
}));
위의 코드에서 output
artifact 는 taskdef.json, appspec.yaml, 그리고 imageDetail.json 이 루트위치에 들어있다.
appspec.yaml 의 기본값 확장자는 yml 이 아니라 yaml 이다. 참고하자.
이 때 imageDetail.json 안에 들어가는 이미지주소가 존재하지 않는 주소이면, 예를 들어 tag 가 14
가 아니라 latest
라던가, The provided role does not have sufficient permissions to access CodeDeploy 코드파이프라인 상에서 이런 에러가 발생한다.
해결방법
대부분 템플릿 설정파일을 만들어두고, sed 등을 써서 PLACEHOLDER 를 replace 하는 식으로 설정파일들을 완성하게 될텐데, 이 과정에서 문제가 생기는 경우가 많다.
output 아티팩트를 작성할때 위의 3개 파일값을 echo 로 찍어주고 값이 제대로 들어가있는지 확인해보자.
마치며
구현이 급하면 매뉴얼을 잘 안읽게 되는데, 프레임워크 등을 다룰 때는 try & error 방식이 더 오래걸리는 경우가 많다. 급할수록 마음을 좀 가다듬고 매뉴얼을 잘 읽어보자.