본문 바로가기

Sparta

[Sparta] 16. ElasticBeanstalk

2021-10-07

To-Do

  • 7시 기상
  • 아침식사
  • 오전운동

  • 요즘들어 매일 새벽까지 코딩하다 늦게일어나는 일이 잦아진다... 운동은 언제가 ㅠㅠㅠ

Today I Learned


1. ElasticBeanstalk


1. ElasticBeanstalk란?



ELB + Auto Scaling + EC2 한번에 관리할 수 있는 서비스에요.이전 실습에서 보았듯이 따로 관리 하면 설정 값도 많고 무척 까다로워요. 그래서 AWS 에서는 통합해서 관리할수 있는 서비스인 ElasticBeanstalk를 제공하고 있어요. 구글의 앱엔진이라는 서비스와 비슷하게 환경에는 신경쓸 필요없이 간단한 옵션만 조절하고, 어플리케이션만 배포하면 되는 형태입니다. ElasticBeanstalk라는 이름이 너무 길어서 보통 EB라고 불러요.


AWS에는 정말 많은 서비스가 있다. 이는 AWS 인프라 관리에서 유연성을 제공할 수 있지만, 어떤 서비스를 사용해야 하고 해당 서비스를 프로비저닝하는 방법을 파악하는 것에 많은 비용이 들어간다. AWS에서는 Elastic Beanstalk를 사용하면 애플리케이션을 실행하는 인프라에 대해 자세히 알지 못해도 AWS 클라우드에서 애플리케이션을 신속하게 배포하고 관리할 수 있다고 한다. 이에 대해 간단히 공부해보자.


2. ElasticBeanstalk사용법


EB에 접속 > Create Application > 이름지정, 플랫폼 설정 > 생성 > 환경 > Pythonapp-env > 이름 밑의 url로 접속(샘플 어플리케이션)


Pythonapp-env의 구성에서 원하는대로 편집 가능


대략적인 설명


  • 소프트웨어 - 운영환경
  • 인스턴스 - 인스턴스의 볼륨과 보안그룹
  • 용량 - 인스턴스 유형과 인스턴스 조절
  • 로드밸런서 - 로드밸런서에 관련된 설정
  • 롤링 업데이트와 배포 - 배포에 관련된 설정
  • 보안 - 키페어 설정
  • 모니터링 - 모니터링
  • 알림 - 알림설정
  • 네트워크 - 네트워크 설정
  • 데이터베이스 - 데이터베이스 연결

3. ElasticBeanstalk와 GitHub Action을 이용한 자동 배포 만들기


1. IAM 권한 추가


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


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


github에 repo를 하나 만들어서 마찬가지로 .github/workflows/main.yml파일을 만들어 준다. 그리고 application.py파일을 만들어 서버를 구성하면된다.


다음으로 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 입력해줘야 하는데, 이번에는 boto3를 이용하여 세팅을 해보자.


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
    )

위의 코드와 같이 boto3 라이브러리에 직접적으로 입력하면 되는데, AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY같은 민감한 정보를 코드에 직접 입력하면 좋을일이 없다. 따라서 코드에는 저렇게 입력해두고 나중에 EB의 환경변수를 설정을 해주자.


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


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

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


다음으로 Github repo에서 저번처럼 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 입력해주자. 이는 Github Actions가 AWS에 접근할 수 있게 하기 위함이다.


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


다음으로 EB에 환경변수를 세팅해주자.

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


다음으로 라이브러리를 자동으로 만들기 위해 pip freeze > requirements.txt를 통해 requirements.txt를 만들어주자.


여기까지 되었으면 repo에 푸시! 하여 github actions가 잘 돌아가는지 확인해보자.


잘 돌아가면 프론트의 코드를 다음과 같이 변경하고 다시 푸시해보자.


function save() {
    var form_data = new FormData($('#upload-file')[0]);
    $.ajax({
        type: 'POST',
        url: 'http://pythonapp-env.eba-e8xxvygs.ap-northeast-2.elasticbeanstalk.com//fileupload',
        data: form_data,
        processData: false,
        contentType: false,
        success: function (data) {
            alert("파일이 업로드 되었습니다!!");
        },
    });
}

url에 Pythonapp-env의 url을 입력해주고 저장 후 다시 푸시! 하면.. 저장기능이 잘 돌아야하는데...



어김없이 찾아온 에러... ㅠ 해당 에러는 아직 해결하지 못했다...


AWS... 다시한번 깔끔하게 정리할 필요가 있는 것 같다... 정말 머리가 터질 것 같군..

'Sparta' 카테고리의 다른 글

[Sparta] 18. AWS RDS 사용법  (0) 2021.10.12
[Sparta] 17-1. AWS RDS  (0) 2021.10.08
[Sparta] 15-4. EC2 & ELB  (0) 2021.10.07
[Sparta] 15-3. EC2 백엔드  (0) 2021.10.07
[Sparta] 15-2. 네트워크  (0) 2021.10.07