Infra/AWS

[AWS] Elasticbeanstalk - GitHub Action을 이용한 무중단 배포 서비스 만들기(프론트&백엔드 연결하기)

민돌v 2021. 10. 4. 00:40

1. IAM 권한 추가


EB (Elastic Beanstalk)를 사용해서 깃허브와 연동해 자동배포를 진행하기 위해 

사용자(IAM) 에 eb 권한을 추가한다.

 

IAM - 사용자 - 클릭 - AdminstationAcess - AWSElascticBeanstalk 추가

 

 

2. Github Action - AWS 백엔드 배포 설정


Flask를 이용해 백엔드 배포를 진행하려 한다.

EB 로 배포를 할 때는 application.py로 파일을 만들어야 한다.(디폴트)

 

1. application.py

  • s3 = boto3.client() : AWS s3를 연결하기 위한 방법(boto3 라이브러리 이용)
    • EB - 환경설정 필요
    •  

 

  • cors = CORS(application, resul~) : Cloudfront 주소와(프론트), EB주소(백엔드) 주소가 다르기 때문에 서버에서 모든 도메인 주소로 들어오는 걸 허용한다는 의미

 

import boto3
from flask import Flask, render_template, request, jsonify
from flask_cors import CORS
import os

application = Flask(__name__)
cors = CORS(application, resources={r"/*": {"origins": "*"}})

@application.route('/')
def main():
    return render_template("index.html")

@application.route('/fileupload', methods=['POST'])
def file_upload():
    file = request.files['file']
    s3 = boto3.client('s3',
                      aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
                      aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"]
                      )
    s3.put_object(
        ACL="public-read",
        Bucket=os.environ["BUCKET_NAME"],
        Body=file,
        Key=file.filename,
        ContentType=file.content_type
    )
    return jsonify({'result': 'success'})

if __name__ == '__main__':
    application.debug = True
    application.run()

 

2. 배포 스크립트 -  main.yml 

경로 : .github/workflows/main.yml

name: backend
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source code.
        uses: actions/checkout@master

      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: "3.8"

      - name: Generate deployment package
        run: zip -r deploy.zip . -x '*.git*'

      - name: Get timestamp
        uses: gerred/actions/current-time@master
        id: current-time

      - name: Run string replace
        uses: frabert/replace-string-action@master
        id: format-time
        with:
          pattern: '[:\.]+'
          string: "${{ steps.current-time.outputs.time }}"
          replace-with: '-'
          flags: 'g'

      - name: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v16
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          application_name: python-app
          environment_name: Pythonapp-env-1
          version_label: "python-${{ steps.format-time.outputs.replaced }}"
          region: ap-northeast-2
          deployment_package: deploy.zip

 

 

 

3. requirement.txt - 설치 구성 라이브러리 


EB를 이용한 배포는, 따로 설정을 해주지 않기 때문에 requirement.txt로 설치해야할 라이브러리를 알려주면, 자동 설치가 된다.

가상환경을 만들어 준후, 라이브러리를 설치하고, 설치한 라이브러리를 pip freeze > requirement.txt 파일로 만들어준다

 

 

4. EB - Cloudfront 연동 ( 프론트 - 백 연동)


EB를 이용해 배포를 진행하면, front 코드에서 s3에 데이터를 저장해야할 때

url을 EB url을 이용한다.

 

ex)

<script>
        function save() {
            var form_data = new FormData($('#upload-file')[0]);
            $.ajax({
                type: 'POST',
                url: 'EB URL/fileupload',
                data: form_data,
                processData: false,
                contentType: false,
                success: function (data) {
                    alert("파일이 업로드 되었습니다!!");
                },
            });
        }
    </script>