본문 바로가기
Study/기타

springboot 프로젝트 AWS 프리티어로 배포하기(1) github actions, aws s3 연동

by 나아가는 2024. 1. 17.
반응형

최종 목표 : CI/CD 구축해서 메인브렌치에 커밋하면 자동 배포되도록 설정하기

CI / CD란?

CI (Continuous Integration- 지속적 통합)

코드 버전 관리를 하는 VCS 시스템(Git, SVN 등)에 PUSH 되면 자동으로 테스트와 빌드가 수행되어 안정적인 배포파일을 만드는 과정

CD (Continuous Deployment - 지속적인 패보)

빌드 결과를 자동으로 운영서버에 무중단 배포까지 진행되는 과정

CI / CD 의 필요성

CI 가 없을 경우: 여러명의 개발자가 동시에 작업을 할 경우 각자가 원격 저장소로 푸시될 때 마다 코드를 병합하고, 테스트 코드와 빌드가 수행되는지 수동으로 체크해야한다.

 

CD 가 없을 경우: 역시 한두대의 서버에 개발자가 수동으로 배포를 할 수 있지만, 여러대의 서버에 배포를 해야하거나 긴박하게 당장 배포를 해야하는 상황이 오면 수동으로 배포할 수가 없다.

 

-> 이 과정을 자동화 함으로써 개발자들이 개발에만 집중하고 안정적인 서비스 운영이 가능하게 되었다.

CI 연결하기

GitHub Actions

  • GitHub 에서 제공하는 서비스로 빌드,테스트,배포 파이프라인을 자동화 할 수있는 CI/CD 플랫폼이다
  • YAML포맷을 사용해서 가독성이 높다

YAML(야믈)

  • .yml 파일 확장자
  • json에서 괄호를 제거한 것

github secret 설정

application.properties 파일은 보안정보가 저장되어 있기 때문에 github 저장소에 올리지 않는다.

하지만 프로젝트를 테스트하고 배포할 경우에는 해당 정보가 있어야 하므로 github에서 제공하는 secret 를 이용해서 별도로 저장한다.

github repository > settings> secrets and variables>actions>new repository secret

 

AWS S3 연동하기

S3란?

  • AWS 에서 제공하는 파일 서버
  • 이미지 파일을 비롯한 정적 파일들을 관리하거나 배포파일들을 관리하는 등의 기능을 지원
  • 보통 이미지 업로드를 구현한다면 S3를 이용하는 경우가 많음
 💡 도커컨테이너 레지스트리에는 docker hub, AWS ECR 등 이 있다.
docker hub는 무료로 사용할 수 있지만, 배포된 이미지가 공개되기 때문에 누구나 다운받을 수 있는 단점이 있다.

 

AWS Key 발급

IAM

일반적으로 AWS 서비스에 외부 서비스가 접근할 수 없다. 그래서 접근권한을 가진 key를 생성해서 사용해야한다.

aws에서는 인증과 관련된 기능을 하는 IAM(identity and Access Menagement) 서비스를 제공한다.

  1. iam 검색
  2. 사용자 생성
  3. 액세스 키 저장

github secret 에 엑세스 키 등록

Github repository → Settings → Secrets → Actions 에 등록

 

Github actions 생성 (java with gradle)

github repository > Actions>New workflow > Java with Gradle
  • main 브랜지에 push 되거나 pull_request가 생성되었을 때 동작한다.
  • application properties 파일을 생성한다.
  • gradlew 실행권한을 주고 빌드한다.
  • code deploy는 Jar 파일은 인식하지 못하므로 압축 파일을 생성한다.
  • 압축 파일을 S3에 복사한다.
  • S3 버킷에 파일이 업로드 되었는지 확인한다.
name: Java CI with Gradle

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

permissions:
  contents: read

jobs:
  build:
    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'
              
    - run: mkdir ./src/main/resources
    - run: touch ./src/main/resources/application.properties
    - run: echo "${{ secrets.APPLICATION }}" > ./src/main/resources/application.properties
    - run: cat ./src/main/resources/application.properties
    
    - name: Run chmod to make gradlew executable
      run: chmod +x ./gradlew
    - name: Build with Gradle
      uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
      with:
        arguments: build

    - name: Before deploy
      run: |
        mkdir -p deploy
        cp ./build/libs/*.jar ./deploy
        zip -r ./springboot-githubactions.zip ./deploy
        
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
        aws-region: ap-northeast-2
    
    - name: Upload to S3
      run: aws s3 cp ./springboot-githubactions.zip s3://memore-springboot-build

 

참고

https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-encrypted-secrets-for-a-repository

 

Using secrets in GitHub Actions - GitHub Docs

Secrets allow you to store sensitive information in your organization, repository, or repository environments.

docs.github.com

 

반응형