1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

enebular_uhuruAdvent Calendar 2022

Day 20

enebularのクラウド実行環境からDynamoDBを利用してみる

Last updated at Posted at 2022-12-21

はじめに

残念ながら、enebularが提供するクラウド実行環境だけではデータの保存をすることができません。
本記事では、データの保存先としてAWSのDynamoDBを利用する方法を紹介します。

以下に本記事で作成するシステムの構成を示します。
image.png

DynamoDBが動作するAWS環境は、ユーザー自身で準備頂く必要があります。
ユーザーはそのAWS環境でDynamoDBのテーブル作成と、DynamoDBにアクセス可能なユーザーを予め作成頂き、アクセスキーとシークレットキーを準備します。

クラウド実行環境で動作するNode-REDフローに、そのアクセスキーとシークレットアクセスキーをセットすることでDynamoDBへのアクセスを可能にします。

AWS環境準備

ユーザーのAWS環境にDynamoDBのテーブルおよびDynamoDBにアクセス可能なユーザーの追加を行います。

DynamoDBのテーブル作成

AWSのコンソールにログインし、サービスの一覧からDynamoDBを選択し、ダッシュボード画面を表示します(右上のメニューから利用したいリージョンも選択してください)。

サイドメニューのテーブルをクリックし、表示された画面でテーブルの作成ボタンを押してください。
image.png

テーブルの詳細情報を入力してください。
image.png

この記事ではsample-tableというテーブルを作成し、パーティションキーはid(データの種類を格納)、ソートキーはts(登録時刻を格納)としました。
テーブル設定はデフォルト設定にします。

テーブルの作成ボタンを押すとテーブルが作成されます。

作成されたテーブルは、以下のように一覧に表示されます。
image.png

DynamoDBにアクセスするユーザー作成

次に、DynamoDBにアクセスするユーザーを作成します。
AWSのサービスの一覧からIAMを選択し、ダッシュボードを表示します。

サイドメニューのユーザーをクリックし、ユーザーの一覧画面上部のユーザーを追加ボタンをクリックします。
image.png

ユーザー名はsample-dynamodb-userとしました。
このユーザーは、プログラムから利用するユーザーであるため、アクセスキー - プログラムによるアクセスにのみチェックを入れ、次のステップ:アクセス権限ボタンを押します。

以下の画面が表示されるため、既存のポリシーを直接アタッチを選択し、ポリシーのフィルタにdynamodbと入力し、AmazonDynamoDBFullAccessにチェックを入れます。
image.png

次のステップ:タグボタンをクリックします。
必要に応じタグを入力し、次のステップ:確認ボタンをクリックしてください。
image.png

設定を確認し、問題なければユーザーの作成ボタンをクリックしてください。
image.png

以下の画面が表示されたら、.csvのダウンロードボタンをクリックしてください。
image.png

アクセスキーとシークレットアクセスキーを含むファイルがダウンロードされました。アクセスキーとシークレットアクセスキーは、のちほどNode-REDフローに組み込んで利用します。
これでユーザーの作成は完了です。

Node-REDフローの作成

enebularで、DynamoDBにアクセスするNode-REDのサンプルフローを作成します。

今回は、以下を実施するサンプルを作成します。

  • DynamoDBに以下のデータを書き込みます
    • id: AまたはB
    • ts: 現在時刻(ミリ秒数)
    • value: 0〜100のランダムな値
  • 上記書き込みが終わった後に直近1時間の間に書き込まれたデータを検索し、データ数をカウントします
  • 結果はクラウド実行環境のログに出力します

作成するフローの全体像

今回作成するフローの全体像を先に説明します。
image.png

  1. 起点はLCDPノードです
  2. ダミーデータ作成ではidがAまたはB、tsが現在時刻、valueにランダムな値を含むデータを作成します
  3. DynamoDB PutItemでは、DynamoDBに上記データを書き込みます
  4. 成功すると、Aの検索条件で、直近1時間に書き込まれたidがAのデータを検索する条件を作成します
  5. DynamoDB Queryで、上記条件を実行し、検索結果を取得します
  6. 成功したらAの検索結果で検索結果のデータ件数をログに出力し、Bの検索を実施します(Aと同様です)

lcdp-toolkitノードのインポート

enebularにログインし、プロジェクトの作成を行います。
プロジェクトが作成できたら、クラウド実行環境を利用するために必要となるlcdp-toolkitノードをインポートします。
enebular上部のDiscover Assetsをクリックし、検索欄にlcdp-toolkitを入力し、名称を選択すると以下のプライベートノードが見つかります。
image.png

カードをクリックし、上部のインポートボタンを押し、インポート先のプロジェクトを選択したら、そのプロジェクトへのインポートが実施されます。

フローの作成

次に、フローの作成を行います。
image.png

フローを作成すると以下の画面が表示されるので、右の編集ボタンを押します。
image.png

フローエディタが起動します。
image.png

DynamoDBにアクセスするためのノードのインストール

右上のハンバーガーメニューからパレットの管理を選択します。
image.png

ノードを追加タブを選択し、ノードを検索欄にdynamodbと入力すると候補が表示されます。
image.png

今回は、比較的更新時期が新しいnode-red-contrib-awsを利用することにしました。
ノードを追加ボタンを押し、インストールを行います。
インストールが成功すると、左側のパレットに複数のAWSの関連ノードが追加されます。この中からAWS DynamoDBノードをドラッグ&ドロップでキャンバスに表示し、ダブルクリックします。

プロパティ編集画面が表示されます。
image.png

AWS欄の右の鉛筆アイコンをクリックし、AWSのアクセス情報を入力します。
image.png

以下の情報を入力してください。

  • Region: 利用するDynamoDBのリージョン
  • Access Id: AWSに追加したユーザーのアクセスキー(ダウンロードしたcsvファイルを参照)
  • Secret Key: AWSに追加したユーザーのシークレットアクセスキー(ダウンロードしたcsvファイルを参照)

DynamoDBへの書き込みと読み込み

DynamoDBのプロパティのOperationをクリックするとDynamoDBに対して実施したい処理を選択できます。
image.png
今回、書き込みには、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分に実行されるように設定を行います。
image.png

設定が完了したら、右下の保存ボタンをクリックします。
image.png

クラウド実行環境へのデプロイ

作成したNode-REDフローをクラウド実行環境にデプロイします。
作成したフローの概要画面の右にあるデプロイボタンをクリックします。
image.png

以下のダイアログが表示されるので、クラウド実行環境を選択ボタンをクリックします。
image.png

デプロイ対象を選択し、デプロイボタンをクリックするとクラウド実行環境へのデプロイが開始します。
image.png

実行結果の確認

クラウド実行環境のログタブを選択sうることで実行ログを確認できます。
image.png

ログから、毎時、0分、20分、40分に実行されていることが分かるかと思います。
また、登録成功やA、B各々の直近1時間以内の検索結果数も確認できます。

まとめ

enebularは、データを保存する機能を提供していないため、データの保存を行いたい場合、外部のデータストアサービスを組み合わせて実現する必要があります。
データストアサービスは、種類に応じ多様な特徴を持っているため、実現したいアプリに応じてマッチするデータストアサービスの検討が必要です。
もし、作成したいアプリのデータストアとしてDynamoDBがマッチする場合には、本サンプルが開発の参考になれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?