サーバーレスシステム構築のベストプラクティス! Serverless Frameworkをもっと試してみよう! API GatewayとDynamoDB編

serverless-1-beta-1-01  こんにちは。サーバーワークス こけし部 部長でCS課の坂本(@t_sakam)です。前回に続いて、Serverless Frameworkの話題です。
 前回は、Serverless Frameworkのドキュメントに沿って、簡単に使い方を確かめてみました。今回は、API GatewayやDynamoDBをからめた使い方をみてみたいと思います。
 
serverless-1-beta-1-deploy  Serverless Frameworkを使うと、設定ファイルのserverless.ymlに必要な設定を書いて「serverless deploy」とコマンドを打つだけで、必要なリソースの作成ができます。Lambdaファンクションのデプロイだけでなく、API GatewayとDynamoDBのリソース作成もServerless Frameworkでやってしまいましょう。
 
  1. Serverless Frameworkのアップデート
  2. サービスの作成
  3. 必要なファイルを自動生成
  4. サービスの内容
  5. serverless.ymlの編集
  6. handler.pyの編集
  7. デプロイ
  8. 作成されたリソースの確認
  9. 動作確認
  10. まとめ

1. Serverless Frameworkのアップデート

今回の作業環境

名前 バージョン
OS OS X
Python 2.7.10
aws-cli aws-cli/1.10.36
npm 2.15.5
boto3 1.3.0
httpie 0.9.6
 前回のバージョンは「v1.0.0-beta1.1」でしたが、「v1.0.0-beta2」がリリースされていたので、以下のコマンドでローカル環境のServerless Frameworkをアップデートします。とくにアップデート用のコマンドがないので、前回と同じインストールコマンドでアップデートしましょう。  
 バージョンの確認ができれば、アップデートは成功です。  
 ※前回のクレデンシャル情報の設定では触れていませんでしたが、公式のドキュメントには、作業するユーザーに「AdministratorAccess」権限を付与するように書かれています。Serverless Frameworkは開発途中で、まだ必要な権限が定まらないと書かれているので、今回はいったん指示通り「AdministratorAccess」権限を付与してから作業しましょう。
 

2. サービスの作成

  アップデートできたら、次はサービスを作成します。今回は「こけし」の「工人さん」をデータベースに登録するサービスを作りたいと思います。 サービスの作成といってもやることは、サービス用のディレクトリを作成後、そのディレクトリに入るだけです。
 ※「こけし」の場合は、作る人を「職人さん」ではなく「工人さん」と呼びます。  

3. 必要なファイルを自動生成

 以下のコマンドで必要なファイルを自動生成します。   serverless-1-beta-1-04  
 前回と同様に4つのファイルが自動生成されました。
  1. event.json
  2. handler.py
  3. serverless.env.yml
  4. serverless.yml

4. サービスの内容

 今回は、『API Gawayのエンドポイントにアクセスしたとき、こけし工人さんの「系統」と「名前」のデータをPUTでわたして、DynamoDBに登録する』、という流れのサービスを作りたいと思います。
 ※「こけし」の「系統」についてはWikipediaの「伝統こけしの系統」をご確認ください。
 
serverless-1-beta-1-service  

5. serverless.ymlの編集

 まずは、Serverless Frameworkのメインの設定ファイルであるserverless.ymlを編集します。

serverless.yml

serverless.ymlの説明

provider
 「provider」の「iamRoleStatements」を変更して、DynamoDBにItemが追加できるようにしたいと思います。デプロイしたときに作成されるIAMロールに、ここで指定した権限が追加されます。  
functions
 「functions」でLambdaファンクションの設定とAPI Gatewayの設定をします。まず、「handler」でLambdaファンクションの設定です。「ファイル名.ファンクション名」と設定します。
 「events」でイベントハンドラーを設定します。API GatewayをLambdaファンクションのトリガーにしたい場合は、「-http」と設定します。S3をトリガーにしたい場合は、「- s3」といった形で設定します。「path」は、API Gatewayのエンドポイントのパス、「method」は今回は「PUT」を使うので、「put」と設定します。「GET」や「POST」を使うときはそれぞれ「get」、「post」と設定します。  
resources
 「resources」では、CloudFormationで作成するリソースを設定します。今回はDynamoDBのテーブル「kokeshi_craftsmen」を作成したいので、キーやカラム(アトリビュート)などの情報などをここで設定します。  

6. handler.pyの編集

 次にhandler.pyの編集です。
 
handler.py
handler.pyの説明
 PUTでわたされたデータは「events」の「body」に入っています。PUTでデータがわたってきているかをチェックしたあと、工人さんが作っているこけしの系統のデータと工人さんの名前を、それぞれDynamoDBの「type」と「craftsman」カラム(アトリビュート)に入れる処理をおこなっています。
 

7. デプロイ

 これで設定ファイルとLambdaファンクションが完成したので、デプロイしてみましょう。  
 「Deployment successful!」とメッセージがでたら、成功です。API GatewayのエンドポイントやLambdaファンクションの「arn」が返ってきています。 serverless-1-beta-1-02  

8. 作成されたリソースの確認

 デプロイが成功したら、想定していたリソースが問題なく作成されているか、マネジメントコンソールで確認してみましょう。
 
CloudFormation
 まずは、CloudFormationを確認します。「kokeshi-craftsmen-dev」というスタックが作成されています。  
serverless-1-beta-1-cloudformation.png  
 CloudFormationで作成されたリソースを確認すると、LambdaファンクションやDynamoDBのテーブル、Lambdaファンクションのコードのアップロード先になるS3バケット、IAMやAPI Gatewayのリソースが作成されていることが確認できます。 serverless-1-beta-1-cloudformation-02.png  
IAMロール
 次は、IAMロールを確認します。「kokeshi-craftsmen-dev-IamRoleLambda-XXX...」という名前のロールが作成されています。  
serverless-1-beta-1-iam-role.png  
 上記のロールには以下の「dev-kokeshi-craftsmen-lambda」というポリシーがひもづいています。Serverless Frameworkでデプロイしたときにデフォルトで作成されるCloudWatch Logsのポリシーと、先ほどserverless.ymlで設定したDynamoDBの「PutItem」を許可する設定がきちんとできていることがわかります。 serverless-1-beta-1-iam  
Lambdaファンクション
 次は、Lambdaファンクションです。こちらもserverless.ymlで設定したLambdaファンクションのファイル名とファンクション名の設定である「handler.handler」が設定されています。ロールには先ほど確認した「kokeshi-craftsmen-dev-IamRoleLambda-XXX...」が設定されています。  
serverless-1-beta-1-lambda  
API Gateway
 API Gatewayも確認します。serverless.ymlで設定したエンドポイントのパス「/put」にPUTメソッドが設定されています。  
serverless-1-beta-1-apigateway  
DynamoDB
 最後にDynamoDBを確認します。serverless.ymlで設定した「type」と「craftsman」カラム(アトリビュート)をもった「kokeshi-craftsmen」テーブルが作成されています。  
serverless-1-beta-1-dynamodb-01  

9. 動作確認

 それでは、実際に「こけし」の「工人さん」のデータをPUTしてみたいと思います。今回は「httpie」を使って簡単に確かめます。  以下のコマンドを打って、鳴子系の桜井昭寛工人のデータをDynamoDBに入れます。    
 DynamoDBのマネジメントコンソールを見ると、データが投入されています。 serverless-1-beta-1-dynamodb-02  

10. まとめ

 今回は、Serverless Frameworkを使ってAPI GatewayとDynamoDBをからめたときの設定方法を試してみました。
 serverless.ymlに設定を書いて「serverless deploy」とコマンドを打つだけで、必要なリソースの作成ができてしまうのでとても便利ですね。
 これで、こけし工人さんのデータが簡単に登録できるようになり、個人的にもとても満足です。  
 いや〜、Serverless Frameworkって本当にいいものですね。

AWS運用自動化サービス「Cloud Automator」無料トライアルはこちらから

COMMENT ON FACEBOOK