본문 바로가기

AWS

[AWS] 9. Github Actions를 통한 배포_back

Github Actions를 통한 배포_back


Front에서 했던것과 마찬가지로 Github Actions를 통한 배포를 마무리해주자.


Github Actions 사용방법


1. IAM 권한 추가

우선 S3와 CloudFront와 마찬가지로 EB에도 권한을 부여해야한다. IAM의 사용자에 접속해서 AdministratorAccess-AWSElasticBeanstalk권한을 추가하자.


2. GitHub Action을 이용한 배포준비

서버는 프론트보다 조금 복잡하다. 우선 application.py파일로 서버를 만들어 줘야한다. .github/workflows/main.yml 파일을 만들어줘야한다는 규칙과 마찬가지로 application.py를 만들어 줘야 배포가 된다. EB에서 파이썬을 배포할 때 기본 세팅이다.


다음은 EC2 인스턴스(서버)에서 S3에 접근하여 파일을 업로드하는 코드이다. os라이브러리를 이용하여 리눅스(인스턴스)에 있는 환경변수를 가져올 수 있다. 이때 파이썬에서 제공하는 AWS SDK인 boto3 라이브러리를 사용하였다.


@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'})

다음으로 새로 보이는 것은 CORS이다.


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

지금까지는 로컬에서 혹은 하나의 인스턴스에서 프론트엔드와 백엔드를 연동시킬 때는 localhost라는 같은 URL을 사용하였다. 이렇게 URL이 같으면 웹에서 웹으로 통신할 때 문제가 없지만, 지금과 같이 프론트엔드와 백엔드의 URL이 다르면 문제가 생긴다. Cross-Origin Resource Sharing (CORS)을 이용하면 이러한 문제가 해결된다. 이에 대한 자세한 내용은 따로 정리하겠다.


3. .github/workflows/main.yml 생성

main.yml을 살펴보자. 프론트를 배포할 때와는 조금 다르다.


name: lukaid-aws-back
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 # python 배포는 패키징이 이루어진다.
        run: zip -r deploy.zip . -x '*.git*' # deploy.zip으로 패키징

      - name: Get timestamp # 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 # EB의 application_name
          environment_name: Pythonapp-env # EB의 environment_name
          version_label: "python-${{ steps.format-time.outputs.replaced }}"
          region: ap-northeast-2
          deployment_package: deploy.zip

4. Github에 환경변수 설정

다음으로 Github repo에서 프론트에서와 마찬가지로 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 입력해주자.


5. EB에 환경변수 설정

좌측의 Pythonapp-env > 구성 > 소프트웨어 편집 > 환경 속성


마찬가지로 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY와 BUCKET_NAME를 입력해주자.



6. 라이브러리 자동생성

EB는 내가 직접 EC2를 세팅하는 것이 아니기 때문에 배포전에 필요한 라이브러리를 명시해줘야한다. 배포 시 라이브러리를 자동으로 만들기 위해 pip freeze > requirements.txt를 통해 requirements.txt를 만들어주자.


7. main branch push

마지막으로 main 브랜치를 push하면 Github Actions가 작동한다.

'AWS' 카테고리의 다른 글

[AWS] 10. AWS_VPC 개념  (0) 2021.10.27
[AWS] 8. ElasticBeanstalk (EB)  (0) 2021.10.11
[AWS] 7. ELB  (0) 2021.10.11
[AWS] 6. EC2  (0) 2021.10.11
[AWS] 5. Github Actions를 통한 배포_front  (0) 2021.10.11