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 |