원래 AWS에서 제공하는 것처럼 필요한 파일들을 압축하여 업로드하고 관련된 내용 등을 CLI 또는 웹 콘솔을 통해서 설정하여 구현할 수 있지만, 디버깅, 환경 설정, 배포 등의 이유로 프레임워크를 사용하는 게 좋습니다.
- Serverless: 가장 유명하고 제공하는 기능이 많습니다. 문서화도 잘 되어 있는 편이고 Node.js, Python, Java, Scala를 지원합니다.
- Apex: express.js를 개발한 TJ Holowaychuk이 만든 프레임워크. 배포 시 멱등성을 보장하며 가장 다양한 언어를 지원합니다. Node.js, Golang, Python, Java, Rust, Clojure를 지원합니다.
- Chalice: AWS에서 개발한 프레임워크. Python을 지원하며 AWS Lambda와 API Gateway를 자동으로 설정해줍니다.
- Zappa: 를 사용하기로 했습니다. Zappa는 Python 기반으로 AWS Lambda를 손쉽게 사용할 수 있게 하고 거기에 더해서 API Gateway까지 자동으로 설정해주어서 최종적으로 저희가 원하는 웹 서버를 간단하게 구축할 수 있는 도구입니다. (로켓 펀치가 사용 중)
https://www.serverless.com/framework/docs/getting-started/
🚀 serverless 프레임워크 설치 (전역 설치 권장)
npm install -g serverless
🚀 servless 로그인 (optional)
하는게 편하더라구요 전.
serverless login
🚀 aws cli 사용과 serverless 원격 접속을 위해 IAM에서 access key 발급 받기
www.serverless.com/framework/docs/providers/aws/cli-reference/config-credentials/
root 계정을 이용해도 괜찮지만 권한을 제어하고 싶다면 IAM를 통해 부계를 파서 이용합시다.
다른 클라우드를 사용할 거라면 문서에 가서 직접 확인해보시길 바랍니다.
serverless config credentials --provider aws --key 액세스키ID --secret 비밀액세스키
저는 이미 aws cli로 세팅을 해줘서 그런지, overwrite하라는 경고가 떠서 해줬습니다.
🚀 Serverless 템플릿을 통하여 애플리케이션 생성 + deploy
www.serverless.com/framework/docs/providers/aws/cli-reference/create/
서버리스 프레임워크에서 제공하는 템플릿을 이용해서 어플리케이션을 생성해보겠습니다.
serverless create --t
아무 템플릿도 지정하지 않았기 때문에 오류를 내면서 무슨 템플릿을 supported 하는지 출력해줍시다.
엄청 많네요. tencent도 있고.. 저는 aws-nodejs를 사용하겠습니다.
Serverless: Generating boilerplate...
Serverless Error ---------------------------------------
Template "true" is not supported. Supported templates are:
"aws-clojure-gradle", "aws-clojurescript-gradle", "aws-nodejs", "aws-nodejs-typescript", "aws-alexa-typescript", "aws-nodejs-ecma-script", "aws-python", "aws-python3"
"aws-groovy-gradle", "aws-java-maven", "aws-java-gradle", "aws-kotlin-jvm-maven", "aws-kotlin-jvm-gradle", "aws-kotlin-nodejs-gradle", "aws-scala-sbt", "aws-csharp"
"aws-fsharp", "aws-go", "aws-go-dep", "aws-go-mod", "aws-ruby", "aws-provided"
"tencent-go", "tencent-nodejs", "tencent-python", "tencent-php"
"azure-csharp", "azure-nodejs", "azure-nodejs-typescript", "azure-python"
"cloudflare-workers", "cloudflare-workers-enterprise", "cloudflare-workers-rust"
... 중략
serverless create -t aws-nodejs -p [원하는 이름]
요란한 출력과 함께 지정한 이름의 폴더가 생성된 것을 확인할 수 있습니다.
handler는 말 그대로 invoke할 함수고, serverless.yml은 관련 설정들이 있습니다.
S3에 저장 등 다른 것과 연계할 때는 serverless.yml에서 설정을 손 봐주고 handler에서 코드를 작성하면 됩니다.
기본적으로 생성된 handler를 로컬에서 실행해봅시다. handler.js를 열어보니 hello라는 이름의 함수가 있군요.
'use strict';
// hello라는 이름의 함수가 자동 생성되었습니다.
module.exports.hello = async event => {
return {
statusCode: 200,
body: JSON.stringify(
{
message: 'Go Serverless v1.0! Your function executed successfully!',
input: event,
},
null,
2
),
};
// Use this code if you don't use the http event with the LAMBDA-PROXY integration
// return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};
invoke로 로컬에서 실행해봅시다.
주의할 점이, 해당 함수를 실행해보고 싶으면 해당 경로로 먼저 이동한 후에 명령을 입력해야 합니다. 그렇지 않으면 에러도 아니고 그냥 아무 반응이 없습니다. (30분 삽질 ㅅㄱ)
(https://www.serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/)
cd [생성한 이름]
serverless invoke local --function [실행하고자 하는 함수명]
cd hellolambda // 이동
serverless invoke local -f hello // 로컬에서 실행
로컬에서 잘 실행되는 것을 확인했다면 AWS에 해당 람다를 배포해봅시다.
배포 전 serverless.yml에서 설정들을 먼저 수정해야 합니다. flutter에서 yml을 써봐서 알겠지만 indent에 굉장히 민감합니다. 주의 합시다.
service: hellolambda
provider:
name: aws
runtime: nodejs12.x
stage: dev
region: ap-northeast-2
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: get
serverless deploy
deploy에 성공하면 다음과 같은 주소가 나오게 됩니다.
... 중략
Serverless: Stack update finished...
Service Information
service: hellolambda
stage: dev
region: ap-northeast-2
stack: hellolambda-dev
resources: 11
api keys:
None
endpoints:
GET - https://어쩌구저쩌구.execute-api.ap-northeast-2.amazonaws.com/dev/hello
functions:
hello: hellolambda-dev-hello
layers:
None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.
해당 endpoint로 접근해보면 잘 작동하는 것을 알 수 있습니다. 만세! 😎
🚀 deploy 이후 관리
AWS에 배포했으므로 AWS CloudFormation에서 확인할 수 있습니다.
'Ops, Infra, etc > ⚡ serverless' 카테고리의 다른 글
이미지 서비스를 위한 리사이징 플로우 탐구 (0) | 2021.04.27 |
---|---|
serverless하게 추천 시스템을 구현해보자 - 이론편 (0) | 2021.04.22 |
[AWS] lambda에서의 DynamoDB 호출 및 제어 (sdk v2) + trouble shooting (0) | 2021.04.11 |
Killer Use Cases, Causion of AWS Lambda (0) | 2021.03.24 |
[AWS] AWS Lambda + API gateway로 Serverless 만들어보기 (0) | 2020.06.14 |