serverless-expressでAPI GatewayからLambdaを実行する

公開:2020/12/29
更新:2020/12/30
4 min読了の目安(約4000字TECH技術記事

serverless-expressを利用して、API GatewayからLambdaに配置したExpressアプリケーションを実行する方法になります。

ExpressをServerlessに実行する方法として、2020/11/30まではaws-serverless-expressというパッケージで実現していましたが、@vendia/serverless-expressというパッケージに変更になりました。
今回の記事は@vendia/serverless-expressを利用したものになります。

初期設定

では早速環境を作っていきます。

各種パッケージのインストール

$ mkdir serverless-tutorial
$ cd serverless-tutorial
$ npm init
$ npm install express --save
$ npm install @vendia/serverless-express

ソースの作成

まずはExpressの設定です。

app.js
const express = require('express');
const app = express();

const router = require('./routes/router');

app.use('/', router);

module.exports = app;

続いてはLambdaで実行する際のハンドラー設定です。

lambda.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')

const server = serverlessExpress.createServer(app)

exports.handler = (event, context) => serverlessExpress.proxy(server, event, context)

こちらはローカルで実行する際の設定になります。

local-app.js
const app = require('./app')

app.listen(3000, () => {
    console.log('listening');
})

最後にルーティングの設定です。

routes/router.js
const express  = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.json({message : 'Hello World!'});
});
router.get('/users', (req, res) => {
    res.json([{name: 'Taro'}, {name: 'Hanako'}]);
});

module.exports = router;

ローカル実行

ローカルで実行してみます。
ローカルで実行するためにpackage.jsonを修正しておきます。

package.json

package.json
{
  // 中略
  "scripts": {
    "start": "node local-app"
  },
  // 中略
}

テスト

では実行します。
ちなみにpackage.jsonを直さずnode local-appでも全然いいです。

$ npm start

> serverless-tutorial@1.0.0 start ...../serverless-tutorial
> node local-app

listening

$ curl localhost:3000
{"message":"Hello World!"}

このようにローカルで実行できることが確認できました。

API Gatewayにデプロイ

続いてAPI Gateway にデプロイしていきます。

yamlファイルの作成

serverless.ymlを作成します。

serverless.yml
service: serverless-express-test

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

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

functions:
  serverlessTest:
    handler: lambda.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

deploy

もうこれだけでOKです。
あとはデプロイするのみです。

$ sls deploy
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
........
Serverless: Stack create finished...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service serverless-express-test.zip file to S3 (719.44 KB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.................................
Serverless: Stack update finished...
Service Information
service: serverless-express-test
stage: dev
region: ap-northeast-1
stack: serverless-express-test-dev
resources: 12
api keys:
  None
endpoints:
  ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
  ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+}
functions:
  serverlessTest: serverless-express-test-dev-serverlessTest
layers:
  None
Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing.

curlテスト

curlしてデプロイした結果を確認します。
URLは上記のsls deployで返却されたURLになります。

$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
{"message":"Hello World!"}
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/users
[{"name":"Taro"},{"name":"Hanako"}]

serverless-expressからDynamoDBに接続する記事も書いていますので、興味がある方はどうぞ。
serverless-expressからDynamoDBを呼び出す

参考情報

GitHub vendia/serverless-express
Serverless.yml Reference