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>