Zappa란?
Zappa는 서버리스를 아주 손쉽게 구축할 수 있는 라이브러리이다. Zappa를 사용하면 Django나 Flask같은 프레임워크를 AWS S3+AWS Lambda + API GateWay로 어플리케이션을 구축 및 배포할 수 있다.
준비물
Zappa를 세팅하기 위해선 아래 세가지가 필요하다.
- pipenv
- AWS accesskey, secret key
- Python 3.6 ^
설치
- 가상환경에 Zappa를 설치한다.
- $ pip install zappa
- Zappa를 초기화한다.
- $ zappa init
Zappa initialize
- zappa 스테이지 이름
- 기본값은 dev이다.
- zappa s3 버킷 이름 설정
- S3버킷이 없을 경우 새로 생성하며, 임의의 이름을 지정한다.
- S3버킷이 이미 있을 경우 새로 생성하면 된다.
- Django 프로젝트 설정에 대한 모듈식 경로 지정
- 기본값은 자동으로 해당 프로젝트의 settings를 지정한다.
- deploy를 위한 regions을 전 세계로 허용하기
- 기본값은 사용안함 (n)이다.
- 마지막으로 위의 세팅 내용들에 따른 zappa_settings.json 파일의 예시를 보고 이대로 세팅 완료할 지 선택한다.
AWS region 추가하기
S3에 배포하기 위해선 S3 bucket의 region을 먼저 지정해줘야한다. 생성된 s3 bucket의 region을 확인 후 zappa_setting.json에 입력한다.
{
"dev": {
"aws_region": "ap-northeast-2",
"django_settings": "practice_zappa.settings",
"profile_name": null,
"project_name": "practice-zappa",
"runtime": "python3.8",
"s3_bucket": "zappa-4xeuzskvb"
}
}
.env 파일로 로컬 환경 변수 설정
export AWS_ACCESS_KEY_ID=something
export AWS_SECRET_ACCESS_KEY=something
export AWS_REGION=ap-northeast-2
환경 변수 추가하기
environment_variables 키를 추가하여 settings에서 사용하는 시크릿 키 등을 입력한다.
{
"dev": {
"aws_region": "ap-northeast-2",
"django_settings": "practice_zappa.settings",
"profile_name": null,
"project_name": "practice-zappa",
"runtime": "python3.8",
"s3_bucket": "zappa-4xeuzskvb"
"environment_variables": {
"SECRET_KEY": "something"
}
}
Zappa 배포하기
초기배포
$ zappa deploy dev
업데이트
초기배포 이후부터는 업데이트를 통해 최신화 버전으로 배포할 수 있다.
zappa는 첫 세팅에는 조금 번거로울 순 있지만, 한 번 배포하고 나서는 업데이트 하기 쉽다.
$ zappa update dev
배포 완료
Calling update for stage dev..
Downloading and installing dependencies..
- cryptography==3.2.1: Using locally cached manylinux wheel
- cffi==1.14.3: Using locally cached manylinux wheel
Packaging project as zip.
Uploading practice-zappa-dev-1615897082.zip (20.6MiB)..
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 21.5M/21.5M [00:02<00:00, 9.72MB/s]
Updating Lambda function code..
Updating Lambda function configuration..
Uploading practice-zappa-dev-template-1615897096.json (1.6KiB)..
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1.66k/1.66k [00:00<00:00, 25.4kB/s]
Deploying API Gateway..
Scheduling..
Unscheduled practice-zappa-dev-zappa-keep-warm-handler.keep_warm_callback.
Scheduled practice-zappa-dev-zappa-keep-warm-handler.keep_warm_callback with expression rate(4 minutes)!
Your updated Zappa deployment is live!: <https://0qvv5p1hfi.execute-api.ap-northeast-2.amazonaws.com/dev>
첫 배포 후
[settings.py](<http://settings.py>) 의 ALLOWED_HOSTS의 상수 값을 추가해야한다.
ALLOWED_HOSTS = [
'0qvv5p1hfi.execute-api.ap-northeast-2.amazonaws.com/dev'
]
배포 완료 확인
Deploy된 Django 페이지에 진입하여 화면을 확인한다. 화면이 잘 나오면 Lambda 함수가 잘 동작하고 있는것을 확인한다.
정적 파일 배포
Django에서는 이미지, Javascript, CSS와 같은 파일들을 정적파일 (static)이라고 한다. 웹 페이지 상에서 UI를 출력시키기 위해 일반적으론 정적 파일을 서버와함께 배포하지만, Zappa는 서버리스 환경이기 때문에 s3를 활용하여 정적파일을 배포한다.
Static s3 bucket 생성
정적 파일을 업로드시킬 S3 bucket을 별도로 생성한다. 여기서는 임의로 zappa-static 이라고 지었다.
s3 bucket CORS 편집
생성한 s3 버킷의 권한 > CORS 를 편집한다. 편집 시 아래 내용을 붙여놓고 변경 사항을 저장한다.
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [],
"MaxAgeSeconds": 3000
}
]
Boto3와 django-storages
Boto3는 AWS를 빠르게 실행할 수있게 돕는 SDK이며, django-storages는 boto3 기반으로 S3와 상호작용이 제공되는 라이브러리이다.
[Boto3 설치]
pip install boto3
[Django-Storages 설치]
pip install django-storages
s3 정적파일 처리를 위한 [settings.py](<http://settings.py/>) 설정
프로젝트 settings.py에 아래 내용을 추가한다.
STATIC_ROOT ="./static/"
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage' # Django-storage에서 s3버킷에 정적 파일 업로드를 허용하는 것을 의미한다.
AWS_S3_BUCKET_NAME_STATIC = "zappa-static"
s3에 정적파일 업로드하기
Django에서 정적 파일들은 분산이 되어있기 때문에, 정적 파일을 모두 찾아 올리는 것이 비효율적이다. 따라서 정적파일을 업로드하기 전 우선 Django 내부에 있는 모든 정적 파일을 한 곳에 모으는 작업을 한다.
python manage.py collectstatic --noinput # --noinput 옵션을 사용하지 않고 명령어를 입력하면 Y/N을 별도로 선택해야한다.
> 132 static files copied.
s3에 업로드하기 전, 코드가 업데이트되었으니 배포를 한 번 업데이트 후 진행한다.
zappa update dev
> ...
[REPORT] RequestId: 4fcdb71f-5480-4bb3-8ed4-d8d59e094da1
Duration: 5448.95 ms
Billed Duration: 5449 ms
Memory Size: 512 MB
Max Memory Used: 104 MB
s3 배포 확인
배포가 제대로 되었는지 확인 하기 위해 배포된 URI에 접근하여 확인한다. s3 bucket에서도 확인할 수 있다.
예시
RDS 세팅하기
탄력적 ip 주소 생성
- AWS VPC 대시보드 > 가상 프라이빗 클라우드 > 탄력적 ip를 선택한다.
- 새주소를 할당 받는다.
할당받은 탄력적 IP의 할당 ID 주소를 복사한다.
vpc 생성
- AWS VPC 대시보드 > VPC 마법사를 선택한다.
- VPC 구성을 퍼블릭 및 프라이빗 서브넷이 있는 VPC를 선택한다.
- 내용을을 입력하고, 복사한 탄력적 IP 할당 ID 주소를에 붙여넣는다.
- 내용 입력 시 프라이빗 서브넷의 이름을 잘 정해야 다른것과 혼동되지 않는다.
- 탄력적 IP 할당 ID
- VPC 생성 버튼을 누른다.
vpc에 프라이빗 서브넷 추가
- AWS VPC 대시보드 > VPC를 선택한다.
- 서브넷 생성을 선택한다.
- 서브넷 선택 시, 위에서 생성한 vpc로 선택 한다.
- 서브넷 설정 시 가용 영역을 vpc 생성 시 함께 출력된 퍼블릿 서브넷과 다른 가용영역으로 설정 후 나머지 영역을 채운다.
- 서브넷 생성을 선택한다.
서브넷 그룹 생성
- ElastiCache 대시 보드 > 서브넷 그룹을 선택한다.
- 서브넷 선택 생성을 선택한다.
- 서브넷과 이름과 설명을 작성 후, 위에서 설정한 VPC ID를 선택한다.
- 가용 영역 또는 Outpost에서 가용 영역이 각기 다른 프라이빗 서브넷을 선택한다.
- 생성을 선택한다.
RDS 생성
RDS를 세팅하기 이전에 먼저 AWS에서 RDS를 생성한다.
모라니크에서는 PostgreSQL를 사용하므로, 여기서는 프리티어-PostgreSQL로 생성했다.
- RDS 생성 시 vpc를 위에서 생성한 vpc로 설정한다.
- 서브넷 그룹도 위에서 생성한 서브넷 그룹으로 설정한다.
- 다른 부분들을 입력 후 데이터 베이스를 생성한다.
lambda와 연동
- AWS Lambda의 대시보드 > 함수를 선택한다.
- zappa에서 생성한 함수를 선택한다.
- 구성 > VPC > 편집을 선택한다.
- VPC와 서브넷, 보안 그룹을 선택한다. 전부 다 위에서 생성한 것으로 설정한다.
- 서브넷은 반드시 프라이빗한 것으로 선택한다.
- 저장을 선택하여 세팅을 마친다.
psycopg2-binary 설치
$ pip install psycopg2-binary
[settings.py](<http://settings.py>) 에 db 설정
원격 저장소이니 로컬 저장소의 경우 별도로 처리한다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'zappadbname',
'USER': 'administrator',
'PASSWORD': 'this_is_not_a_good_password',
'HOST': 'zappa-db.crt239fsjdlk.us-east-1.rds.amazonaws.com',
'PORT': '5432',
}
}
zappa_settings.json 추가
vpc_config key를 추가하고, 서브넷id와 보안그룹을 작성한다.
서브넷 id는 private한 것으로 작성한다.
{
"dev": {
"aws_region": "ap-northeast-2",
"django_settings": "practice_zappa.settings",
"profile_name": null,
"project_name": "practice-zappa",
"runtime": "python3.8",
"s3_bucket": "zappa-4xeuzskvb"
"environment_variables": {
"SECRET_KEY": "something"
}
"vpc_config": {
"SubnetIds": [
"subnet-f3446aba",
"subnet-c5b8c79e"
],
"SecurityGroupIds": [
"sg-9a9a1dfc"
}
zappa-django-utils 설치
RDS는 생성했지만, Database는 생성하지 않았기 때문에, zappa-django-utils 라이브러리를 이용하여 Database를 설치한다.
$ pip install zappa-django-utils
[settings.py](<http://settings.py>) 에도 INSTALLED_APPS에 추가한다.
INSTALLED_APPS = [
'zappa_django_utils'
]
database 생성
zappa manage dev create_pg_db
data migration
데이터베이스를 생성했으니, django에도 migration시킨다.
python manage.py makemigrations
Zappa 업데이트 배포
django model을 새로 생성하거나 수정할 경우, 꼭 migrate를 먼저하고 배포해야한다.
그렇지 않으면 모델로 인한 서비스 순단이 발생할 수도 있다.
'개발' 카테고리의 다른 글
EC2 인스턴스에 AWS Cloud watch Agent 설치하기 (0) | 2022.10.14 |
---|---|
AWS OpenSearch mapper_parsing_exception Trouble shooting (0) | 2022.10.12 |
AWS OpenSearch 시작하기 (feat.node.js) (0) | 2022.10.11 |
Airflow에 BigQuery 연동하기 (0) | 2022.10.07 |
Django에서 AWS SES를 활용한 이메일 보내기 (0) | 2022.10.06 |