CodeBuild는 Build 과정에서 codecommit, s3, log 등의 작업을 수행하는데 이러한 서비스들에 대한 권한을 필요로한다. 이 권한은 IAM 역할을 위임받아 수행되는데 이때 CodeBuild IAM은 build project 생성 과정에서
① 역할을 새로 생성하거나,
② 사전에 만들어 둔 역할을 사용할 수 있다.
역할을 새로 생성한다는 가정하에 부여되는 권한은 다음과 같다.
<새로 생성된 서비스 역할에 부여되는 권한>
- logs: CloudWatch logs 그룹 생성 및 로깅
- s3: 지정된 버킷 내 객체에 대한 PutObject
- codecommmit: git pull
새로 생성된 서비스 역할에는 ECR 접근에 대한 권한이 부여되어있지 않다.
따라서 "CodeBuild로 docker image를 생성 -> 이를 ECR (AWS에서 제공하는 container image 저장소)에 저장"할 때 권한 오류가 발생한다.
- ecr:GetAuthorizationToken 오류
Running command aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:sts::<ACCOUNT_ID>:assumed-role/<SERVICE_ROLE_NAME>/AWSCodeBuild-62ff761b-053a-59pf-85ca-42abcfac8258 is not authorized to perform: ecr:GetAuthorizationToken on resource: * because no identity-based policy allows the ecr:GetAuthorizationToken action
Error: Cannot perform an interactive login from a non TTY device
위의 인증 오류 뿐 아니라 image를 ECR에 업로드하기 위해서는 다음과 같은 권한이 추가된 IAM 정책을 서비스 역할에 연결해야 한다.
{
"Version": "2012-10-17",
...
"Statement": [
{
"Sid": "ECRUpload",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetAuthorizationToken",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
"Resource": "*",
"Effect": "Allow"
},
...
]
}
- ecr:BatchCheckLayerAvailability: 이미지가 리포지토리에 푸시되었을 때 각 이미지 레이어가 이전에 업로드되었는지 확인
- ecr:CompleteLayerUpload: 이미지가 푸시되면 ECR에 업로드가 완료되었는지 확인
- ecr:GetAuthorizationToken: IAM 인증 자격증명 용
- ecr:InitiateLayerUpload: 이미지 레이어 업로드 예정을 ECR에 알림
- ecr:PutImage: 이미지 manifest, 이미지 태그 생성/업데이트
- ecr:UploadLayerPart: ECR에 이미지 레이어 부분적 업로드
[참조]
https://docs.aws.amazon.com/AmazonECR/latest/APIReference/API_PutRegistryPolicy.html
https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/sample-docker.html
'AWS' 카테고리의 다른 글
[AWS/CloudFront] CloudFront로 S3 컨텐츠 제공하기 - ② CloudFront 대체 도메인 구성 (1) | 2022.03.24 |
---|---|
[AWS/CloudFront] CloudFront로 S3 컨텐츠 제공하기 - ① CloudFront 구성 및 동작 확인 (0) | 2022.03.23 |
[AWS/ECS] ECS 클러스터 구성 및 컨테이너 서비스하기 (0) | 2022.03.09 |
[AWS] API GateWay로 Lambda를 호출하여 S3의 파일을 SFTP 서버로 데이터 전송하기 (lambda import) (0) | 2022.03.03 |
[AWS] Route53, ELB로 EC2의 웹 서비스 하기 (0) | 2022.01.19 |
댓글