Amplify DynamoDB Simulatorを使ってみた
はじめに
仕事ではサーバーサイドがメインなので、サーバレースアーキテクチャはあまり触れてないです。
ただ、少し前にserveless frameworkを触って、「dynamodbのローカルでコントロールできるじゃん。ヒャッハー」って感じで喜んでたんですが、最近はAWS Amplifyに鞍替えしてました。 AWS Amplifyが個人的に熱い感じになっていて、serverless frameworkっぽく操作できるカスタムプラグイン欲しいなと妄想していました。
そういえばserverless frameworkのようにAWS Amplifyにもそういうのないのかなって探してたら、
ありました。
DynamoDB自体のjarはAWSが公開しているので、自分でもゴニョゴニョできるかなと思いましたが、ここは先人の知恵を拝借。
環境
今回は以下の環境で試しました。ちなみにNode.jsはv8の場合はv8.12以上じゃないと動かないです。
- macOS Mojave
- Node.js:v8.12.0
- Yarn:1.17.0
インストールしてみる
ただ入れるだけです。
mkdir amplify-dynamodb cd amplify-dynamodb yarn add amplify-dynamodb-simulator
動かしてみた
よーし。動かしてみるぞーとREADMEを見てみたら、明朗すぎやしませんか?って感じ。
↓はREADME.mdのUsageの内容。
const emulator = require('amplify-dynamodb-simulator'); async function main() { // start the emulator const emu = await emulator.launch({ /* options */ }); // by default we launch the emulator on some open port in the ephemeral range in the 'inMemory' mode. // get the dynamodb client (aws-sdk) const dynamodb = emulator.getClient(emu); }
少しいじってみる。
ディレクトリの直下にmain.jsを作ってみる。
// main.js const emulator = require('amplify-dynamodb-simulator'); async function main() { await emulator.launch({}); } console.log("simulator launch") main().then(() => { console.log("simulator start OK!!"); }).catch(error =>{ console.log("simulator start NG!!"); console.log(JSON.stringify(error)); });
実行してみると
node main.js
問題なく動く。
DynamoDBのshellも叩きたいので、ソース見たらデフォルトでは62224ポート使っているみたいなので、ブラウザで「http://localhost:62224/shell」を起動するとこちらも問題なく動くぜ!
使ってみた
エラーなく動いているけど、本当に使えるかわからないので、試しにAWSのマニュアルにあるDynamoDBの使い方をベースに使ってみる。
create tableしてみた
まずはここのAWSのドキュメントを参考にshellで試してみた。
エンドポイントはsimulator側をみてもらいたいので、そこはゴニョゴニョする。
AWS.config.endpoint = new AWS.Endpoint('http://localhost:62224'); var ddb = new AWS.DynamoDB(); var params = { AttributeDefinitions: [ { AttributeName: 'CUSTOMER_ID', AttributeType: 'N' }, { AttributeName: 'CUSTOMER_NAME', AttributeType: 'S' } ], KeySchema: [ { AttributeName: 'CUSTOMER_ID', KeyType: 'HASH' }, { AttributeName: 'CUSTOMER_NAME', KeyType: 'RANGE' } ], ProvisionedThroughput: { ReadCapacityUnits: 1, WriteCapacityUnits: 1 }, TableName: 'CUSTOMER_LIST', StreamSpecification: { StreamEnabled: false } }; // Call DynamoDB to create the table ddb.createTable(params, function(err, data) { if (err) { console.log("Error", err); } else { console.log("Table Created", data); } });
こんな感じでブラウザ上にコードを貼り付けるといい感じに動く。
put Itemしてみた
次はこのAWSのドキュメントを参考にshellで試してみた。
AWS.config.endpoint = new AWS.Endpoint('http://localhost:62224'); var ddb = new AWS.DynamoDB(); var params = { TableName: 'CUSTOMER_LIST', Item: { 'CUSTOMER_ID' : {N: '001'}, 'CUSTOMER_NAME' : {S: 'Richard Roe'} } }; // Call DynamoDB to add the item to the table ddb.putItem(params, function(err, data) { if (err) { console.log("Error", err); } else { console.log("Success", data); } });
成功した!
scanしてみた
最後はこのAWSのドキュメントを参考にshellで試してみた。
AWS.config.endpoint = new AWS.Endpoint('http://localhost:62224'); var ddb = new AWS.DynamoDB(); var params = { ProjectionExpression: 'CUSTOMER_ID, CUSTOMER_NAME', TableName: 'CUSTOMER_LIST' }; ddb.scan(params, function(err, data) { if (err) { console.log("Error", err); } else { console.log("Success", data.Items); } });
成功した!!
(けどAWSのマニュアルがIDが'001'だけど、型が数字だからゼロ埋め消えている。。。)
最後に
環境を作ってみて一通り動くところまで確認はできた!
次はsimulatorに内包されているaws clientを用いて操作してみよう。
挫折しなければ、カスタムプラグインでこの辺りをコントロールできるものを作ってみたい。
テーブル定義はOASのSchemaを解析できたらベターかな。。。