node.js+AWS SDKでDynamoDBにデータ挿入
やりたかったこと
Amplifyで画面開発したのだが、デフォルトデータをDynamoDBに挿入しないと動かないので、初期のインストール時にデータをinsertしたかった。
サンプルデータの作成
- 定型のメッセージをDynamoDBに挿入するときに、dict型でデータを持っておきたかった。これは、テストコード流すためでもある。
- プロジェクトのフォルダ構造はこんな感じ。sample-dataというフォルダを作ってそこで管理
- 拡張子は
.mjs
。こうしないとうまくいかなかった。なぜかは話が深くなるからここでは書かない。以下参照。
- messageData.mjsの中身はこんな感じ
// messageData function createMessageData(id, a, message) { return { id, a, message}; } export const messageData = [ createMessageData( "id-a", "0", "やっほー、ボーっとしたいよ!" ), ];
データ挿入スクリプトの作成
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プロファイル名}