konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

Nutanix Objects でオブジェクトストレージ API特訓 Node-RED編

IoT で簡単に可視化といえば、Node-RED!というか他知らないので、KPS for IoT(Xi IoT)との相性も良いので、Python に続いてオブジェクトストレージとの連携にトライ

f:id:konchangakita:20200926144958p:plain

Node-REDからNutanix Objectsへ接続方法を探す

まずは手探りで Node-RED 上でパレットからノードを検索してみます
なんとなくそれらしいのがいくつか見つかりましので、新しい方をインストールしてみます
f:id:konchangakita:20200927004731p:plain
f:id:konchangakita:20200927005044p:plain

追加されたノードで設定できる項目を確認します
f:id:konchangakita:20200927005130p:plain

Access Key、Secret Keyを設定する場所はありましたが
f:id:konchangakita:20200927010020p:plain

接続先がAWSのリージョンしか指定できず、完全にAWS S3専用ですね
f:id:konchangakita:20200927010816p:plain:w350

Boto3のように簡単にはいかなさそう。。。。


「node-red s3」とか「node-red オブジェクトストレージ」で検索してみても、独自の有力な情報はみつかりません
IBMさんやNECさんはクラウド型オブジェクトストレージはNode-REDに専用のノードが用意されている模様、Nutanix Objects用はもちろん無いです
だからといってイチから作るのは大変そう。。。

minIOノードを試す

ということで、汎用的に使えそうなノードを探してみましょう
そこで目をつけたので minIOノードです
S3互換な プライベートクラウド向けな Kubernetes Nativeな オブジェクトストレージなので、ピッタシ当てはまりそうです

Node-RED上で検索してみても最近アップデートもされているので、(気分的に)使えそうなヨカンです
f:id:konchangakita:20200927014058p:plain

「@alpine-code/node-red-contrib-minio」をインストールしてみます
5つのノードがインストールされています
f:id:konchangakita:20200927014934p:plain
接続先の設定項目を見てみるとホストの指定ができるので、なんとなくできそうな気がします
f:id:konchangakita:20200927014824p:plain

バケット一覧表示

minIOの bucketsノードを使って、バケット一覧を取得にトライしてみます
f:id:konchangakita:20200927233324p:plain


Nutanix Objectsの接続情報を入力して、Operationで「listBucketes」を選択してみます
f:id:konchangakita:20200927233456p:plain:w250f:id:konchangakita:20200927225800p:plain:w250


あ、簡単にとれちゃいました
(トリガにタイムスタンプ使ってますが、なんか送信してくれればなんでも良いです)
f:id:konchangakita:20200927225852p:plain

オブジェクトの一覧表示

オブジェクトのリストもサクッと取得できます
f:id:konchangakita:20200928002343p:plain:w250f:id:konchangakita:20200928002356p:plain:w250


あっさり出来すぎて拍子抜けです、minIOノードに辿り着くまで結構苦労したのですが。。。

オブジェクトの内容取得

次にオブジェクトの内容を「getPartialObject」で取得します
(原因はわかりませんが「getObject」ではだめでした)
f:id:konchangakita:20200928210408p:plain:w250f:id:konchangakita:20200928210351p:plain:w250

アスキーコードで出力されますが、「raw」と書いてるところクリックすると文字列に変換してくれます
f:id:konchangakita:20200928211437p:plainf:id:konchangakita:20200928211238p:plain:w250


オブジェクトストレージから画像取得

無事にオブジェクトも取得できたので、Node-REDならではの簡単可視化で画像表示にもチャレンジ

そのまま取得すると、バイナリなんで
f:id:konchangakita:20200928224344p:plain

Base64通してそれっぽい文字列にして、htmlの imgタグ

こんな感じで表示してやろう試みます

が。
f:id:konchangakita:20200928224616p:plain
同じ画像なのに、なんだか毎回サイズが違います。。。どういうこと???
サイズ指定してみたりとかしたんですが、よくわからない\(^o^)/

Presigned URLの取得

その他使える方法が無いか、みてみると「presigned」というのがあります
f:id:konchangakita:20200928233535p:plain:w250

というわけで、発想の転換してみまして Boto3でも使った
「Presigned URL」を使って、Webに埋め込んでみましょう
(オブジェクト業界ではこれが正義なのかもしれない)
f:id:konchangakita:20200928235203p:plain


あれ?なんかエラーばっかでURL取得できない。。
f:id:konchangakita:20200929000812p:plain:w300
どうやら、Bucket名にスペースが入ってしまっている模様(バグ?)
めっちゃ時間使ったやん
f:id:konchangakita:20200929000830p:plain

しょうがないので、changeノードで「bucketName」を飛ばしてやると
f:id:konchangakita:20200929001410p:plain
すんなりオブジェクトのURLを取得できました
f:id:konchangakita:20200929002951p:plain:w300


あとは、テンプレートノードにこんな感じの html書いておけば

<center>
    <a href=“{{{payload.presignedGetObject}}}” target=“_blank” rel=“noopener noreferrer”><img src=“{{{payload.presignedGetObject}}}“></a>
    <br><b1><i>{{{objectName}}}</i></b1>
</center>

f:id:konchangakita:20200929003033p:plain


無事、Web表示されましたとさ
(アンダーテイカーはアメリカンバッドアス時代が好きだったのです)
f:id:konchangakita:20200929003530p:plain

他にもElasticsearchなんかと組み合わせて、IoTやエッジAI処理結果のお手軽可視化にはよいんではないかと思うんだ
それはまたの機会