前説
Lambdaの王道にして、このサンプルを外す訳にはいかないので、まずはココから実際のAWSサービスとの連携例を掲載していこうと思います。
API Gateway側は、パススルーで全てのパラメータをLambdaに流し込む前提でサンプルソースは書いています。
「AWS Lambdaを調べよう!」、という思うキッカケになるもの「API Gateway + Lambda」で利用する例が、一番多いと思います。
githubにて公開
API Gateway + Lambda + DynamoDB のサンプルソースです。ダウンロードは下記より
https://github.com/SyoAwsBlog/ShoLambdaSample03
- TTL(Time to Live)項目の計算設定機能
- API Gatewayから受け取ったリクエスト情報をDynamoDBへ登録
利用可能な環境変数
変数名 | 変数値 |
---|---|
LogLevel | ログの出力レベルを(0~4)までの間で設定する |
TableName | 登録対象のDynamoDBテーブル名 |
TtlTablePeriod | TTL(Time to Live)保存期間(日数)。0より大きいたいを設定した場合有効となる。 |
autoFunctionRetry | 省略したらエラー時再実行はしない。0より大きい値(数字)を設定すると、その回数、再実行を行う |
概要
予告通り、組み上げの雛形として、その1のサンプルソースを利用しています。雛形から転用する際の手順なんかは、別記事で、まとめたいと思います。
処理の大枠は、実行される getTasks を確認する事で分かるようになっています。
サンプルソースから1つ追加して、4つの処理を直列処理する事で成り立っています。
主要な基底処理
AbstractBizDynamoPutCommon
AbstractBizDynamoPutCommon.prototype.AbstractBaseCommon.getTasks = function (
event,
context
) {
var base = AbstractBizDynamoPutCommon.prototype.AbstractBaseCommon;
try {
base.writeLogTrace("AbstractBizDynamoPutCommon# getTasks :start");
return [
base.initEventParameter,
base.beforeMainExecute,
base.businessMainExecute,
base.afterMainExecute,
];
} catch (err) {
base.printStackTrace(err);
throw err;
} finally {
base.writeLogTrace("AbstractBizDynamoPutCommon# getTasks :end");
}
};
- initEventParameter ・・・ API Gatewayから起動引数の取り扱い(おまじない)とブラウザへの戻り値初期化
- beforeMainExecute ・・・ DynamoDBへの登録情報を生成する処理
- businessMainExecute ・・・ DynamoDBへの putItem処理を実行
- afterMainExecute ・・・ ブラウザへの戻り値を成功で上書き
前後に処理を追加した時は、基本的にコピペして関数名を変更して、getTasks に処理を加えるだけで処理を追加する事が可能です。
※ getLastIndexObject で直前の処理結果を参照しているような場合は、間に処理を挟むと前後関係が崩れるので注意
DynamoDBへの登録内容をカスタマイズする場合
SampleBizDynamoPutModule
SampleBizDynamoPutModule.prototype.AbstractBaseCommon.getDynamoDbRequestParamMapping = function (
event,
dynamoRequest
) {
var base = SampleBizDynamoPutModule.prototype.AbstractBaseCommon;
try {
base.writeLogTrace(
"SampleBizDynamoPutModule# getDynamoDbRequestParamMapping : start"
);
var columnA = "XXXXX";
var columnB = "YYYYY";
var columnC = "ZZZZZ";
if ("body-json" in event) {
if ("TestColA" in event["body-json"]) {
columnA = event["body-json"].TestColA;
}
if ("TestColB" in event["body-json"]) {
columnB = event["body-json"].TestColB;
}
if ("TestColC" in event["body-json"]) {
columnC = event["body-json"].TestColC;
}
}
var timestamp = base.getTimeStringJst9(base.getCurrentDate());
dynamoRequest.Item.SortKey = { S: timestamp };
dynamoRequest.Item.PrimaryKey = { S: columnA };
dynamoRequest.Item.ColumnB = { S: columnB };
dynamoRequest.Item.ColumnC = { S: columnC };
return dynamoRequest;
} catch (err) {
base.printStackTrace(err);
throw err;
} finally {
base.writeLogTrace(
"SampleBizDynamoPutModule# getDynamoDbRequestParamMapping : end"
);
}
};
AbstractBizDynamoPutCommon.businessMainExecuteの中からカスタマイズ用に、getDynamoDbRequestParamMappingを実行するようにしてあるので、SampleBizDynamoPutModuleでオーバーライドする事で、DynamoDBの登録内容を変更する事ができます。
API Gatewayでリクエスト情報をパススルーで全流しした場合は、「body-json」配下にブラウザが送信した情報が入ってくるので、そこからマッピングする前提です。
ブラウザ(クライアント)での成功・失敗の判断
Lambdaの処理そのものの失敗は、API Gateway側で拾う必要がありますが、初期化処理で、
と初期化を行い、
後処理で、のように返却するJSONを上書きしているので、後処理で上書きしたJSONを受け取れれば、DynamoDBへの登録に成功している事になります。