search
LoginSignup
2

More than 1 year has passed since last update.

posted at

updated at

Organization

Node-REDでGoogleCloudStorageの更新をいい感じに受け取る

Node-RED Advent Calendar 2020の13日目を担当します、ニアムギです。
今回はGoogleCloudStorageの更新をいい感じに受け取る方法を紹介したいと思います。

使うもの

node-red-contrib-google-cloudノードとは?

Node-REDでGoogleCloudPlatformのサービスを使えるようにしてくれる素晴らしいノードです。今回使うGCSやPub/Sub以外にもBigQueryやSpeech to Textなども対応しています。

GoogleCloudStorageとは?

そのままですがストレージサーバーです。バケットという箱を用意してそこに画像やテキスト、jsonファイルなどを保存できます。

GoogleCloudPub/Subとは?

MQTTのようなメッセージングサービスです。パブリッシャーとサブスクライバーそれぞれの役割を設定できます。

いい感じに受け取る方法

GoogleCloudStorageが更新されたとき、GoogleCloudPub/Subから更新情報を受け取るようにします。
例えばGoogleCloudStorageに画像データをアップロードしたことをNode-RED側で知りたいとします。他のサービス(MQTTのブローカーなど)を使って知らせることも出来ますが、アップロード&アナウンスの2つの処理を実装しなければなりません。
それも良いのですが、GoogleCloudStorageが更新されたアナウンスはGoogleCloudPlatformに任せればセキュリティー面で安心です。ぜひ使っていきましょう。

下拵え

Node-REDでGoogleCloudStorage、GoogleCloudPub/Subが使えるように設定していきます。

  • GoogleCloudStorageにバケットを用意する
  • GoogleCloudStorageの更新情報を送るためのサブスクリプションを用意する
  • バケットとサブスクリプションを紐づける
  • GoogleCloudStorageとGoogleCloudPub/Subにアクセスできるサービスアカウントを作成する

GoogleCloudStorageにバケットを用意する

「バケットを作成」から作成できます。今回 testbucket-hoge というバケットを用意しました。

gcpSetting_03.PNG

GoogleCloudStorageの更新情報を送るためのサブスクリプションを用意する

GoogleCloudPub/Subにトピックと、そのトピック内にサブスクリプションを追加します。

「トピックの作成」からトピックを作成できます。今回 topicGCSPull というトピックを用意しました。
gcpSetting_00.PNG
トピック"topicGCSPull"内にサブスクリプションを作成します。
gcpSetting_01.PNG
サブスクリプションの役割は「GoogleCloudStorageの更新を受け取る」ですので、配信タイプをpullにします。サブスクリプションIDはpullTestとしました。
gcpSetting_02.PNG

バケットとサブスクリプションを紐づける

バケット「testbucket-hoge」とバケットの更新を受け取れるサブスクリプションが出来ました。しかしどのバケットの更新を受け取るか決めてあげなければいけません。
Pub/Sub Notifications for Cloud Storage の使用法に従ってバケットとサブスクリプションを紐づけます。gstuilがシンプルで設定しやすいと思います。

gsutil notification create -t TOPIC_NAME -f json gs://BUCKET_NAME

なので、該当するトピックとバケットをセットします。

gsutil notification create -t topicGCSPull -f json gs://testbucket-hoge

これでバケットの更新を受け取れるようになりました。

GoogleCloudStorageとGoogleCloudPub/Subにアクセスできるサービスアカウントを作成する

Node-REDからGoogleCloudStorage・GoogleCloudPub/Subにアクセスするには資格情報(credential)が必要になります。サービスアカウントを作成し、json形式の資格情報ファイルを取得します。

ID -> サービスアカウントを開きます。
serviceAccount_00.PNG

GoogleCloudStorageとGoogleCloudPub/Subそれぞれのサービスアカウントを作成します。※ひとつにまとめても構いません。
serviceAccount_01.PNG
GoogleCloudStorageに関するロール(役割)は"Storageオブジェクト管理者"を選択します。
serviceAccount_02.PNG
GoogleCloudPub/Subに関するロール(役割)は"Pub/Sub管理者"を選択します。
serviceAccount_03.PNG

サービスアカウントを作成したら鍵を生成します。鍵をjson形式で取得し、Node-REDで使用します。※誰にも知られないように大切に保管してください。
serviceAccount_04.PNG
serviceAccount_05.PNG

Node-REDで使う

必要な設定は済みましたのでNode-REDでノードを使っていきます。

セット

"node-red-contrib-google-cloud"を追加します
nodered_00.PNG

Pub/Subノードをフローに追加します。
プロパティのCredential情報を新規追加します。
nodered_01.PNG
Keyに先ほどのjsonファイルの中身を全てコピペします。
※GoogleCloudStorageノードも同様にCredential情報を新規追加します。
nodered_01_2.PNG

またプロパティのSubscriptionに Pub/Subのサブスクリプション名 を設定します。
nodered_03.PNG
Pub/Subのサブスクリプション名はPub/Subのサブスクリプションの詳細で確認できます。
nodered_02.PNG
"Assume JSON"にチェックを入れることでpayloadをjson形式で取得できます。チェックを入れないとバイナリー形式となります。
nodered_04.PNG

テスト

GoogleCloudPub/Subノード、GoogleCloudStorageノードが正しく動くかテストしてみます。

Pub/Subの確認

シンプルにGoogleCloudPub/Subノードとdebugノードだけの組み合わせで確認します。
test_00_2.PNG

GoogleCloudStorageへ追加するテキストファイルを用意しました。
"test.txt"、中身は"PubSubTest"となります。
test_00.PNG
GoogleCloudStorageのバケットへテキストファイルを追加してみます。
test_01.PNG
するとGoogleCloudPub/SubのノードがGoogleCloudStorageの更新を教えてくれました!
test_02.PNG
バケットのパスやファイル名、追加・更新・削除など、欲しいと思う情報を受け取れます。受け取れる情報はCloud Storage の Pub/Sub 通知を参照ください。

GoogleCloudStorageの確認

GoogleCloudPub/SubからGoogleCloudStorageの更新情報を受け取れたので、GoogleCloudStorageのデータを取得してみます。

GoogleCloudStorageへアクセスするノードを使用します。
test_05.PNG
GoogleCloudStorageへアクセスするノードへの入力はmsg.filenameに"バケット"&"ファイル名"、msg.contentTypeに"ファイルの種類"を指定します。
全て GoogleCloudPub/Subで取得したデータから分かっています。
test_03.PNG

GoogleCloudStorageへアクセスするノードからの出力はバイナリーデータです。画像ファイルであればそのまま使えますが、テキストファイルだと文字列のほうがありがたいです。以下のように関数を挟むことでバイナリーデータから文字列へ変換できます。
test_06.PNG
出力結果を見ると、確かにテストで用意したテキストファイルの中身と一致してます!
test_07.PNG
GoogleCloudPub/Subの通知を受けて、GoogleCloudStorageからデータを取得出来るところまで確認できました。

注意点

GoogleCloudStorageの更新を全て通知するので、削除 の場合も通知が飛んできます。その点を考慮してあげる必要があります。

試しにテキストファイルを削除してみると…
test_08.PNG
削除したテキストファイルを取得しようとするのでエラーになります
test_09.PNG

まとめ

GoogleCloudPub/Subを使うことで、GoogleCloudStorageの更新を受け取れる方法について紹介しました。GoogleCloudに通知を任せることで、セキュリティー面や通知がちゃんと届くか気にする必要がないのは大きなメリットだと考えています。

みなさんの何か参考になれば幸いです。
ではでは

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
What you can do with signing up
2