Lambdaサンプルソース

API Gateway + Lambda + DynamoDB のサンプルソース(登録・更新)putItem

スポンサーリンク

前説

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テーブル名
TtlTablePeriodTTL(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側で拾う必要がありますが、初期化処理で、

{ ClientRetrun: "NG" }

と初期化を行い、

{ ClientRetrun: "OK" }

後処理で、のように返却するJSONを上書きしているので、後処理で上書きしたJSONを受け取れれば、DynamoDBへの登録に成功している事になります。

 

スポンサーリンク

-Lambdaサンプルソース
-, , , , ,

© 2020 とあるAWSエンジニアの戯言