0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Lamda→DynamoDBへ接続した際のエラー解決方法

Last updated at Posted at 2024-10-20

今回は、同じリージョンにあるLamdaからDynamoDBへ接続し、データを挿入できたらゴールとなります。

その中で、LamdaからDynamoDBへの接続に手間取ったので解決方法を記載します。

開発環境

  • Lamda
    • ランタイム:Node.js 18
  • DynamoDB

使用していたコード

let doc = require('dynamodb-doc');
let dynamo = new doc.DynamoDB();
exports.handler = function(event, context) {
  // TODOL: テーブル名を確認してください
  let tableName = "test";
  let item = {
    ID: event.ID,
    Message: event.message,
  };
  let params = {
    TableName: tableName,
    Item: item
  };
  dynamo.putItem(params, context.done);
};

こちらの記事を参考にしていました。↓↓↓

今回は、ランタイムにNode.js 18を使用しているため、上記処理だといくつかエラーになる箇所があります。

発生したエラー

require→importへの変更

require is not defined in ES module scope, you can use import instead

  • .mjsでは、ESモジュール導入されているため、require関数が使用できない
  • requireをimportへ変更する

aws-sdkの使用

  • dynamodb-docパッケージは古い方法であり、DynamoDBへアクセスするためにはaws-sdkを使用するのが推奨されている。そのためaws-sdkのDynamoDB(V2)またはDynamoDBClient(V3)を使用する。
// CommonJS (以前の方法)
// let doc = require('dynamodb-doc');
// let dynamo = new doc.DynamoDB();

// ESモジュール
import { DynamoDB } from 'aws-sdk'; //←V2
import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; //←V3

exportsの変更

errorMessage: exports is not defined in ES module scope

exportsがESモジュールでは使用できないために発生しているみたい。

ESモジュールでは、基本exportimportを使用するとのこと。

どうやら、CommonJSのシンタックスがrequireとかexportsのようで、.mjsの拡張子はESモジュールとして認識されるためこのエラーが表示されている。

最終的なコード

import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { PutCommand } from "@aws-sdk/lib-dynamodb";

// DynamoDBのクライアントを作成
const dynamo = new DynamoDBClient({ region: "ap-northeast-1" });

export const handler = async function(event) {

  const tableName = "test";
  const item = {
    ID: Number(event.ID),  // IDを数値に変換
    Message: event.Message,
  };

  const params = {
    TableName: tableName,
    Item: item
  };

  try {
    // データをDynamoDBに挿入するコマンドを作成
    const command = new PutCommand(params);
    
    // コマンドを実行して、DynamoDBにデータを挿入
    await dynamo.send(command);
    
    return {
      statusCode: 200,
      body: JSON.stringify('Item successfully inserted!')
    };
  } catch (error) {
    console.error('Error inserting item:', error);
    return {
      statusCode: 500,
      body: JSON.stringify('Error inserting item')
    };
  }
};

Lamda関数のIAMロールにDynamoDBへの適切なアクセス権限がアタッチされているか

こちらはエラーではありませんが、上記処理にして、テストを実行してもDBにデータが挿入されなかったため、色々調べていたところLamda関数に対しての権限付与が必要だったので記載しました。

IAMロール設定手順

  1. IAM>ロールから今回使用するLamda関数の名前にアクセスをする
    スクリーンショット 2024-10-20 16.21.50.png

  2. 許可ポリシーから、「許可を追加」を選択

  3. 「ポリシーをアタッチ」を選択

  4. 「Dynamo」に関するポリシーを検索
    スクリーンショット 2024-10-20 16.24.47.png

  5. チェックボックスにチェックをし、許可を追加

Lamda関数にポリシーをアタッチすることで、テストを実行したところ、Dynamo DBに対してデータの挿入ができるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?