들어가기 전에
이번 포스팅에서는 ECR(Elastic Container Registry)의 리포지토리 신규 생성 및 Elastic Container Repository에 Pull, Push, GetAuthorizationToken 권한을 주는 방법에 대해 알아보도록 하겠습니다.
이번 포스팅은 하기 포스팅의 다음 순서입니다. 기존 포스팅을 보시지 않았다면 먼저 보고 오시는 것을 추천드립니다.
이전 포스팅
다음 포스팅
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 이미지 Docker로 배포하기(3) - EB 기본 세팅(RDS 포함)
- [AWS, Github Action] Elastic Beanstalk에 SpringBoot 이미지 Docker로 배포하기(4) - Github Action과 Dockerfile을 작성해서 배포하기
AWS ECR(Elastic Container Registry)에 repository 생성하기
먼저 AWS Console에서 ECR을 검색하여 리포지토리(Elastic Container Registry 기능)를 클릭합니다. 그 후 리포지토리 생성을 클릭하여 아래와 같이 리포지토리를 생성합니다.
- 지정된 IAM 사용자만 ECR 리포지토리에 접근할 수 있도록 프라이빗 리포지토리를 생성합니다.
- 현재 생성하는 리포지토리는 프라이빗 리포지토리이기 때문에 따로 암호화 설정은 진행하지 않았습니다.
생성한 ECR 리포지토리에 권한 설정하기
앞서 생성한 ECR 리포지토리를 클릭하여 왼쪽 Permissions 탭을 클릭합니다.
- 위 사진을 보면, 필자의 경우 이미 Permissions들이 정의되어 있지만, 신규로 만들었다면 아무런 권한이 없어야 정상입니다.
Permissions 탭에 접근한 뒤 정책 JSON 편집
을 클릭하여 하기와 같이 작성해줍니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetAuthorizationToken",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{AWS_ACCOUNT_ID}:user/{권한을 주고자 하는 IAM명}"
},
"Action": "ecr:GetAuthorizationToken"
},
{
"Sid": "AllowPushAndPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{AWS_ACCOUNT_ID}:user/{권한을 주고자 하는 IAM명}"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
]
}
]
}
위 정책 내용에 대해 간단히 설명해보면 아래와 같습니다.
GetAuthorizationToken
- Github Action을 통해 Docker 명령어를 사용하기 위해서는 GetAuthorizationToken permissions을 설정해주어야 합니다. 이를 위해 인증받은 사용자의 accessKey와 secretKey로 접근하기 위해 필요한 사용자들에 대해 권한을 부여합니다. 필자의 경우, Elastic Beanstalk에 사용하는 IAM 계정을 통해 Image를 Push/Pull할 것이기 때문에 해당 IAM에 대해 권한을 부여했습니다.
AllowPushAndPull
- 이미지를 ECR 리포지토리에 업로드할 수 있는 권한 및 ECR 리포지토리에 있는 이미지를 땡겨올 수 있도록 권한을 주는 것입니다. 필자의 경우, Elastic Beanstalk에서 사용하는 IAM 계정만을 이용해 ECR Image를 Push & Pull하기 때문에 해당 계정에 대해서만 권한을 허용하였습니다.
Principal을 보면, AllowPushAndPull
과 달리 GetAuthorizationToken
의 경우, 리스트 형식임을 확인할 수 있습니다. 이는 예시를 위해 리스트로 작성한 것이며, 들어가야 할 IAM 계정이 1개라면 리스트로 작성하지 않아도 됩니다.
만약, ECR에 Pull만 할 수 있는 권한을 특정 IAM 계정에 대해 주고 싶다면, 하기 내용의 "Statement"
부분을 함께 사용할 수 있습니다. 필자의 경우, Push와 Pull을 모두 동일한 계정에 권한을 주고 있어 따로 사용하지 않았습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::{AWS_ACCOUNT_ID}:user/{권한을 주고자 하는 IAM명}"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
AllowPull
- ECR 리포지토리를 통해 이미지를 땡겨올 수 있도록 권한을 주는 것입니다. 필자의 경우, Elastic Beanstalk에 이미지를 땡겨올 것이라, Elastic Beanstalk에 사용하는 IAM 계정에 대해 권한을 부여했습니다.
생성한 ECR 리포지토리에 대한 IAM Policy 생성하기
Github Action을 통해 ECR 리포지토리에 이미지를 업로드하고, 해당 이미지를 Pull해서 Elastic Beanstalk에 배포를 할 것이기 때문에 기존 Elastic Beanstalk용 IAM 사용자에 대해 ECR 레포지토리 관련 권한을 추가해보고자 합니다. 이를 위해 ECR 접근 용 정책을 생성한 뒤 기존에 만든 IAM 사용자의 권한에 해당 Policy를 추가해보겠습니다.
ECR 접근 용 IAM 정책(Policy) 생성하기
먼저 하기와 같이 IAM 정책(Policy)에 접근하여 정책 생성을 클릭합니다.
정책 생성 시, 하기와 같이 서비스(Service)에는 Elastic Container Registry
를 선택하고, 액션(Action)으로는 All Elastic Container Registry actions (ecr:\*)
을 선택합니다.
그 후, 리소스는 특정 리소스를 선택하고, ARN 추가를 하기와 같이 진행합니다.
- 이때, 본인이 사용하는 리전을 Region에 넣어주고, 기본적으로 뜨는 Account을 넣어준 뒤, Repository name에는 *를 넣어 모든 레포지토리에 대해 사용할 수 있도록 작성합니다.
이렇게 ARN 추가까지 완료되면 하기와 같이 정책 생성이 가능합니다.
기존 IAM 계정 권한에 ECR 접근 용 IAM 정책(Policy) 추가하기
위에서 생성한 정책을 기존에 Elastic Beanstalk용으로 만든 IAM 계정에 연결하여 ECR에 이미지를 저장할 수 있도록 설정해보겠습니다.
- 먼저 Elastic Beanstalk용으로 만든 IAM 계정을 클릭하여 권한 추가를 누릅니다.
- 그 후 기존 정책 직접 연결을 클릭하여, 생성한 ECR_FullAccess 권한을 연결해줍니다.
위 과정까지 완료되면, 이제 Elastic Beanstalk 환경을 구성하여 ECR과 Elastic Beanstalk을 이용해 Github Action으로 배포가 가능합니다.