본문 바로가기
AWS

[CodeBuild] ECR 업로드시 CodeBuild Role 권한 오류

by 삼콩 2022. 2. 8.

CodeBuild는 Build 과정에서 codecommit, s3, log 등의 작업을 수행하는데 이러한 서비스들에 대한 권한을 필요로한다. 이 권한은 IAM 역할을 위임받아 수행되는데 이때 CodeBuild IAM은 build project 생성 과정에서

① 역할을 새로 생성하거나,

② 사전에 만들어 둔 역할을 사용할 수 있다

 

역할을 새로 생성한다는 가정하에 부여되는 권한은 다음과 같다.

 

<새로 생성된 서비스 역할에 부여되는 권한>

  • logs: CloudWatch logs 그룹 생성 및 로깅
  • s3: 지정된 버킷 내 객체에 대한 PutObject
  • codecommmit: git pull

CodeBuild project 생성 일부, 해당 부분에서 서비스 역할을 결정함

 

새로 생성된 서비스 역할에는 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

댓글