안녕하세요 한달만에 왔습니다. 지금 코테는 안 하고 재밌는걸 하고 있습니다.
지금 제가 하고 있는 프로젝트에서 파이썬 서버가 있는데, API가 많은것은 아니고 엑셀 업로드 관련 api가 3개 입니다. 이것 마저도 1개는 한달의 1번, 나머지는 하루에 한 번만 넣으면 되는 꼴이니
한달에 많아야 한 사람당 60번 정도죠
그래서 서버를 띄우기 보다 Lambda를 사용하여 호출이 있을때만 요청하게 하려고 합니다.
람다는 프리티어 기준 1백만 건 까지 무료입니다. 바로 가시죠
1. 장고
urls.py
path('', index, name='index'), # / 경로 추가
인덱스 페이지를 하나 만들어 줍니다. 해주지 않으면 나중에 502 bad Gateway가 나옵니다. Zappa 가 배포 완료하고 헬스체크를 "/" 로 쏴서 한다고 합니다.
1.1 설치해야 하는 것들
pip install virtualenv
pip install awscli
pip install mysql-connector-python
pip install zappa (윈도우는 이렇게하면 안될겁니다.)
2. RDS 생성
https://windy7271.tistory.com/entry/AWS-RDS
AWS RDS
RDS : 모니터링, 알람, 백업, HA 구성 등 모두 지원하는 관리형 서비스 / AWS 에서 지원하는 클라우드 기반 관계형 데베이다.데이터베이스 설정, 패치 및 백업 과 같이 잦은 운영 작업은 자동화하여
windy7271.tistory.com
2.1 장고에서 settings.py 수정
...
ALLOWED_HOSTS = ["*"]
...
DATABASES = {
'default': {
'ENGINE': 'mysql.connector.django', # MySQL 사용
'NAME': 'RDS 로그인 후 데이터베이스 생성 하고 채워주기', # 데이터베이스 이름
'USER': '', # 데이터베이스 사용자
'PASSWORD': '', # 데이터베이스 비밀번호
'HOST': 'RDS 복사해오기'
'PORT': '3306', # MySQL 기본 포트
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
},
}
}
3. 버킷 생성
이름이 필요합니다. 나중에 jappa에 세팅을 하게 되면 여기 버킷에 파이썬 코드가 올라가게 됩니다.
4. AWS Secretekey, Access key 발급 및 나중에 쓰임
zappa 가 S3 버킷에 코드 압축파일을 올리고 lambda 함수 생성, api gateway method 를 만들기 위해서는
시크릿키를 등록해줘야겠쬬 ?
aws configure
access key : 복사
secret access eky : 복사
region : ap-northeast-2
format : none
등록이 되었는지 확인해봐야겠죠 ?
aws sts get-caller-identity
를 실행하여 내가 넣은거랑 같고, iam 그룹? 이 알맞게 나오면 됩니다.
근데 키만 등록하면 될까요 ?? iam에 정책도 추가해줘야합니다. 왜냐하면 zappa가 실행할때 버킷에 집어넣어, 람다만들어, 게이트웨이 만들어 바쁘잖아요 ??
이 부분이 레퍼런스가 별로 없더라고요
https://github.com/Zappa/Zappa#custom-aws-iam-roles-and-policies-for-deployment
GitHub - zappa/Zappa: Serverless Python
Serverless Python . Contribute to zappa/Zappa development by creating an account on GitHub.
github.com
공식홈페이지에서 읽으면서 채우면 됩니다.
장난이고 제가 필요한것만 가져왔어요 인라인 정책으로 넣으시면 됩니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:AttachRolePolicy",
"iam:GetRole",
"iam:CreateRole",
"iam:PassRole",
"iam:PutRolePolicy"
],
"Resource": [
"arn:aws:iam::[본인 계정 ID]:role/*-ZappaLambdaExecutionRole"
]
},
{
"Effect": "Allow",
"Action": [
"lambda:CreateFunction",
"lambda:ListVersionsByFunction",
"lambda:DeleteFunctionConcurrency",
"logs:DescribeLogStreams",
"events:PutRule",
"lambda:GetFunctionConfiguration",
"cloudformation:DescribeStackResource",
"apigateway:DELETE",
"apigateway:UpdateRestApiPolicy",
"events:ListRuleNamesByTarget",
"apigateway:PATCH",
"events:ListRules",
"cloudformation:UpdateStack",
"lambda:DeleteFunction",
"events:RemoveTargets",
"logs:FilterLogEvents",
"apigateway:GET",
"lambda:GetAlias",
"events:ListTargetsByRule",
"cloudformation:ListStackResources",
"events:DescribeRule",
"logs:DeleteLogGroup",
"apigateway:PUT",
"lambda:InvokeFunction",
"lambda:GetFunction",
"lambda:UpdateFunctionConfiguration",
"cloudformation:DescribeStacks",
"lambda:UpdateFunctionCode",
"events:DeleteRule",
"events:PutTargets",
"lambda:AddPermission",
"cloudformation:CreateStack",
"cloudformation:DeleteStack",
"apigateway:POST",
"lambda:RemovePermission",
"lambda:GetPolicy"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucketMultipartUploads",
"s3:CreateBucket",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::zappa-*/*"
]
}
]
}
여기에서
"Resource": [
"arn:aws:iam::[본인 계정 ID]:role/*-ZappaLambdaExecutionRole"
]
이부분 만 계정 ID 로 바꿔주시면 됩니다 물로 대괄호도 없애주고요
예를들어 이렇게요
"Resource": [
"arn:aws:iam::123456789012:role/*-ZappaLambdaExecutionRole"
]
그러면 준비는 끝났습니다. 자파를 실행합니다.
zappa init
dev
버킷이름
~.settings (여러분꺼)
app.read(안나오면 바로 밑으로)
n
y
순서대로 해주시면 됩니다.
이게 끝나면 zapa deploy dev 를 해주시면 후루륵 될겁니다.
제가 경험한 에러를 정리해 볼게요
- 권한문제
- 위에 인라인 정책을 추가하면서 풀어냈고요
- A GET request to '/' yielded a 502 response code. 에러
- RDS 연결 되는지 확인 해보기
- 패키지 문제 (requirements.txt) 에 들어있는지 확인해 봅니다.
- "/" 기본 도메인 추가 해보기
- DATABASE Engine 바꾸기
이 정도 였는데 저는 DATABASE Engine 문제였습니다.
에러 로그를 확인해보고 싶으면 CloudWatch 에 들어가보시거나, zappa tail 을 통해 알 수 있어요
성공하게 되면 api gateway 에 들어가시고 거기서 준 url 뒤에 뭐를 붙이면 됩니다.
ex) !@#$!.com/dev 인경우
!@#$!.com/dev/test
!@#$!.com/dev/member
이렇게 말이죠
그럼 이만 !
댓글