Node.js環境下のJavaScriptでDynamoDBと接続する方法について、実装の際に少し詰まったのでまとめます。
※2019年6月時点の内容となります。
#環境
Mac、ローカル環境からの接続を想定しています。
プログラムが、AWS上ですでに動いている場合は、IAMロール等での設定が好ましいかと思いますが、今回はその説明は割愛します。
IAMロールを使用した際でも、aws-sdkが優先順位をつけて、良しなに接続を切り替えてくれるのでソースコードの修正は発生しないと思います。
#モジュールのインストール
aws-sdkを用いて接続する為、aws-sdkモジュールをインストールします。
npm install --save aws-sdk
#DynamoDBへの接続情報を設定
aws-sdkがルート配下の.awsフォルダのcredentialsを参照して、dynamoDBへの接続情報を取得してくれます。
以下の通り、接続情報を設定します。
~$ mkdir .aws
~$ cd .aws
.aws $ vi credentials
[default]
aws_access_key_id = dynamodbのaccess_key_id
aws_secret_access_key = dynamodbのsecret_access_key
dynamodbのアクセスキーとシークレットアクセスキーの取得方法は割愛します。
#実装
実装する際のソースコードサンプルです。
##Serviceの実装
まずはaws-sdkのrequireと各種設定部分を記載します。
const AWS = require('aws-sdk');
AWS.config.update({region: 'ap-northeast-1'});
const docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});
class ServiceDynamoDB {
...
}
この辺りの記述方法は複数ありますが、一番推奨されていそうなDocumentClientを利用しています。
apiVersionはDynamoDBのバージョンを固定できます。環境に合わせて修正してください。
###DynamoDBの特定のテーブルへのデータの挿入
サービス側の実装ですので、テーブル名やキー項目、データ項目は引数で受け取るようにしています。
class ServiceDynamoDb {
static async put_item (table, items) {
let params = {
TableName: table, // 格納したいテーブル名
Item: {
'id': items.keys.id,
'sortKey': items.keys.sort_key,
'data': items.data
}
}
await docClient.put(params, function(err, data) {
// エラー処理
if (err) {
throw new Error(`Failed to save data to DynamoDB. ${err.message}`);
}
});
}
...
}
###DynamoDBの特定のテーブルへのデータの更新
更新も同様に実装。削除や他の操作は今回やらなかったので割愛します。
class ServiceDynamoDb {
...
static async update_item (table, items) {
let params = {
TableName: table,
Key: {
'id' : items.keys.id,,
'sortKey' : items.keys.sort_key
},
UpdateExpression: 'set data = :s',
ExpressionAttributeValues: {
':s' : items.data,
}
};
await docClient.update(params, function(err, data) {
if (err) {
throw new Error(`Failed to save data to DynamoDB. ${err.message}`);
}
});
}
}
##呼び出し元の実装
作ったサービスを呼び出し、使用してみます。
const DynamoDB = require("ServiceDynamoDb"); // パスはServiceを置いた場所
//データの作成
let items = {
keys: {
id: "xxxxxx",
sort_key: "xxxxxxx" // id、sort_keyで一意
},
data: "おはようございます"
};
// データの挿入
await DynamoDB.put_item("テーブル名", items);
// データの修正
items.data: "こんにちは"
// データの更新
await DynamoDB.update_item("テーブル名", items);
#まとめ
DynamoDBへの接続方法のまとめでした。
色々と接続方法はあると思いますので、接続方法の一例と考えていただければと思います。