본문 바로가기
CI&CD

ECR에 스프링부트 이미지 올리기(github action)

by e-pd 2023. 5. 7.

ECR(Elastic Container Registry)

- ECR은 아마존에서 관리하는 이미지 등록 및 관리 서비스입니다.

private 리파지터리 및 IAM 권한 기반으로 이미지를 관리할 수 있습니다.

https://docs.aws.amazon.com/ko_kr/AmazonECR/latest/userguide/what-is-ecr.html

 

Amazon Elastic Container Registry란 무엇입니까? - Amazon ECR

Amazon Elastic Container Registry란 무엇입니까? Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장 가능하고 신뢰할 수 있는 AWS 관리형 컨테이너 이미지 레지스트리 서비스입니다. Amazon ECR은 AWS IAM을

docs.aws.amazon.com

IAM 계정의 ECR 권한을 주어야합니다.

IAM계정 만든 과정은 링크로 생략합니다.

 

정책 추가에서 AmazonEC2ContainerRegistryFullAccess 권한을 추가합니다.

 

권한 생성후 이미지를 올릴

ECR에서 레파지터리를 생성해야합니다.

https://aws.amazon.com/ko/ecr/

 

완전관리형 컨테이너 레지스트리 – Amazon Elastic Container Registry - Amazon Web Services

 

aws.amazon.com

 

 

화면 우측의 리포지토리 생성을 클릭합니다.

공개 레파지터리와 비공개 레파지터리를 생성할 수 있습니다. 비공개로 사용할것이기때문에 private로 설정합니다. 

 

리포지터리에서는 이름을 지정합니다.

- 태그 변경 불가능 옵션은 이미지의 태그는 고유값을 사용할지 여부입니다. 

고유값을 사용한다면 예를 들어 태그에서 aaa를 입력했다면 다음에는 aaa 태그를 사용할 수 없습니다. 

같은 태그의 이미지가 중복으로 올라가는 것을 막는데 사용하고, 날짜로 태그를 관리할 때 유용하게 옵션을 활용할 수 있습니다.

 

- 푸쉬할 때 스캔: 이미지를 푸쉬하고 정상적인 이미지인지 검사하는 옵션입니다.

활성화하면 보안 취약점은 없는지 이미지를 검사합니다.

 

- KMS 암호화: 아마존에서 제공하는 암호화 기능으로 이미지를 암호화 처리할 수 있습니다.

 

리파지터리를 생성하고, 생성된 리파지터리에 들어가면 비어있는 저장소가 나옵니다.

상단의 푸쉬 명령 보기가 있는데 클릭해보면 이미지를 바로 업로드할 수 있는 명령어들이 나옵니다.

여기서 바로 명령어로 도커 이미지를 올릴 수 있지만 스프링부트와 github action을 통해 ECR 업로드 기능을 활용해보겠습니다.

 

팝업으로 나온 명령어(1,2,3,4)가 있는 데 여기서 2~4 명령어는 메모해둡니다.

아래 문장뒤의 명령어입니다.

- 다음 명령을 사용하여 도커 이미지를 빌드합니다. 도커 파일을 처음부터 새로 빌드하는 방법에 대한 자세한 내용은 여기  지침을 참조하십시오. 이미지를 이미 빌드한 경우에는 이 단계를 건너뛸 수 있습니다.

- 빌드가 완료되면 이미지에 태그를 지정하여 이 리포지토리에 푸시할 수 있습니다.

- 다음 명령을 실행하여 이 이미지를 새로 생성한 AWS 리포지토리로 푸시합니다.

 

GITHUB ACTION 설정

- GITHUB 리파지터리에 Secret를 설정합니다.

- 본인의 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 설정합니다.

 

Spring Boot  설정

build.gradle

jar {
    enabled = false
}

실행 JAR외의 소스코드로 생성된 JAR 파일 생성을 막습니다.

 

루트 폴더에 Dockerfile을 생성합니다. Java는 17버젼을 사용했습니다.

FROM openjdk:17-alpine AS builder
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

프로젝트 루트에 .github 폴더를 생성합니다.

.github내부에 workflows 폴더를 생성합니다. 

 

deploy.yml파일을 생성합니다. 파일명은 상관없고, workflows 폴더내 yml 파일이 있으면 github action이 작동합니다.

다음 내용이 들어갑니다. 메인 브랜치에 pull request를 생성하면 작동하는 github-action입니다.

name: Java CI with Gradle

on:
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    ## checkout후 자바 17 버전으로 설정을 합니다
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      ## gradlew 의 권한을 줍니다.
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
       
      ## gradle build
      - name: Build with Gradle
        run: ./gradlew clean build --debug
     ## 이미지 태그에 시간 설정을 하기위해서 현재 시간을 가져옵니다. 
      - name: Get current time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - name: Show Current Time
        run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
      ## AWS에 로그인합니다. aws-region은 서울로 설정(ap-northeast-2)했습니다
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2
      ## ECR에 로그인합니다
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1
      ## sample라는 ECR 리파지터리에 현재 시간 태그를 생성하고, 푸쉬합니다. xxx부분은 본인의 레파지터리 주소입니다.
      ## 앞의 스탭에서 ${{steps.current-time.outputs.formattedTime}}로 현재 시간을 가져옵니다.
      - name: Build, tag, and push image to Amazon ECR
        run: |
          docker build -t sample:${{steps.current-time.outputs.formattedTime}} .
          docker tag sample:${{steps.current-time.outputs.formattedTime}} xxx.ecr.ap-northeast-2.amazonaws.com/sample:${{steps.current-time.outputs.formattedTime}}
          docker push xxx.dkr.ecr.ap-northeast-2.amazonaws.com/sample:${{steps.current-time.outputs.formattedTime}}

제일 하단 ECR 푸쉬 부분은 위에서 메모한 도커 명령어 2~4번을 붙여넣고 태그 부분을

${{steps.current-time.outputs.formattedTime}}로 수정합니다. 태그에 날짜로 관리하기 위함이고, 별도의 설정을 하지않으면

도커에서는 태그를 따로 설정하지 않으면 default로 latest가 태그로 붙습니다.

깃헙 액션이 완료되면 ECR에 이미지가 올라갑니다.

 

'CI&CD' 카테고리의 다른 글

Github actions를 이용한 CICD - 2  (7) 2021.08.10
Github actions를 이용한 CICD - 1  (1) 2021.08.10
Docker 컨테이너 만들어보기  (0) 2020.11.24