일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- cognito
- Endpoints
- Custom Resource
- Await
- api gateway
- grafana
- 옵셔널 체이닝
- On-Premise
- Service
- 단축 평가
- Site-to-Site VPN
- JavaScript
- 구조분해 할당
- prometheus
- 자바스크립트
- elasticsearch
- null 병합 연산자
- CloudFormation
- docker
- AWS
- Kubernetes
- vgw
- docker swarm
- DynamoDB
- VPC
- transit gateway
- Proxy Resource
- 비구조화 할당
- optional chaining
- 온프레미스
- Today
- Total
만자의 개발일지
[AWS] API Gateway Stage Variables + Lambda Alias로 서버리스 개발 환경 관리하기 본문
서비스를 개발하다보면 개발 환경과 스테이징 환경, 운영 환경을 구분 지어 인프라를 구성해야하는데, 이는 서비스의 규모가 커질수록 더욱 중요해집니다. 하지만 여러 개발 환경을 목적에 따라 구분지어 구성하고 관리하는 것은 여간 번거로운일이 아닙니다.
API Gateway + Lambda로 서비스를 개발하는 경우 개발 환경을 손쉽게 구성하고 관리할 수 있습니다.
API Gateway는 스테이지라는 기능을 제공하여 단일 API 환경에서 여러 환경을 구성하고 관리할 수 있습니다.
API Gateway의 각 스테이지에 Stage Variables을 지정할 수 있는데, 이를 Lambda의 Alias와 함께 사용하면 서버리스 환경에서 손쉽게 개발 환경을 구성하고 관리할 수 있습니다.
이번 포스팅에서는 API Gateway와 Lambda를 사용하여 서버리스 환경에서 운영 환경(prod)과 개발 환경(dev)을 구성하고 관리하는 법에 대해 포스팅하도록 하겠습니다.
Lambda 구성
먼저 다음과 같이 Lambda 함수를 생성해줍니다. 필자는 런타임 환경을 Python3.8로 진행하였지만 다른 런타임 환경으로 진행해도 무방합니다.
운영 환경(prod) 구성
생성된 Lambda 함수의 코드를 다음과 같이 구성해줍니다.
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Prod Environment')
}
그다음 Versions 메뉴를 선택하고 새 버전을 생성합니다. 이는 Git의 Commit과 같이 Lambda의 현재 상태를 버전이라는 스냅샷 형태로 저장한다고 생각하시면 됩니다.
그다음 Aliases 메뉴로 간후 별칭(Alias)을 생성하고 방금 위에서 생성한 버전을 지정해줍니다.
개발 환경(dev) 구성
다시 Lambda함수로 돌아가서 아래와 같이 코드를 작성한 후 배포합니다.
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Dev Environment')
}
운영 환경 구성과 똑같은 방법으로 새버전을 배포하고 해당 버전을 갖는 별칭을 생성해줍니다.
Lambda 함수 내에서 별칭과 버전은 모두 각각 고유한 ARN을 가집니다. 따라서 버전 1, 2 그리고 별칭 prod와 dev는 각각 다른 함수로 구분됩니다.
API Gateway 구성
API Gateway 콘솔에서 REST API를 선택하고 생성합니다.
API를 호출하기 위해 다음과 같이 GET 메소드를 추가합니다.
save 버튼을 누르게 되면 다음과 같이 권한을 추가하라는 메세지가 뜨는데 그대로 복사하여 ${stageVariables.lambdaAlias} 부분만 각각 prod, dev로 바꾸어 실행해 줍니다.
$ aws lambda add-permission \
--function-name "arn:aws:lambda:ap-northeast-2:123456789101:function:demo-lambda-function:prod" \
--source-arn "arn:aws:execute-api:ap-northeast-2:123456789101:nycyt677re/*/GET/" \
--principal apigateway.amazonaws.com \
--statement-id 9d657bbf-9ba4-415d-9c64-2582f88cc5e7 \
--action lambda:InvokeFunction
{
"Statement": "{\"Sid\":\"9d657bbf-9ba4-415d-9c64-2582f88cc5e7\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-2:763745971502:function:demo-lambda-function:dev\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-2:123456789101:nycyt677re/*/GET/\"}}}"
}
$ aws lambda add-permission \
--function-name "arn:aws:lambda:ap-northeast-2:123456789101:function:demo-lambda-function:dev" \
--source-arn "arn:aws:execute-api:ap-northeast-2:123456789101:nycyt677re/*/GET/" \
--principal apigateway.amazonaws.com \
--statement-id 9d657bbf-9ba4-415d-9c64-2582f88cc5e7 \
--action lambda:InvokeFunction
{
"Statement": "{\"Sid\":\"9d657bbf-9ba4-415d-9c64-2582f88cc5e7\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:ap-northeast-2:763745971502:function:demo-lambda-function:prod\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:ap-northeast-2:123456789101:nycyt677re/*/GET/\"}}}"
}
그다음 스테이지를 생성하기 위해 API를 배포해줍니다.
마찬가지로 dev 스테이지도 생성해줍니다.
그다음 prod 스테이지의 Stage Variables 메뉴를 클릭하고 아래와 같이 값을 추가합니다.
마찬가지로 dev 스테이지도 똑같이 값을 추가해줍니다.
이제 prod, dev 스테이지의 Invoke URL로 접속하여 테스트해봅니다.
prod 스테이지로 접속한 경우, Lambda 함수의 prod 별칭이 호출되고 dev 스테이지로 접속한 경우, Lambda 함수의 dev 별칭이 호출되는 것을 보실 수 있습니다.
위와 같이 구성하면 단일 API 환경에서 여러 개발 환경을 구성하고 관리할 수 있습니다.
참고
'AWS' 카테고리의 다른 글
[AWS] Client VPN Endpoints로 Private하게 접근하기 (0) | 2022.08.04 |
---|---|
[AWS] VPC Flow Log로 IP 트래픽 로그 남기기 (0) | 2022.07.24 |
[AWS] CloudFormation이란 (2) | 2022.07.11 |
[AWS] Cognito 회원 가입 및 로그인 기능 구현하기(feat. amazon-cognito-identity-js, TypeScript) (0) | 2022.06.11 |
[AWS] Cognito User Pool 생성하기 (0) | 2022.06.10 |