LoginSignup
42
1

Node18でLambdaからDynamoDBにデータを登録する関数を作ろうとしたら思ったより深い罠にかかった話。

Last updated at Posted at 2023-11-20

前置き

業務で、「LambdaでJsonのデータをもとにDynamoDBにデータを投入する関数を作る」というタスクをいただきました。過去のQiita記事やインターネットの記事を参考にしましたが、どれもうまくいかず…
詳しく調べてみるとNode18ではインターネットに転がっている従来のソースではうまく動作しないことが多いようです。
そこで、本記事では私と同じ問題で躓いている方をお助けできるよう、また、自分の備忘録として、記事として残そうと思います。

結論

結論だけ見たい方、時間がない方向け。
シンプルなサンプルソースとサンプルJSONが以下となります。

サンプルソース

index.mjs

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

export const handler = async (event) => {
  const dynamoDBClient = new DynamoDBClient({ region: "YOUR_REGION" });
  const ddbDocClient = DynamoDBDocumentClient.from(dynamoDBClient);
  try {
    // 受け取ったJSONデータをパース
    const jsonData = JSON.parse(event.body);

    // DynamoDBにデータを格納
    const params = {
      TableName: "YOUR_TABLE_NAME",
      Item: data,
    };
    await ddbDocClient.send(new PutCommand(params));

    return {
      statusCode: 200,
      body: JSON.stringify({ message: "データを格納しました" }),
    };
  } catch (error) {
    console.error("エラー:", error);
    return {
      statusCode: 500,
      body: JSON.stringify({ message: "エラーが発生しました" }),
    };
  }
}

Json

{"jsonData":{"table":"YOUR_TABLE_NAME","data":{"YOUR_KEY":"YOUR_PRAM"}}}

1. LambdaのランタイムがNode16からNode18へバージョンアップされた話

本来、Node16はLTSで2024/4までサポート期間があったのですが、OpenSSL 1.1.1のサポート終了に合わせて終了しました。つまりLambda側からNode18を使えと、お達しが出ました。
これにより、Node18を使うしかなくなったのですが、Node18へバージョンアップされたことで一つ大きな変更が起こりました。それが「AWS SDK」のバージョンがV2からV3へバージョンアップしてしまった、ということです。今まで使っていた require関数 などがいきなり使えなくなってしまったため、一部では大騒ぎだったそうですが…
ここの章では、
LambdaのランタイムがNode16からNode18へバージョンアップされたことで、いままでの関数が使えなくなったということをご理解いただければと思います。
本記事では詳細部分の記載は省きますが、気になった方は調べてみてください。

2. 簡単にソース解説

index.mjs
  const dynamoDBClient = new DynamoDBClient({ region: "YOUR_REGION" });
  const ddbDocClient = DynamoDBDocumentClient.from(dynamoDBClient);

上記の2文で実際にデータを登録するDynamoDBを指定します。
"YOUR_REGION"は皆様が実際に使っている地域を設定してください。
東京リージョンなら"ap-northeast-1"です。

const params = {
  TableName: "YOUR_TABLE_NAME",
  Item: jsonData
};
await ddbDocClient.send(new PutCommand(params));

上記の5行では実際にDynamoDBに投入するデータを指定して、データを投入するソースです。
"YOUR_TABLE_NAME"は皆様が実際にデータを投入したいDBを指定してください。
ItemはJSONで指定した"data"のオブジェクト部分が入ります。

ここで解説していない部分に関しては普通のJSなので、説明は省かせていただきます。

ほかにもデータを取得したりする際にも元々使えていた関数などが使えなくなっておりますので、ぜひ、調べてみていただければと思います。

本記事は以上です、ありがとうございました。

42
1
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
42
1