젠킨스와 CodeDeploy를 이용해 S3까지는 배포 파일을 올바르게 전달했지만, S3에서 인스턴스로 배포 파일이 제대로 전달되지 않았다.
The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems.
너무 많은 개별 인스턴스가 배포에 실패했거나 배포에 사용할 수 있는 정상 인스턴스가 너무 적거나 배포 그룹의 일부 인스턴스에 문제가 발생하여 전체 배포에 실패했습니다.
Ubuntu에 설치해둔 CodeDeploy Agent의 로그를 확인해보았다. 로그는 /var/log/aws/codedeploy-agent/codedeploy-agent.log
에서 확인할 수 있다.
Missing credentials - please check if this instance was started with an IAM instance profile
에러는 위와 같았다.
문제의 원인은 EC2 인스턴스에 적절한 권한이 설정되어있지 않았기 때문이었다.
EC2에 S3에 저장된 배포 파일을 전송하기 위해서는 CodeDeployInstanceRole
이라는 권한이 필요한데, 나의 경우에는 오토 스케일링을 하기 위한 launch template
에 IAM 권한 등록을 설정해놓지 않았기 때문에 권한이 없었던 것이다.
참고로 CodeDeployInstanceRole
가 제공하는 권한은 다음과 같다.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:ListObjects"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
즉, S3에서 객체를 가져오는 권한이 없었기 때문에 발생한 에러이다.
launch template 생성
→ 고급 세부 정보
→ IAM 인스턴스 프로파일
에서 CodeDeployInstanceRole
이 포함된 권한을 설정해준다.