13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Serverless Framework v1.0 で serverlessなREST APIをデプロイする方法

13
Last updated at Posted at 2016-11-04

概要

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はこんな感じになります。

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メソッドを指定します。
serverless.yml
functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: hello
          method: get
      - http:
          path: hello/{name}
          method: get

DynamoDBテーブルの設定

DynamoDBのテーブルをCloudFormationテンプレートで定義します。

以下の例のように、resources:ディレクティブの下に、CloudFormationのテンプレートを書いていきます。
この例では、先ほど設定したservice:ディレクティブの値をプリフィックスにした、usersというテーブルを作成しています。

serverless.yml
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 /helloGET /hello/{name}にlambdaファンクションを紐づけました。

ここでは、GET /helloとすると、Hello World!と返し、GET /hello/{name}とすると、Hello ${name}!返すlambdaファンクションを作成します。

せっかく作ったDynamoDBのテーブルは使用していませんね。

handler.js
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_IDAWS_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

サンプルプロジェクト

13
10
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
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?