Serverless FrameworkでLambdaをデプロイする
awsServerless FrameworkでLambda Functionをデプロイする。 Apexが基本的にFunction自体のデプロイしかしないのに対して、こちらはeventの設定なども諸々やってくれて強い。
ApexでLambdaをデプロイする - sambaiz-net
$ npm install -g serverless
$ serverless version
1.26.0
ApexではFunctionごとにディレクトリが作られたが、ServerlessではServiceごとに作られ、 一つのService内で複数のFunctionを定義できる。handlerは同じでも異なっていてもよい。
Apexの形式の場合、共通の処理をWebpackなどで各Functionに持って来たり、 同じような処理の複数のFunctionを立てる際はコピーする必要があったが、 こちらは必要最小限の変更でそれらを行うことができる。
templateからServiceをcreateする。
$ serverless create --template aws-nodejs --path testservice
$ ls testservice/
handler.js serverless.yml
設定ファイルserverless.yml にはLambdaの基本的なもののほかに、VPCやevent、IAM Roleなども書けて、これらはdeploy時に作られるCloudFormationのstackによって管理される。必要なら生のCloudFormationの設定も書ける。
ApexでもTerraformによって管理することができるが、書くのはこちらの方がはるかに楽。
ApexでデプロイしたLambdaのトリガーをTerraformで管理する - sambaiz-net
$ cat sesrverless.yml
service: testservice
provider:
name: aws
profile: foobar
region: ap-northeast-1
runtime: nodejs6.10
memorySize: 512
timeout: 10
functions:
hello:
handler: handler.hello
events:
- http:
path: hello/world
method: get
cors: true
deployすると {service}-{stage}-{function} のFunctionが作られる。 今回の場合はtestservice-prd-test。stageをymlでも指定しなかった場合はデフォルト値のdevになる。
$ serverless deploy --stage prd
$ curl https://*****.ap-northeast-1.amazonaws.com/prd/hello/world | jq
{
"message": "Go Serverless v1.0! Your function executed successfully!",
"input": {
...
}
}
hook
PluginでLifecycle Eventsを拾えるようになっている。
puppeteer-lambda-starter-kitは以前からpackage scriptsがあったので、これをServerlessのpackage時に呼ぶことでServerless Framework対応した。
$ yarn add --dev serverless-hooks-plugin
plugins:
- serverless-hooks-plugin
custom:
hooks:
package:initialize:
- npm run build
とても便利なのでCloudFormationを使いたくないというわけでなければ、Serverless Frameworkを使っておけばよいと思う。