Infra/CI&CD
Github Action으로 ecr 업로드 하기
now0204
2024. 5. 16. 23:39
ECR이란?
AWS에서 제공하는 관리형 컨테이너 이미지 레지스트리 서비스 AWS IAM을 사용하여 리소스 기반 권한을 가진 프라이빗 리포지토리 지원 지정된 사용자 혹은 EC2 인스턴스가 컨테이너 리포지토리 및 이미지에 엑세스 가능하다. |
- Docker hub와 같이 이미지를 저장할 수 있는 저장소와 같은 개념이다.
- GithubAction과 같이 사용하면, 워크플로우의 결과로 docker Image를 생성하고, ECR에 간단하게 업로드 할 수 있다.
ECR 생성
- 아마존에서 Elastic Container Registry검색해서 시작하자
- Repository를 하나 만들어보자!
- 다음으로 IAM으로 넘어가서 User와 Policy를 생성하자
- 정책 생성을 눌러서 새로운 정책을 생성하자
- 여기서 정책은 ECR에 접근하고, 이미지를 업로드, 다운로드 할 수 있는 권한들을 의미한다.
- 이름은 원하는 이름으로 적고, 다음으로 JSON을 선택하고 다음과 같이 작성한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:PutImage"
],
"Resource": "*"
}
]
}
- ecr과 관련된 policy이다. Resource에는 repository를 지정할 수 있다.
- 정책을 생성했다면, User를 생성하던, 특정 User에 해당 정책을 연결해주자
- 위에 만든 정책을 연결하는 부분이다. 기타로 선택해서 연결하자
- 다음은 워크플로우에 github secrets으로 등록할 secret값을 생성하자
- User에 보안 자격 증명 탭에서 쫌 내려가면 찾을 수 있다!
- 생성한 secret값은 해당 값을 사용할 git hub repository에서 설정두자
- value는 아까 받아 온 secret값이지만, 이름은 알아서 잘 지정!
워크플로우 작성
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
name: CI on ECR
jobs:
deploy:
name: Deploy
runs-on: ubuntu-22.04
############################################################################
steps:
- name: Checkout
uses: actions/checkout@v3
#AWS에 접근 인증 받는 부분
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
# IAM에서 받아온 값
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
#region에 조심하자 !
aws-region: ap-northeast-2
################################################################################
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push the image to Amazon ECR
run: |
# Get current UTC time as image tag - > 이미지 태그 생성용 변수
IMAGE_TAG=$(date -u +"%Y%m%dT%H%M%SZ")
echo "IMAGE_TAG=${IMAGE_TAG}" >> $GITHUB_ENV
# Build a Docker container and push it to ECR
# secrets값으로 지정한 repo에 이미지 업로드
# 스탭중에 login-ecr에서 나온 output.registry -> 도커 이미지 명 레지스트리주소/프로젝트명/이미지명:이미지태그
docker build -t ${{ steps.login-ecr.outputs.registry }}/${{ secrets.REPO_NAME }}:$IMAGE_TAG .
echo "Pushing image to ECR..."
docker push ${{ steps.login-ecr.outputs.registry }}/${{ secrets.REPO_NAME }}:$IMAGE_TAG
echo "::set-output name=image::${{ steps.login-ecr.outputs.registry }}/${{ secrets.REPO_NAME }}:$IMAGE_TAG"
env:
AWS_DEFAULT_REGION: ap-northeast-2
AWS_REGION: ap-northeast-2
- 결과로 만들어진 도커 이미지는 보통
- docker.io/jangwon/myImage:2.1.0-alpine와 같은 이미지를 가지는데,
- 레지스트리주소(저장소)/프로젝트명(폴더)/이미지명:태그이다.
참고자료
원티드 프리온보딩 백엔드 챌린지 4월