카테고리 없음

AWS Elastic Beanstalk - (4)

알면 알 수록 재밌다! 2023. 2. 17. 06:48

EB를 github action을 통해 배포하기

 

아래 두개 링크 참조했음

https://earth-95.tistory.com/124

https://velog.io/@rudwnd33/zero-downtime-deployment

 


길이가 길어서 2개로 나눠서 해설하겠다.

 

name: Deploy to Elastic Beanstalk 

시작할 워크플로우의 이름을 말한다

 

on:
    push:
        branches:
            - main

on아래 트리거를 걸 수 있는데, push 할 때 워크플로우가 작동한다는 것이고

branches는 main 브런치라고 정했다.

 

jobs:
    deploy:
        runs-on: ubuntu-latest

jobs는 시작할 워크플로우의 잡을 말한다.

잡은 배포이며, 

ubuntu 최신버전의 가상환경에서 돌아갈 예정이라는 거다.

 

steps:
    - name: Checkout code
        uses: actions/checkout@v2
    - name: Setting .env file
        run: |
            echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> .env
            echo "SECRET_KEY=${{ secrets.SECRET_KEY }}" >> .env
            cat .env
    - 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

steps는 단계대로 수행한다는것이다.

코드를 체크하는 actions/checkout@v2를 사용하겠다는 것이고 이것들도 결국 남이 작성해놓은걸 가져다가 쓰는 개념이다.

 

.env 이 파일을 만드는데, gitignore로 가려놔서 github에서 파일을 인식할 수 없기 때문에 배포단계에서는 만들어줘야한다. 그래서 .env 파일을 만드는 단계를 추가했다.

 

aws-actions/configure-aws-credentials@v1는 aws configure를 등록한다는 것이다.



   - name: Login to Amazon ECR
     id: login-ecr
     uses: aws-actions/amazon-ecr-login@v1
   
   - name: Build and push Docker image
     id: build-image
     env:
       ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
       ECR_REPOSITORY: <ECR-레포지토리이름>
       IMAGE_TAG: v1.0.13
       run: |
         docker buildx build --platform=linux/amd64 -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
         docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
         echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

   - name: Generate deployment package
     run: |
       mkdir -p deploy
       cp Dockerrun.aws.json deploy/Dockerrun.aws.json
       cd deploy && zip -r deploy.zip .

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

   - name: Deploy to Elastic Beanstalk
     uses: einaregilsson/beanstalk-deploy@v14
     with:
       aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
       aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
       application_name: <엘라스틱빈스토크 어플리케이션이름>
       environment_name: <엘라스틱빈스토크 환경이름>
       version_label: eb-test-${{steps.current-time.outputs.formattedTime}}
       Version description: EB-TEST
       region: ap-northeast-2
       deployment_package: deploy/deploy.zip
       wait_for_environment_recovery: 200

 

 

   - name: Login to Amazon ECR
     id: login-ecr
     uses: aws-actions/amazon-ecr-login@v1

ECR에 로그인한다.

 

   - name: Build and push Docker image
     id: build-image
     env:
       ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
       ECR_REPOSITORY: <ECR-레포지토리이름>
       IMAGE_TAG: v1.0.13
       run: |
         docker buildx build --platform=linux/amd64 -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
         docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
         echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

도커 이미지를 빌드한다.

참고로 mac m1일 경우 이미지 빌드에서 에러가 너무 나서 왜인지 몰랐는데,

 docker buildx build --platform=linux/amd64  이 부분을 기재하지 않아서 인것 같다.

저거 없이 하면 빌드한 이미지를 못가져온다고 계속 난리난리이다.

근데 이해가 안되는게, 도커 자체가 가상 os인데, 저기서 m1 플랫폼 설정을 해줘야하는게 이해가 안된다.

저거 안해도 되야하는거 아닌가? 내가 도커를 잘못 이해하는건지 잘 모르겠지만, 일단은 되니까... 넘어가욧~

 

빌드하고 ECR에 푸쉬한다.

echo 이 명령어는 ECR에 제대로 들어갔나 주소를 불러보는 python으로 따지면 print 같은거다.

 

그리고 문제가 또 있었다.

IMAGE_TAG: v1.0.13 여기에 나느 보통 env.GIT_TAG 이런걸 넣어서 배포를 자유롭게 하고 싶었다.

근데, 도커 태그가 자꾸 에러를 내뱉에서 임시방편으로 v1.0.0 처럼 넣어줬다.

추후 바꿔야한다.

 

   - name: Generate deployment package
     run: |
       mkdir -p deploy
       cp Dockerrun.aws.json deploy/Dockerrun.aws.json
       cd deploy && zip -r deploy.zip .

zip파일로 만들 필요가 없지않나 eb deploy 할 때는 zip 파일로 안만들었는데.. 했는데 하라니까 따라서 할뿐...

 

 

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

이건 안넣어도 되는데, eb 배포하면서 현재시간을 버전 라벨링하기 위해서 넣는 듯하다.

 

   - name: Deploy to Elastic Beanstalk
     uses: einaregilsson/beanstalk-deploy@v14
     with:
       aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
       aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
       application_name: <엘라스틱빈스토크 어플리케이션이름>
       environment_name: <엘라스틱빈스토크 환경이름>
       version_label: eb-test-${{steps.current-time.outputs.formattedTime}}
       Version description: EB-TEST
       region: ap-northeast-2
       deployment_package: deploy/deploy.zip
       wait_for_environment_recovery: 200

드디어 배포한다.

각 config를 제대로 넣어야한다.

 

version_label: eb-test-${{steps.current-time.outputs.formattedTime}}
Version description: EB-TEST

 

이건 솔직히 아무거나 넣어도 된다. 똑같이 안해도 된다.

 

   deployment_package: deploy/deploy.zip

이게 중요한데, 위에서 한 zip파일을 넣어줘야한다. 그래야 배포를 제대로 한다.

 

그럼 배포가 완료된다.

 


수정할 것들이 남아있다.(4가지)

1. image_tag를 commit str으로 바꿔줘서 배포를 자유롭게 만들어줘야하고,

2. Dockerrun.aws.json 파일도 image_tag를 변수로 담을 수 있게 코드를 바꿔줘야한다.

3. 오토 스케일링을 통해 서버에 부하가 걸릴때 ec2의 갯수를 늘려줘서 트레픽을 분산시켜줘야한다.

4. http -> https 리다이렉트 도 추가해줘야한다.

 

 

계속계속 할일이 생기네~~