본문 바로가기
AWS

ECR 스프링 부트 GitHub Action 설정하기

by DarrenH 2023. 8. 20.
반응형

Ekastic Container Registry 를 사용해보려고 한다. 

 

컨터이너 기술을 점점 많이쓰이며 배포가 엄청 간단해지고 있다. 그래서 나도 이번에는 깃허브를 이용해서 AWS에서 제공해주는 컨테이너 이미지 저장을 통해 Github Action CI를 구축해보려고한다. 

 

ECR은 AWS에서 제공하는 도커 컨테이너 이미지를 저장할 수 있는 완전관리형 도커 컨테이너 레지스트리 서비스이다.

완전 기계처럼 말했는데, 맞다 지피티가 말해준 것이다. 

그냥 우리가 도커 레포지토리에 올리면 되는데 왜 AWS꺼를 써야하지? 이런 생각을 했다. 

 

그이유는 간단하다. 그냥 도커도 쓰기 간단한데 ECR을 쓰면 간단한건 똑같지만, 우리가 AWS에 몇몇 서비스를 이용하고 있다고 하자, EKS등과 같이 이럴 경우 AWS 리전 안에 S3에 저장이되는데 가용성과 내구성이 뛰어나게 된다. 그리고 AWS에서 완전관리해주기 때문에 AWS와 같이 쓸 경우 통합이 쉽다!! 

 

먼저 AWS로 들어가서 ECR을 검색해 들어간다. 

 

나는 private로 이미지를 만들것이기 때문에 Create Repository를 눌러준다. 

 

3가지 옵션을 선택할 수 있는데, 

1. 태그 변경 불가능

2. 이미지를 push할 때 정상적인 이미지인지 검사

3. KMS 암호화

 

나는 2번만 체크하고 만들었다. 

 

그럼 팝업으로 명령어가 나오는 걸 볼 수 있는데, 

2,3,4번을 미리 메모장에 저장해 놓자

 

Docker를 아는 사람이라면 익숙한 명령어일 것이다.

 

그럼 이제 Github Action을 사용하러 가보자

 

적용시킬 깃허브 레포지토리로 이동한다. 

레포지토리 설정탭에 시큐리티 탭으로 가면 Actions 을 클릭해준다. 

 

New repository secret버튼을 눌러 

아래 처럼 계정을 등록해준다. 이 계정은 자신이 사용할 AWS IAM계정 정보이다. 

추가로 지금 적용하는 AWS 계정에 ECR 정책을 추가해줘야한다. !!

 

build.gradle 파일에 다음 코드를 추가한다. 

jar {
    enabled = false
}

실행 Jar외의 소스코드로 생성된 JAR 생성을 막는데 Exten~~ 라는 jar의 생성을 막을 것이다. 

 

다음은 스프링 프로젝트의 루트 경로에 Dockerfile을 만들어준다. 

FROM openjdk:11
ARG JAR_FILE=./build/libs/*.jar
VOLUME /볼륨 이름
COPY ${JAR_FILE} test.jar
ENTRYPOINT ["java","-jar","/test.jar"]

 이제 깃허브로 돌아가서 Actions 탭을 눌러준다. 

Docker image를 눌러준다.

 

name: Docker Image Suite-User CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        
      - name: Build with Gradle
        run: ./gradlew clean build -x test

      - name: Get current time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - 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: us-east-2 ## 자신의 리전

      - name: Login to ECR
        uses: aws-actions/amazon-ecr-login@v1
        
		## sample라는 ECR 리파지터리에 현재 시간 태그를 생성하고, 푸쉬합니다. xxx부분은 본인의 레파지터리 주소입니다.
      - name: Build & Push to 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}}

Build & Push to ECR 부분에 run에 아까 메모장에 붙인 2, 3, 4를 붙여주는데 태그명을 현재 시간으로 붙여줬다. 

여러번 시도하면 태그가 중복될 수 있기 때문이다. 

 

그리고 main 브랜치에 push나 pull request가 발생하면 해당 yml 파일이 실행될 것이다. 

실행 과정을 이렇게 실시간으로 볼 수 도있고 어디서 에러가 났는지도 확인이 가능하다.

 

실제 ecr에 올라간 것도 확인 할 수 있다. 

 

 

참고 자료

https://itcoin.tistory.com/730

반응형

'AWS' 카테고리의 다른 글

AWS VPC 설정  (0) 2023.07.10
AWS - IAM이란(1)  (0) 2023.07.05