LoginSignup
0
2

More than 3 years have passed since last update.

Serverless Frameworkで複数のLambdaを管理する

Last updated at Posted at 2021-01-25

やったこと

  • Serverless Framework を使って、API Gateway + LambdaでAPIを作りました。
    • 一つのAPI Gatewayでリソースが違うpathに対してLambdaを振り分けるようにした。
      https://hoge/v1/fun1 にリクエストがきたら Lambda1 をinvokeして
      https://hoge/v1/fun2 にリクエストがきたら Lambda2 をinvokeする
      みたいな感じです。

追記

validationもしてみました。
express-validatorでvalidationしてみた。

Serverless Framework

Serverless Framework Open Source lets you develop and deploy serverless applications to AWS, Azure, GCP & more. Use it with Pro for full serverless application lifecycle management.

Serverless Frameworkはサーバーレスアプリケーションの開発、AWS,Azure,GCPなどへのデプロイができるフレームワークです。

今回はAWSへのデプロイをします。

API Gateway + LambdaでAPIを作るのはよくある構成なので、フレームワークでパパッとできるのは助かるところです。

やってみる

Serverless Frameworkの導入
https://www.serverless.com/framework/docs/getting-started/

$ npm install -g serverless

AWS のcredential設定
https://www.serverless.com/framework/docs/providers/aws/guide/credentials/

$ serverless config credentials --provider provider --key key --secret secret

sls createをするとServerless Frameworkが用意しているテンプレートが作成されますが
今回はserverless-expressを使うので、このテンプレートは使わずに、
https://zenn.dev/yuta_saito/articles/8b543a1957c375593ee5
に書いてあるものを参考にして作りました。

lambda.jsが書いてある通りでは動かなかったので、その部分については
https://github.com/vendia/serverless-express#minimal-lambda-handler-wrapper を参考にすれば動きました。

単一のLambdaを作るのはこれでいいでしょう。
簡単ですね。

複数のLambdaを作りたいときはserverless.ymlのfunctionsを以下のようにすることで複数のlambdaを追加することができるらしい
https://www.serverless.com/framework/docs/providers/aws/guide/functions/

# serverless.yml

service: myService

provider:
  name: aws
  runtime: nodejs12.x

functions:
  functionOne:
    handler: handler.functionOne
    description: optional description for your Lambda
  functionTwo:
    handler: handler.functionTwo
  functionThree:
    handler: handler.functionThree

ということで、最終的なserverless.ymlは以下

service: serverless-express-test

provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-1

package:
  exclude:
    - .git/**
    - test/**
    - README.md

functions:
  serverlessTest1:
    handler: lambda.handler1
    events:
      - http: ANY /v1/fun1
      - http: 'ANY /v1/fun1/{proxy+}'
  serverlessTest2:
    handler: lambda.handler2
    events:
      - http: ANY /v1/fun2
      - http: 'ANY /v1/fun2/{proxy+}'

ファイル構造はこんな感じになりました。

.
├── README.md
├── functions
│   ├── function1
│   │   ├── app.js
│   │   ├── local-app.js
│   │   └── routes
│   │       └── router.js
│   └── function2
│       ├── app.js
│       ├── local-app.js
│       └── routes
│           └── router.js
├── lambda.js
├── package.json
├── serverless.yml
└── yarn.lock

lambda.jsが以下のようになりました。

const serverlessExpress = require('@vendia/serverless-express')
const lambda1 = require('./functions/function1/app')
const lambda2 = require('./functions/function2/app')

exports.handler1 = serverlessExpress({ app: lambda1 }).handler

exports.handler2 = serverlessExpress({ app: lambda2 }).handler

一応最終的なものはGitHubにあげておきます。
https://github.com/Ntakato/slsTutorial/tree/f1b17d6bd222cacf8d01ba2561c30171ba148306

これで

$ sls deploy

をすれば、AWSにAPI GatewayとLambdaが2つ作られます。

感想

Serverless Frameworkを使えばAPI Gateway + LambdaでAPIを簡単にぱぱっと作れることがわかりました。
便利ですね。
ただ、この方法で複数のLambdaを作ると、Lambda1にLambda2のコードも含んでしまうなぁ。

追記

# serverless.yml
...
package:
  exclude:
    - .git/**
    - test/**
    - README.md
    - functions/**
...
functions:
  serverlessTest1:
    handler: functions/function1/lambda.handler
    package:
      include: 
        - functions/function1/**
      individually: true 
    events:
      - http: ANY /fun1/v1/user
...

みたいな感じでpackageでexcludeして、個別にlambdaに必要な部分をincludeすれば必要なところだけlambdaのコードとしてアップロードできました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2