はじめに
残念ながら、enebularが提供するクラウド実行環境だけではデータの保存をすることができません。
本記事では、データの保存先としてAWSのDynamoDBを利用する方法を紹介します。
DynamoDBが動作するAWS環境は、ユーザー自身で準備頂く必要があります。
ユーザーはそのAWS環境でDynamoDBのテーブル作成と、DynamoDBにアクセス可能なユーザーを予め作成頂き、アクセスキーとシークレットキーを準備します。
クラウド実行環境で動作するNode-REDフローに、そのアクセスキーとシークレットアクセスキーをセットすることでDynamoDBへのアクセスを可能にします。
AWS環境準備
ユーザーのAWS環境にDynamoDBのテーブルおよびDynamoDBにアクセス可能なユーザーの追加を行います。
DynamoDBのテーブル作成
AWSのコンソールにログインし、サービスの一覧からDynamoDBを選択し、ダッシュボード画面を表示します(右上のメニューから利用したいリージョンも選択してください)。
サイドメニューのテーブル
をクリックし、表示された画面でテーブルの作成
ボタンを押してください。
この記事ではsample-table
というテーブルを作成し、パーティションキーはid
(データの種類を格納)、ソートキーはts
(登録時刻を格納)としました。
テーブル設定はデフォルト設定
にします。
テーブルの作成
ボタンを押すとテーブルが作成されます。
DynamoDBにアクセスするユーザー作成
次に、DynamoDBにアクセスするユーザーを作成します。
AWSのサービスの一覧からIAMを選択し、ダッシュボードを表示します。
サイドメニューのユーザー
をクリックし、ユーザーの一覧画面上部のユーザーを追加
ボタンをクリックします。
ユーザー名はsample-dynamodb-user
としました。
このユーザーは、プログラムから利用するユーザーであるため、アクセスキー - プログラムによるアクセス
にのみチェックを入れ、次のステップ:アクセス権限
ボタンを押します。
以下の画面が表示されるため、既存のポリシーを直接アタッチ
を選択し、ポリシーのフィルタにdynamodb
と入力し、AmazonDynamoDBFullAccess
にチェックを入れます。
次のステップ:タグ
ボタンをクリックします。
必要に応じタグを入力し、次のステップ:確認
ボタンをクリックしてください。
設定を確認し、問題なければユーザーの作成
ボタンをクリックしてください。
以下の画面が表示されたら、.csvのダウンロード
ボタンをクリックしてください。
アクセスキーとシークレットアクセスキーを含むファイルがダウンロードされました。アクセスキーとシークレットアクセスキーは、のちほどNode-REDフローに組み込んで利用します。
これでユーザーの作成は完了です。
Node-REDフローの作成
enebularで、DynamoDBにアクセスするNode-REDのサンプルフローを作成します。
今回は、以下を実施するサンプルを作成します。
- DynamoDBに以下のデータを書き込みます
- id: AまたはB
- ts: 現在時刻(ミリ秒数)
- value: 0〜100のランダムな値
- 上記書き込みが終わった後に直近1時間の間に書き込まれたデータを検索し、データ数をカウントします
- 結果はクラウド実行環境のログに出力します
作成するフローの全体像
- 起点は
LCDP
ノードです -
ダミーデータ作成
ではidがAまたはB、tsが現在時刻、valueにランダムな値を含むデータを作成します -
DynamoDB PutItem
では、DynamoDBに上記データを書き込みます - 成功すると、
Aの検索条件
で、直近1時間に書き込まれたidがAのデータを検索する条件を作成します -
DynamoDB Query
で、上記条件を実行し、検索結果を取得します - 成功したら
Aの検索結果
で検索結果のデータ件数をログに出力し、Bの検索を実施します(Aと同様です)
lcdp-toolkitノードのインポート
enebularにログインし、プロジェクトの作成を行います。
プロジェクトが作成できたら、クラウド実行環境を利用するために必要となるlcdp-toolkit
ノードをインポートします。
enebular上部のDiscover Assets
をクリックし、検索欄にlcdp-toolkit
を入力し、名称を選択すると以下のプライベートノードが見つかります。
カードをクリックし、上部のインポート
ボタンを押し、インポート先のプロジェクトを選択したら、そのプロジェクトへのインポートが実施されます。
フローの作成
フローを作成すると以下の画面が表示されるので、右の編集
ボタンを押します。
DynamoDBにアクセスするためのノードのインストール
ノードを追加
タブを選択し、ノードを検索
欄にdynamodb
と入力すると候補が表示されます。
今回は、比較的更新時期が新しいnode-red-contrib-aws
を利用することにしました。
ノードを追加
ボタンを押し、インストールを行います。
インストールが成功すると、左側のパレットに複数のAWSの関連ノードが追加されます。この中からAWS DynamoDB
ノードをドラッグ&ドロップでキャンバスに表示し、ダブルクリックします。
AWS欄の右の鉛筆アイコンをクリックし、AWSのアクセス情報を入力します。
以下の情報を入力してください。
- Region: 利用するDynamoDBのリージョン
- Access Id: AWSに追加したユーザーのアクセスキー(ダウンロードしたcsvファイルを参照)
- Secret Key: AWSに追加したユーザーのシークレットアクセスキー(ダウンロードしたcsvファイルを参照)
DynamoDBへの書き込みと読み込み
DynamoDBのプロパティのOperationをクリックするとDynamoDBに対して実施したい処理を選択できます。
今回、書き込みには、PutItem
、読み込みにはQuery
を利用します。
PutItem
ダミーデータ作成
はfunctionノードです。
以下の処理を実行することでDynamoDB PutItem
に入力するmsgを作成します。
msg.TableName = "sample-table";
const TYPES = ["A", "B"];
const value = Math.random() * 100;
msg.Item = {};
msg.Item.id = { S: TYPES[Math.floor(Math.random()*TYPES.length)]};
msg.Item.ts = { N: String(Date.now())};
msg.Item.value = { N: String(value)};
return msg;
上記処理にて作成されるmsgは以下となります。
Query
Aの検索条件
およびBの検索条件
はfunctionノードです。
以下の処理を実行することでDynamoDB Query
に入力するmsgを作成します。
msg.TableName = "sample-table";
const from = Date.now() - 3600 * 1000;
const to = Date.now();
msg.KeyConditionExpression = "id = :id and ts BETWEEN :from AND :to";
msg.ExpressionAttributeValues = {
":id": { "S": "A"},
":from": { "N": String(from) },
":to" : { "N": String(to) }
};
return msg;
実行した結果の例は以下です。
[
{
"ts":{"N":"1671555043805"},
"value":{"N":"42.92672704782301"},
"id":{"S":"A"}
},
{
"ts":{"N":"1671557874922"},
"value":{"N":"12.97791476304242"},
"id":{"S":"A"}
}
]
ここで紹介するフローはenebularのDiscover Assetsに公開(下記リンク参照)しましたのでご利用ください。
sample-dynamodb
クラウド実行環境で実行
作成したフローをクラウド実行環境にデプロイし、動作させます。
今回は、20分に一回、スケジュール実行するようにしました。
クラウド実行環境の作成
enebularのサイドメニューのクラウド実行環境
をクリックします。
クラウド実行環境の一覧画面が表示されるので、右下の+
ボタンをクリックします。
作成する実行環境の名称を入力(今回はsample-dynamodb-ee
としました)し、OK
ボタンをクリックするとクラウド実行環境が作成されます。
クラウド実行環境が作成されたら、上部の設定
タブをクリックし、スケジュール実行の設定を行います。
設定画面上部の設定を編集する
リンクをクリックすると、設定を編集できるようになります。
スケジュールトリガーをONにし、毎時0分、20分、40分に実行されるように設定を行います。
クラウド実行環境へのデプロイ
作成したNode-REDフローをクラウド実行環境にデプロイします。
作成したフローの概要画面の右にあるデプロイ
ボタンをクリックします。
以下のダイアログが表示されるので、クラウド実行環境を選択
ボタンをクリックします。
デプロイ対象を選択し、デプロイ
ボタンをクリックするとクラウド実行環境へのデプロイが開始します。
実行結果の確認
クラウド実行環境のログ
タブを選択sうることで実行ログを確認できます。
ログから、毎時、0分、20分、40分に実行されていることが分かるかと思います。
また、登録成功やA、B各々の直近1時間以内の検索結果数も確認できます。
まとめ
enebularは、データを保存する機能を提供していないため、データの保存を行いたい場合、外部のデータストアサービスを組み合わせて実現する必要があります。
データストアサービスは、種類に応じ多様な特徴を持っているため、実現したいアプリに応じてマッチするデータストアサービスの検討が必要です。
もし、作成したいアプリのデータストアとしてDynamoDBがマッチする場合には、本サンプルが開発の参考になれば幸いです。