Serverless FrameworkでLambdaをデプロイする

aws

Serverless 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

PluginLifecycle 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を使っておけばよいと思う。