ボーっとしたい

ボーっとするためにメモします。

node.js+AWS SDKでDynamoDBにデータ挿入

やりたかったこと

Amplifyで画面開発したのだが、デフォルトデータをDynamoDBに挿入しないと動かないので、初期のインストール時にデータをinsertしたかった。

サンプルデータの作成

  • 定型のメッセージをDynamoDBに挿入するときに、dict型でデータを持っておきたかった。これは、テストコード流すためでもある。
  • プロジェクトのフォルダ構造はこんな感じ。sample-dataというフォルダを作ってそこで管理
    f:id:kohira_1980:20211030164631p:plain
    フォルダ構造とサンプルデータ
  • 拡張子は.mjs。こうしないとうまくいかなかった。なぜかは話が深くなるからここでは書かない。以下参照。

blog.jxck.io

  • messageData.mjsの中身はこんな感じ
// messageData
function createMessageData(id, a, message) {
    return { id, a, message};
}

export const messageData = [
    createMessageData(
        "id-a",
        "0",
        "やっほー、ボーっとしたいよ!"
    ),
];

データ挿入スクリプトの作成

  • install.mjsというスクリプトを作ってsrcフォルダ配下に配置した(フォルダ構造は上を参照) -スクリプトの中身はこんな感じ
import {messageData} from './sample-data/messageData.mjs';
import AWS from 'aws-sdk';

const aws_profile = process.argv[2]; //スクリプトの引数にaws configファイルのプロファイル名を渡す
let credentials = new AWS.SharedIniFileCredentials({profile: aws_profile });
AWS.config.credentials = credentials;
AWS.config.update({region: 'ap-northeast-1'});
const ddb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

const message_data_tablename = 'messageData'

//insert message data to DynamoDB
for (let item of messageData) {
    let params = {
        ExpressionAttributeNames: {
            "#a": "a",
            "#message": "message",
        },
        ExpressionAttributeValues: {
            ":a": {
                S: item.a
            },
            ":message": {
                S: item.message
            }
        },
        Key: {
            "id": {
                S: item.id
            }
        },
        ReturnValues: "ALL_NEW",
        TableName: message_data_tablename,
        UpdateExpression: "SET #a = :a, #message = :message
    };
    ddb.updateItem(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log("master data insert SUCCESS.");           // successful response
    });
}

スクリプトの実行

  • srcフォルダの1つ上のフォルダで以下を実行する
node --experimental-modules --experimental-json-modules ./src/install.mjs {対象のAWSプロファイル名}

困ったところ、感想

  • node.jsコマンド打つ時、moduleとしてjavascriptを読み込めないとか色々あって、苦戦した。mjsとかよくわからん。おじさんはjavacriptの変貌っぷりについていけていない。
  • 実際はamplify でapi作るとapi_idとかがDDBのテーブル名についてきたりするので、DDB名が環境によって変わってきたりする。amplifyのamplify-meta.jsonからとってきたりして今回はしのいだ。