-
Github Action으로 ecr 업로드 하기Infra/CI&CD 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월
'Infra > CI&CD' 카테고리의 다른 글
Jenkins CI/CD 구축 (With Docker + Github + Docker Hub) (4) 2024.08.14 EC2 배포를 위한 사전작업 (0) 2024.08.13 Github Action 기본 사용법 (0) 2024.05.16