😊
serverless-expressでAPI GatewayからLambdaを実行する
serverless-expressを利用して、API GatewayからLambdaに配置した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を呼び出す
Discussion
ちょうど困っていた時に、ストライクな記事でした!ありがとうございます!
お役に立ててよかったです!バッチありがとうございます。