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월

https://www.wanted.co.kr/

 

원티드 - 일하는 사람들의 모든 가능성

이력서, 채용 공고, 연봉 정보는 물론 프리랜서 프로젝트까지! 신입 취업 및 경력직 이직, 커리어 성장에 필요한 모든 것을 만나보세요.

www.wanted.co.kr