본문 바로가기
CICD/AWS

[AWS] Jappa 를 사용한 Django Serverless 배포 lambda 와 API Gateway를 곁들인

by windy7271 2025. 2. 1.
728x90
반응형

안녕하세요 한달만에 왔습니다. 지금 코테는 안 하고 재밌는걸 하고 있습니다. 

 

지금 제가 하고 있는 프로젝트에서 파이썬 서버가 있는데, 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 를 해주시면 후루륵 될겁니다.

 

제가 경험한 에러를 정리해 볼게요

 

  1. 권한문제
    1. 위에 인라인 정책을 추가하면서 풀어냈고요
  2. A GET request to '/' yielded a 502 response code. 에러
    1. RDS 연결 되는지 확인 해보기
    2. 패키지 문제 (requirements.txt) 에 들어있는지 확인해 봅니다.
    3. "/" 기본 도메인 추가 해보기
    4. DATABASE Engine  바꾸기

이 정도 였는데 저는 DATABASE Engine 문제였습니다.

 

에러 로그를 확인해보고 싶으면 CloudWatch 에 들어가보시거나, zappa tail 을 통해 알 수 있어요

 

 

성공하게 되면 api gateway 에 들어가시고 거기서 준 url 뒤에 뭐를 붙이면 됩니다.

ex) !@#$!.com/dev 인경우

 !@#$!.com/dev/test

 !@#$!.com/dev/member

이렇게 말이죠

 

그럼 이만 !

 

반응형

댓글