この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
안녕하세요, 임채정입니다.
이번 블로그에서는 AWS SAM을 사용해서 API Gateway를 만들어보고 정리했습니다.
아젠다
- 사전 조건
- 코드 작성
- 실행
1. 사전 조건
SAM CLI가 실행할 환경에 다운로드 되어 있어야 합니다.
만약 해당 코드를 실행했을 때 다음과 같이 버전 정보가 나오지 않는다면 아래 사이트에 접속해서 자신의 OS에 맞는 페이지로 이동해서 SAM CLI 를 다운받아주시길 바랍니다.
$ sam --version
SAM CLI, version 1.41.0
SAM CLI 를 다운받는 법
2. 코드 작성
이제 SAM으로 실행을 해보기 전에 코드를 작성하도록 하겠습니다.
다음과 같이 폴터 및 파일을 생성합니다.
SAM
├─ gener
├─ scr
│ └─ app.py
├─ commands.sh
└─ template.yaml
gener
: 나중에 패키지화된 CloudFormation의 템플릿이 저장된 폴더입니다.
app.py
: 생성할 람다 코드 내용
해당 람다는 API Gateway 를 통해 페이지에 람다의 리턴 값(sam test
)을 표시하는 함수입니다.
import boto3
import json
import os
print('Loading function')
def respond(err, res=None):
return {
'statusCode': '400' if err else '200',
'body': err.message if err else json.dumps(res),
'headers': {
'Comtent-Type': 'application/json',
},
}
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
return respond(None, res="sam test")
template.yaml
: 생성할 리소스의 템플릿
해당 템플릿에서는 람다 함수와 API Gateway가 생성됩니다.
AWSTemplateFormatVersion: "2010-09-09"
Transform: 'AWS::Serverless-2016-10-31'
Description: A Simple AWS Lambda function
# ------------
# Parameters
# ------------
Resources:
SamTest:
Type: 'AWS::Serverless::Function'
Properties:
Handler: app.lambda_handler
Runtime: python3.6
CodeUri: src/
Description: A Simple AWS Lambda function
MemorySize: 128
Timeout: 3
Events:
SamTestAPI:
Type: Api
Properties:
Path: /sam
Method: GET
commands.sh
: 실행할 명령어 정리
# create s3 bucket
aws s3 mb s3://save-sam-code-202203
# package cloudformation
aws cloudformation package --s3-bucket save-sam-code-202203 --template-file template.yaml --output-template-file gener/template-generated.yaml
# deploy
aws cloudformation deploy --template-file gener/template-generated.yaml --stack-name simple-lambda-gateway --capabilities CAPABILITY_IAM
3. 실행
이제 실제로 실행해보겠습니다.
실행 위의 commands.sh
에 적힌 명령어를 순서대로 실행하겠습니다.
1) S3 버킷 생성
aws s3 mb s3://save-sam-code-202203
# make_bucket: save-sam-code-202203
생성된 S3 버킷은 app.py
파일에서 정의한 람다 함수를 저장되는 목적으로 생성하고 나중에 CloudFormation 스택이 생성될 때 작성될 람다 함수의 코드를 가져오는데 사용합니다.
2) Cfn 패키지화 하기
aws cloudformation package --s3-bucket save-sam-code-202203 --template-file template.yaml --output-template-file gener/template-generated.yaml
# Uploading to 045da98e5cd11be5695060df3172ff1a 362 / 362.0 (100.00%)
# Successfully packaged artifacts and wrote output template to file gener/template-generated.yaml.
# Execute the following command to deploy the packaged template
# aws cloudformation deploy --template-file /Users/lim/Desktop/SAM/gener/template-generated.yaml --stack-name <YOUR STACK NAME>
결과적으로는 gener
폴터 안에 새로운 파일이 생성됩니다.
배포를 할 때는 생성된 template-generated.yaml
파일을 사용하게됩니다.
SAM
├─ gener
│ └─ template-generated.yaml
├─ scr
│ └─ app.py
├─ commands.sh
└─ template.yaml
template-generated.yaml
: 실제 배포에 사용될 패키지화된 템플릿 파일
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A Simple AWS Lambda function
Resources:
lambdaPython3:
Type: AWS::Serverless::Function
Properties:
Handler: app.lambda_handler
Runtime: python3.6
CodeUri: s3://save-sam-code-202203/045da98e5cd11be5695060df3172ff1a
Description: A Simple AWS Lambda function
MemorySize: 128
Timeout: 3
Events:
SamTestAPI:
Type: Api
Properties:
Path: /sam
Method: GET
3) 배포
이번에는 실제로 배포를 하겠습니다.
다음 명령어를 통해 CloudFormation에서 template-generated.yaml
에 정의되어 있는 리소스를 생성하도록 합니다.
aws cloudformation deploy --template-file gener/template-generated.yaml --stack-name simple-lambda-gateway --capabilities CAPABILITY_IAM
# Waiting for changeset to be created..
# Waiting for stack create/update to complete
# Successfully created/updated stack - simple-lambda-gateway
4) 생성된 리소스의 확인
마지막으로 생성된 리소스를 확인하고 제대로 동작하는지 테스트해보겠습니다.
CloudFormation 스택
Lambda
람다도 잘 생성되어 있습니다. 같이 생성한 API Gateway가 트리거로 잘 설정이 되어 있는 것도 확인할 수 있습니다.
API Gateway
마지막으로 API Gateway도 잘 생성이 되었습니다.
그럼 이어서 생성된 리소스가 잘 생성되는지도 확인해보겠습니다.
먼저 생성한 API Gateway 리소스의 상세 페이지로 이동합니다.
그 중에서 [리소스] 탭으로 이동하면 GET이벤트를 테스트해볼 수 있습니다.
테스트를 눌러줍니다.
테스트 버튼을 눌러주면 오른쪽에 테스트 결과가 출력됩니다.
보이는 것처럼 람다의 리턴 값인 sam test
가 잘 출력되었습니다.
이번에는 다른 방법으로도 확인해보겠습니다.
[스테이지]탭으로 이동해서 Prod
를 선택합니다.
그러면 Prod 스테이지 편집기
가 오른쪽 페이지에 표시되는데 그중에서 맨 위에 있는 URL 호출에 있는 주소를 클릭합니다.
그러면 해당 URL 페이지로 들어가지는데 그 주소에template-generated.yaml
에서 설정해준 Path인 /sam
을 뒤에 붙여주면 다음과 같이 sam test
가 출력됩니다.
이것으로 성공적으로 리소스가 잘 실행되는 걸 확인할 수 있었습니다.
본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !