ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 보조 계정으로 ECR에서 Push / Pull 하기
    인프라/aws 2024. 4. 10. 00:27

     

    ECR에 권한을 부여하는 페이지가 2종류가 있습니다. 다음 번에는 여기서 헤매지 않기 위해 글로 남깁니다.

    글을 진행하기에 앞서서, ECR repository를 가지고 있는 계정을 main 계정이라고 부르고, push/pull을 하려는 계정을 sub 계정이라고 정리하고 시작하겠습니다.


    아래의 글은 다음의 순서로 진행됩니다.

    1. Push를 하려는 서비스에서 사용하는 권한 확인하기

    2. Repository를 가지고 있는 계정에서 권한을 부여하기

    3. Push를 하는 측 권한 수정하기

    4. 확인하기

     

     

    1.  Push를 하려는 서비스에서 사용하는 권한 확인하기

    sub계정의 CodePipeline에서 CodeBuild stage가 ECR에 접근해야하는 상황입니다.

    따라서 현재 CodeBuild에 적용되어있는 Role을 찾아줍니다.

    (CodeBuild의 수정하기 화면의 가장 하단에서 확인이 가능합니다.)

     

     

    이 Role 이름을 가지고 sub계정의 IAM 화면에서 해당 Role의 ARN을 찾아줍니다.

    이 ARN을 main 계정에서 가져다 사용할 것이기 때문에 잘 챙겨둡니다.

     

     

     

    2. Repository를 가지고 있는 계정에서 권한을 부여하기

    1번에서 어떤 서비스에서 ECR을 사용하려고하는지 확인하였습니다. main 계정에서 sub계정의 특정 role이 접근하는 것을 허가해주어야합니다. Repositories >  Repository 선택 > Permission > Edit policy JSON  순서로 찾아갑니다.

     

     

    권한은 공식문서에 적혀있는 것에서 AWS 항목만 변경해서 넣어주면 됩니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "AllowPushPull",
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::<account_id>:role/service-role/codebuild-byPipeline-build-service-role"
          },
          "Action": [
            "ecr:BatchCheckLayerAvailability",
            "ecr:BatchGetImage",
            "ecr:CompleteLayerUpload",
            "ecr:GetDownloadUrlForLayer",
            "ecr:InitiateLayerUpload",
            "ecr:PutImage",
            "ecr:UploadLayerPart"
          ]
        }

     

     

     

    3. Push를 하는 측 권한 수정하기

    하지만 이것만으로 해결될 것이라고 기대하지 않았습니다.. ㅋㅋㅋ

    코드 빌드를 다시 실행시키니 다음과 같은 에러 메세지를 전해줍니다.

    위에 분명히 InitiateLayerUpload 권한을 추가하였지만 해당 권한을 이야기하면서 되지 않습니다.

     

     

    마지막으로 sub계정에서 main계정에 push/pull을 할 수 있는 permission을 추가해주어야합니다.

     

    위 버튼을 누르면 JSON 형태로 권한을 추가하는 editor가 보입니다.

     

    아래와 같은 내용을 추가해줍니다.

    {
    	"Version": "2012-10-17",
    	"Statement": [
    		{
    			"Effect": "Allow",
    			"Action": [
    				"ecr:GetDownloadUrlForLayer",
    				"ecr:BatchGetImage",
    				"ecr:BatchCheckLayerAvailability",
    				"ecr:PutImage",
    				"ecr:InitiateLayerUpload",
    				"ecr:UploadLayerPart",
    				"ecr:CompleteLayerUpload"
    			],
    			"Resource": "arn:aws:ecr:ap-northeast-2:<main 계정 account_id>:repository/<repo_이름>"
    		}
    	]
    }

     

     

    4. 확인하기

    CodePipeline에서 Build Stage가 성공하는 것을 확인할 수 있습니다.

     

     

    그리고 main 계정의 ECR에 새로운 이미지가 생성된 것도 확인할 수 있습니다.

     

     

     

    감사합니다.

     


    [참고]

    https://repost.aws/ko/knowledge-center/secondary-account-access-ecr

     

     

     

Designed by Tistory.