【AWS】Serverless Frameworkを使ったLambda開発

January 19, 2023
AWS / Lambda / Serverless Framework

Serverless Framework

Serverless FrameworkとはLambda等のServerless Applicationの構成管理やデプロイをサポートしてくれるツールです。

https://www.serverless.com/

gettering-started

https://www.serverless.com/framework/docs/getting-started

$ npm install -g serverless

slsserverlessのaliasなのでここからはslsを使っていきます。

sls create --helpでどんなテンプレートが用意されているのか確認します。

$ sls create --help
create                          Create new Serverless service
--template / -t                 Template for the service. Available templates:
                                             "aws-clojure-gradle", "aws-clojurescript-gradle", "aws-nodejs", "aws-nodejs-docker", "aws-nodejs-typescript", "aws-alexa-typescript", "aws-nodejs-ecma-script", "aws-python"
                                             "aws-python3", "aws-python-docker", "aws-groovy-gradle", "aws-java-maven", "aws-java-gradle", "aws-kotlin-jvm-maven", "aws-kotlin-jvm-gradle", "aws-kotlin-jvm-gradle-kts"
                                             "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"
                                             "fn-nodejs", "fn-go"
                                             "google-nodejs", "google-nodejs-typescript", "google-python", "google-go"
                                             "kubeless-python", "kubeless-nodejs"
                                             "knative-docker"
                                             "openwhisk-java-maven", "openwhisk-nodejs", "openwhisk-php", "openwhisk-python", "openwhisk-ruby", "openwhisk-swift"
                                             "spotinst-nodejs", "spotinst-python", "spotinst-ruby", "spotinst-java8"
                                             "twilio-nodejs"
                                             "aliyun-nodejs"
                                             "plugin"
                                             "hello-world"

下記の様に—pathでディレクトリ名が指定できます。

$ sls create -t aws-nodejs-typescript --path aws-nodejs-typescript

今回はテンプレートは指定せずに、slsのみで進めました。

プロジェクトを作成する

slsを実行すると、色々と聞かれます。以下の様に選択 and 入力しました

$ sls
Creating a new serverless project
? What do you want to make? AWS - Node.js - HTTP API
? What do you want to call this project? aws-nodejs-http-api-sample
✔ Project successfully created in aws-nodejs-http-api-sample folder
? What org do you want to add this service to? [Skip]
? Do you want to deploy now? No

作成したプロジェクトに移動しnpm installします。

$ cd aws-nodejs-http-api-sample 

$ npm install
or
$ yarn

デプロイ

serverless.ymlのproviderにregionとprofileを追記します。 東京だったらap-northeast-1でprofileは↑でserverlessでデプロイするawsのprofileです。

provider:
  region: {{ your app region }}
  profile: {{ your profile }}
$ sls deploy
...
endpoint: GET - https://xxxxxxx.amazonaws.com/

deployコマンド一発で、API Gateway、Lambda、Cloud Watch、Cloud Formationの設定までやってくれます。

また、endpointのURLもコンソールに表示されるのでアクセスするとAPIのレスポンスが確認できます。

deployコマンドを実行後には、.serverlessというディレクトリがプロジェクト直下に生成されます。

.serverlessにcloudformationの設定が記載されています。

$ tree .serverless
.serverless
├── cloudformation-template-create-stack.json
├── cloudformation-template-update-stack.json
├── hello.zip
└── serverless-state.json

aws cli の設定

今回のテーマからは外れてしまいますが、aws cliが未設定の場合はaws configureを実行して各項目を入力していきます。

aws cli設定に関する公式docは コチラ

AWSのユーザー作成から必要な場合はコチラに動画があります。

$ aws configure --profile {{ your aws profile }}
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json

例えば、以下のようにtestというprofileを作成すると、~/.aws/config~/.aws/credentialsに設定が追記されます。

$ aws configure --profile test
AWS Access Key ID [None]: hoge
AWS Secret Access Key [None]: fuga
Default region name [None]: us-east-1
Default output format [None]: json

$ less ~/.aws/config
[profile test]
region = us-east-1
output = json

$ less ~/.aws/credentials
[test]
aws_access_key_id = hoge
aws_secret_access_key = fuga

使うprofileそのものを切り替えるには

$ export AWS_PROFILE="{{ your profile name }}"

serverless config コマンドで aws cliの設定をする方法

aws configure --profile {{ your profile name }}で設定することも出来ますが、以下のようにsls config credentialsコマンドでも出来ます。

sls config credentials --provider aws --key {{ your access key }} --secret {{ your secret access key }} --profile {{ your profile }}

しかしregionやoutputが設定出来ないのでaws configure --profile {{your profile}}の方が良さそうです。

デプロイした関数をinvoke(呼び出す)するには

デプロイすると通常はAPI Gatewayが設定されてAPIのURLが発行されますが、URLがない関数の場合sls invokuコマンドで実行出来ます。

$ sls invoke -f hello
 
# Invoke and display logs:
$ sls invoke -f hello --log

# run your code locally
$ sls invoke local --function functionName

デプロイした関数のlogをfetchしたい時

$ sls logs -f hello
 
# Tail logs
$ sls logs -f hello --tail

Monitoring(監視)したい

既存のプロジェクト配下で、下記コマンドを実行すると色々聞かれるので進めていきます。

完了すると、serverless dashboardからログやデプロイ状況等を確認出来るようになります。

$ sls
Running "serverless" from node_modules

Onboarding "aws-nodejs-http-api-sample" to the Serverless Dashboard

? What org do you want to add this service to? xxxxxx
? What application do you want to add this to? [create a new app]
? What do you want to name this application? aws-nodejs-http-api-sample

✔ Your project is ready to be deployed to Serverless Dashboard (org: "xxxxxx", app: "aws-nodejs-http-api-sample")

? Do you want to deploy now? Yes

Deploying aws-nodejs-http-api-sample to stage dev (ap-northeast-1, "default" provider)

✔ Service deployed to stack aws-nodejs-http-api-sample-dev (71s)

dashboard: https://xxxxxxxx
endpoint: GET - https://xxxxxxx
functions:
  hello: aws-nodejs-http-api-sample-dev-hello (225 kB)

What next?
Run these commands in the project directory:

serverless deploy    Deploy changes
serverless info      View deployed endpoints and resources
serverless invoke    Invoke deployed functions
serverless --help    Discover more commands

Serverless Offline

AWS Lambda や API Gatewayをローカル環境でemulate(再現)してくれるプラグインです。

これがあればわざわざデプロイせずに、ローカル環境でデバッグが出来るので開発速度がグッと上がりそうです。

https://www.serverless.com/plugins/serverless-offline
$ npm install serverless-offline --save-dev
or
$ yarn add serverless-offline --dev

serverlss.ymlのpluginsserverless-offlineを追加してあげます。

serverless.yml

plugins:
  - serverless-offline

プロジェクトルートで下記コマンドを実行すると、ローカル環境のendpointが表示されます。

$ sls offline
Running "serverless" from node_modules

Starting Offline at stage dev (ap-northeast-1)

Offline [http for lambda] listening on http://localhost:3002
Function names exposed for local invocation by aws-sdk:
           * hello: aws-nodejs-http-api-sample-dev-hello

   ┌─────────────────────────────────────────────────────────────────────────┐
   │                                                                         │
   │   GET | http://localhost:3000/                                          │
   │   POST | http://localhost:3000/2015-03-31/functions/hello/invocations   │
   │                                                                         │
   └─────────────────────────────────────────────────────────────────────────┘

Server ready: http://localhost:3000 🚀

remove

プロジェクトルートでこれ↓。LambaからS3からCloudFormationから全部削除されるバルス的なコマンドです。

$ sls remove

Serverless Frameworkの他にもServerless ConsoleやServerless Cloudというツールもありますが、力尽きたのでここまで。


Profile picture

React, Vue, TypeScript, Node.js, PHP, Laravel, AWS, Firebase, Docker, GitHub Actions, etc...