본문 바로가기

Programming/오류 일지

[AWS Elastic Beanstalk, Github Actions] EC2 배포 자동화 설정 시 주의할 점

AWS EB, Github Actions를 통한 배포 자동화는 주로 향로님의 글을 보면서 설정했다.

 

처음 자동 배포를 시도하면서 미숙한 부분들, 놓친 부분들이 많아 다양한 오류 메시지를 봤다. 아래 정리한 글으로 다른 초심자 분들도 오류가 발생한 원인을 잡아내 해결할 수 있길 바란다.


 

  • 깃허브 환경 - 로컬 환경 비교하기


문제:

스프링부트 환경설정 파일인 application.yml, application-prod.yml 파일을 보안상 깃허브에 올리지 않았는데, 배포 시 이를 놓쳐 jwt 시크릿 키 값을 찾을 수 없다는 오류 메시지가 발생했다.


해결:

1. 깃허브 Settings - Secrets and Variables - Actions - New repository secret

이름 : APPLICATION / 내용 : application.yml 내용

=> 내용 작성 시 이스케이프 문자를 미작성해 오류가 발생하기도 했다. 내 경우에는 $ 문자 앞에 \를 추가해서 오류를 해결했다.

2. deploy.yml에 시크릿 값을 가진 설정파일을 생성하는 코드 작성

      - name: make application.yml
        run: |
          cd ./src/main/resources
          touch ./application.yml
          echo "${{ secrets.APPLICATION }}" > ./application.yml
        shell: bash



  • AdministratorAccess-AWSElasticBeanstalk 권한 추가 후 IAM 인증키 새로 발급받기


문제:

기존 사용자 권한에 AdministratorAccess-AWSElasticBeanstalk 정책을 추가하고 발급받았던 액세스키, 시크릿 액세스키를 위 사례와 같이 적용했는데 EB 접근 오류가 발생했다. 콘솔로만 새 권한을 추가했지만 기존에 다운로드된 파일에는 변경사항이 반영되지 않아 발생한 오류였다.


해결:

EB 접근용 계정을 새로 생성해 해당 정책을 추가하고 새로 액세스 키를 발급받았다.


  • 기존 깃허브액션 스크립트 파일(deploy.yml) 내부 형식이 deprecated 됨


문제:

레퍼런스대로 깃허브 액션을 설정했던 deploy.yml에서 deprecated 경고가 발생했다.

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 1.8
        uses: actions/setup-java@v1.4.3
        with:
          java-version: 1.8

     ...
     
      - name: Get current time
        uses: 1466587594/get-current-time@v2
        id: current-time
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"
          
      - name: Deploy to EB 
        uses: einaregilsson/beanstalk-deploy@v14
        with:
          ...
          version_label: github-action-${{steps.current-time.outputs.formattedTime}}

(출처)


해결:

각 항목 최근 버전을 확인하고 새로 권장되는 형식(배포 version_label)에 맞춰 작성하니 빌드에 성공했다.

    steps:
      - name: Checkout
        uses: actions/checkout@v3

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

     ...

     - name: Get current date
        id: version
        run: | 
          echo "builddate=$(date +'%Y-%m-%dT%H:%M:%S')" >> $GITHUB_OUTPUT

      - name: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v21
        with:
          ...
          version_label: github-action-${{ steps.version.outputs.builddate }}



  • nginx.conf 서버 포트 설정


문제:

EB에 맞춰서 스프링부트 포트 설정을 5000으로 맞췄었는데, 이 점을 잊고 깃허브액션을 설정하며 nginx.conf에 8080 포트로 설정했다.

  upstream springboot {
    server 127.0.0.1:8080;
    keepalive 1024;
  }



해결:

현재 설정된대로 5000 포트로 수정했다.

upstream springboot {
  server 127.0.0.1:5000;
  keepalive 1024;
}



  • 헬스 체크 설정 변경하기


문제:

실제 EB 상태는 ok인데 Github Actions에서 EB 상태 심각 오류 메시지가 계속 발생해 빌드를 실패했다.

Deployment failed: Error: Environment still has health Red 30 seconds after update finished!



해결:

EB 콘솔 확인 시 새로운 버전으로 잘 배포된 것을 확인할 수 있었다. 다만 롤링 업데이트하는 과정에서 시간이 지연돼 헬스 체크가 실패로 인식된 것 같았다. 그래서 대기 시간(EB 콘솔에선 명령 제한 시간)을 60초로 늘리고, nginx 설정 파일에서도 헬스체크 설정을 삭제해 헬스 체크로 인해 빌드 실패하는 일이 없도록 했다.

//deploy.yml

- name: Deploy to EB
  uses: einaregilsson/beanstalk-deploy@v21
  with:
  ...
    wait_for_environment_recovery: 60

 

//nginx.conf

# Include the Elastic Beanstalk generated locations
#include conf.d/elasticbeanstalk/healthd.conf;


+ 점점 EB 상태 회복 시간이 느려져 이 명령제한시간을 300으로 늘렸는데 이렇게 하는 게 맞는지 모르겠다... 한번 다른 분께 조언을 얻어봐야겠다.