概要
Serverless Framework v1.0を使って、API Gateway + Lambda + DynamoDBのREST APIをデプロイします。
Serverless Frameworkは、node.jsで動作するサーバーレスアプリケーション管理ツールです。
以下の手順はnode.js及びnpmがインストールされている環境で実施します。
環境のセットアップ
Serverless Frameworkのインストール
npmでserverlessをインストールします。
npm install -g serverless
serverlessコマンドを実行して、コマンド一覧が表示されればOKです。
コマンドのショートカットとして、slsも利用できます。
$ serverless
Commands
...
Serverless Frameworkのプロジェクト作成
プロジェクト用のディレクトリを作成して、移動します。
mkdir serverless-rest-example
cd serverless-rest-example
serverless createコマンドで、テンプレートを作成します。
--template引数でテンプレートを指定します。
ここでは、aws-nodejsを使います。
sls create --template aws-nodejs
コマンドを実行すると、カレントディレクトリに以下のファイルが生成されます。
- serverless.yml: Serverless Frameworkの設定ファイル
- handler.js: lambdaファンクションのサンプルコード
- event.json: ローカル環境でファンクションを実行した時に渡される引数
serverless.ymlの設定
serverless.ymlを編集して、アプリケーションを設定していきます。
アプリケーションの基本設定
-
service:アプリケーション名を設定します。 -
provider:アプリケーションのデプロイ先の設定です。-
name:awsとすると、AWSをデプロイ先として指定します。 -
runtime:lambdaのランタイムを指定します。 -
stage:サービスのステージ名を指定します。 -
region:デプロイ先のAWSリージョンを指定します。
-
serverless.ymlはこんな感じになります。
service: serverless-rest-example
provider:
name: aws
runtime: nodejs4.3
stage: test
region: ap-northeast-1
lambdaファンクションの設定
functions:ディレクティブの下に、lambdaファンクションを追加していきます。
ここでは、helloという名前のlambdaファンクションを追加します。
lambdaファンクションの設定は以下のとおり:
-
handler:lambdaのhandlerの設定です。 -
events:lambdaのトリガーイベントの設定です。-
http:APIGatewayのリクエストをlambdaのトリガーイベントに指定します。 -
path:REST APIのリソースパスを指定します。 -
method:lambdaがコールされるHTTPメソッドを指定します。
-
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: get
- http:
path: hello/{name}
method: get
DynamoDBテーブルの設定
DynamoDBのテーブルをCloudFormationテンプレートで定義します。
以下の例のように、resources:ディレクティブの下に、CloudFormationのテンプレートを書いていきます。
この例では、先ほど設定したservice:ディレクティブの値をプリフィックスにした、usersというテーブルを作成しています。
resources:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
users:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
TableName: ${self:service}_users
lambdaファンクションの作成
lambdaファンクションを作成します。
serverlessコマンドでデプロイしたlambdaファンクションをAPIGatewayで使用する場合、ファンクションの戻り値は以下の形式にします。
{
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
引用:AWS Documentation | Proxy Resourceのプロキシ統合を設定する
serverless.ymlの中で、GET /helloとGET /hello/{name}にlambdaファンクションを紐づけました。
ここでは、GET /helloとすると、Hello World!と返し、GET /hello/{name}とすると、Hello ${name}!返すlambdaファンクションを作成します。
せっかく作ったDynamoDBのテーブルは使用していませんね。
module.exports.hello = (event, context, callback) => {
const pathParameters = event.pathParameters || { name: 'World' };
const response = {
statusCode: 200,
body: JSON.stringify({
message: `Hello ${pathParameters.name}!`,
}),
};
callback(null, response);
};
アプリケーションをデプロイする
serverless deployコマンドでアプリケーションをデプロイします。
アプリケーションをデプロイするには、AWSアカウントへの認証が必要です。
手っ取り早い方法としては、環境変数にAWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYを環境変数に設定する方法があります。
export AWS_ACCESS_KEY_ID=<key>
export AWS_SECRET_ACCESS_KEY=<secret>
serverless deploy
すでにaws cliを使用している環境の場合、aws cliのプロファイルを使用することもできます。
デプロイしたアプリケーションを削除するには、以下のコマンドを実行します。
serverless remove
アプリケーションをローカルで実行する
serverless invokeコマンドで、ローカル環境でファンクションを実行できます。
--functionで指定したファンクションを実行します。
--pathで、実行時にeventに渡す引数のjsonファイルのパスを指定できます。
serverless invoke --function hello --path event.json
サンプルプロジェクト