AWS Cloud9 で API Gateway がらみのテストをする #reinvent
Trigger API Gateway
今回は AWS Cloud9 で Lambda と API Gateway の結合テストを行う方法を紹介します。 ベースの Cloud9 環境は以下のブログで作成したものとなっていますので、ぜひご一読ください。
API Gateway トリガーの Lambda 関数作成
まずは Lambda 関数を作成します。
途中で表示される Function trigger を設定するダイアログでトリガーの設定を行います。 その他のダイアログはデフォルトのままで OK です。
初回デプロイが完了すると、Lambda 関数の他に API Gateway のリソース も自動で作成されます。
コードを書く
今回書いたコードは以下です。
'use strict'; var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient(); exports.handler = (event, context, callback) => { var body = JSON.parse(event.body); var params = { TableName: 'StarWars', Item: { Episode: body.episode, Title: body.title } }; documentClient.put(params, function(err, data) { if (err) { callback('error'); } else { const response = { statusCode: 200, headers: { "Content-type": "application/json" }, body: JSON.stringify( { "params": params } ) }; callback(null, response); } }); };
POST メソッドのリクエストで episode
と title
というパラメータが渡されることを想定しています。
それらの情報から DynamoDB の StarWars テーブルに新たな項目(エピソード)を追加します。
Lambda 関数と API Gateway の結合テスト
API Gateway をトリガーとした Lambda 関数の実行を行います。
Method には POST を指定し、Body には以下の JSON を指定しました。
{ "episode": "8", "title": "The Last Jedi" }
実行すると 200 OK が返ってくることが確認できます。
DynamoDB のテーブルにも期待する項目が追加されました。
ハマリポイント
今回のハマリポイントは 2 つ。
- レスポンスにはキー
statusCode
を含める必要がある(ローカルのみ?) - 含めないと 502 エラーが返ります
- リモートとローカルではペイロードの取り出し方が異なる
- リモートでは関数の第一引数
event
から直接キーを指定して値を取り出せるが、ローカルではbody
というキーに包まれるため 1 階層深くなっている - リモートにデプロイする時は修正が必要
ペイロードの取り出しに関しては 公式ドキュメント にも記載があります。 お気をつけください。
To invoke the preceding Node.js code with Lambda, you must remove the line var body = JSON.parse(event.body) as well as substitute body.fruit and body.vegetable with event.fruit and event.vegetable.
リンク
ミレニアム・ファルコン製作日記 #99
99 号 表紙
パーツ
成果
今回の作業は以下の 4 つでした。
- 船体下部を完成させる
- 着陸脚を取り付ける
- エンジン室カバーをディテールアップする
- 偏向シールド投射装置を取り付ける
船体を裏返してレーザー砲と着陸脚を取り付けました。 これで船体下部は出来上がり! ファルコンも自分で立てるようになりました。
エンジン室カバーのディテールアップも今回で終了! とうとうパーツを取り付ける穴がなくなりました。 長かったけど、出来上がった姿を見ると頑張ったかいがありました。 超カッコイイ!
船体上部にもいくつかパーツを取り付けました。 そして気づいたのですが、まだかなりのパーツ取り付け穴が船体上部にあるんですよね。 あと 1 回なんですけどー
それではまた次回。
May the Force be with you!