AWSLambdaとDynamoDBのNull応答

Sep 16 2020

Lambda関数からDynamoDBテーブルに書き込もうとしています。関数をテスト実行すると、nullが返され、エラーメッセージは表示されず、テーブルには何も書き込まれません。機能は以下の通りです。'Products'テーブルへのアクセスを許可する権限ポリシーを使用して、この関数のサービスロールを既に設定しました。「AWSLambdaアプリケーション」を作成してからLambda関数を作成することについて言及しているチュートリアルを見たことがありますが、これが私の使用に必要であるとは思いませんでした。

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

  dynamodb.putItem({
      TableName: "Products",
      Item: {
          "sku": {S: "29574839"},
          "name": {S: "Test Code"}
      }
  }, function(err, data) {
      if (err) {
          console.log(err, err.stack);
          return callback(null, {
              statusCode: '500',
              body: err
          });
      } else {
          return callback(null, {
              statusCode: '200',
              body: 'Adding to table!'
          });
      }
  });

};

また、ドキュメントクライアントconst docClient = new dynamodb.DocumentClient();を使用しようとしましたが、「dynamodb.DocumentClientはコンストラクターではありません」というエラーが表示されます。

ここで何が欠けていますか?ありがとう!

CloudWatchログが表示されます(リクエストIDを削除しました):関数ログ:START RequestId:バージョン:$ LATEST END RequestId:REPORT RequestId:期間:491.07ミリ秒請求期間:500ミリ秒メモリサイズ:128 MB最大使用メモリ:87 MB初期期間: 405.37ミリ秒

回答

2 Marcin Sep 16 2020 at 06:15

非同期ハンドラーを使用しているので、問題は、ハンドラーの本体が実行される前に関数が完了することだと思います。

これを修正する1つの方法はPromise、AWSのドキュメントに示されているようにを使用することです。例えば:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = async (event, context, callback) => {

    const promise = new Promise(function(resolve, reject) {

      dynamodb.putItem({
          TableName: "Products",
          Item: {
              "sku": {S: "29574839"},
              "name": {S: "Test Code"}
          }
      }, function(err, data) {
          if (err) {
              console.log(err, err.stack);
              return callback(null, {
                  statusCode: '500',
                  body: err
              });
          } else {
              return callback(null, {
                  statusCode: '200',
                  body: 'Adding to table!'
              });
          }
      });
  })

  return promise;   
};

上記の変更は単なる例示であり、したがって、おそらくいくつかの調整が依然として必要です。