SANDFISH FACTORY

技術ブログです。python・vuejsを愛でる日々について綴ります

Amplify DynamoDB Simulatorを使ってみた

はじめに

仕事ではサーバーサイドがメインなので、サーバレースアーキテクチャはあまり触れてないです。
ただ、少し前にserveless frameworkを触って、「dynamodbのローカルでコントロールできるじゃん。ヒャッハー」って感じで喜んでたんですが、最近はAWS Amplifyに鞍替えしてました。 AWS Amplifyが個人的に熱い感じになっていて、serverless frameworkっぽく操作できるカスタムプラグイン欲しいなと妄想していました。
そういえばserverless frameworkのようにAWS Amplifyにもそういうのないのかなって探してたら、
ありました。

github.com

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」を起動するとこちらも問題なく動くぜ!

f:id:sandfish03:20191027130343p:plain
DynamoDB Local

使ってみた

エラーなく動いているけど、本当に使えるかわからないので、試しに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);
  }
});

こんな感じでブラウザ上にコードを貼り付けるといい感じに動く。

f:id:sandfish03:20191027131846p:plain
create tableを実行してみる

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);
  }
});

成功した!

f:id:sandfish03:20191027132345p:plain
put itemを実行してみる

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'だけど、型が数字だからゼロ埋め消えている。。。)

f:id:sandfish03:20191027132946p:plain
scanを実行してみる

最後に

環境を作ってみて一通り動くところまで確認はできた!
次はsimulatorに内包されているaws clientを用いて操作してみよう。
挫折しなければ、カスタムプラグインでこの辺りをコントロールできるものを作ってみたい。
テーブル定義はOASのSchemaを解析できたらベターかな。。。