RaspberryPi(Node-RED)でCloud Pub/Subとの接続がうまくいかない時にやったこと

# RaspberryPi(Node-RED)でCloud Pub/Subとの接続がうまくいかない時にやったこと
### 
京セラコミュニケーションシステムの大山です。

RaspberryPiとNode-REDを使って[**Google Cloud**](https://cloud.google.com/gcp/?hl=ja) Pub/Sub送受信をしようとしたところ
Node-REDがPub/Subへの接続と接続エラーのループ(RaspberryPiを再起動しても解決しない)に陥った事とその対処について記事にします。

## この記事の対象者
RaspberryPiとNode-REDでCloud Pub/Sub送受信を試したい方
同様の現象でお困りの方
node-red-contrib-google-cloudのノードの使い方をクレデンシャルの項目までしか読まなかった方(私)

## Google Cloudとの接続に使用するノードについて
Node-REDにはGoogle Cloudと通信するためのノードがいくつかあります。
今回その中のnode-red-contrib-google-cloudを使ってCloud Pub/Subと接続を試してみました。

![ノードの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/3d77226d-8b22-968c-ef9b-8cc2c2d48f2b.png)

ノードの追加はパレットの管理から行ってください。

今回フローはInjectノード、Pub/Sub_outputノード、debugノードをつないで”ラズパイからこんにちは”という文字列をCloud Pub/Subに送る内容となります。

![フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/459cf73a-a8f4-a348-7c62-429686ab20e9.png)

Pub/Subサブスクリプション側で”ラズパイからこんにちは”を見ることができればOKとします。

## まずはPub/Subトピック作成
Pub/SubトピックのトピックIDに任意のIDを入力します。
デフォルトのサブスクリプションを追加するにチェックをいれてCREATEボタンを押します。

![PubSubトピック作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/e0fa8017-fcab-704b-aea2-d9e5cc20cab9.png)

チェックを入れることでサブスクリプションも一緒に作られます。RaspberryPiからの文字列を受け取れたかはこちらで確認となります。

![PubSub画面①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/09289687-20a7-05e1-a969-c583cf9010b7.png)

## 外部(RaspberryPi)からの接続にはサービスアカウントキーが必要です
RaspberryPi等の外部からデータを送受信する際はIAMと管理からサービスアカウントを作成して生成したキーを使用する相手側に登録する必要があります。

![IAM設定①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/1d8abdb0-ff6f-a80c-738a-446aa0fe35a9.png)

任意のアカウント名とIDを入力して作成して続行ボタンをクリック

![IAM設定②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/b6204782-14c9-29c4-3d23-5d7b6f0fca3e.png)

ロールのPub/Subの項目で持たせたい権限を付与します。
ロールの設定後完了ボタンをクリック

![サービスアカウントリスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/3611cc8f-7a67-715f-a941-4e8a2e5fa33f.png)

サービスアカウントリストに追加されているので作成したサービスアカウントをクリック

![キー取得.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/4ca0c1eb-abd4-c093-f869-cf4fd056cba0.png)


タブのキーを選択し鍵を追加ボタンで新しい鍵(JSONキー)を作成します。

## Node-REDにアカウントキーを登録をする

![PubSubノードプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/4a2883f9-3bd7-eb47-a56a-9b3ad3cba42e.png)

作成したJSONキーをNode-RED、Pub/Subノードのcredentials編集画面のKeyにコピー＆ペーストして更新ボタンをクリック

:::note warn
まだデプロイボタンは押さないでください！！！
:::

## とりあえずフローを停止させる
それでもデプロイボタンを押してしまったあなた。。。
起動と停止のループでNode-REDの操作ができなくなっているかとおもいます。
とりあえずLXターミナルを起動してnode-red-stopとコマンド入力後、node-red --safeとコマンド入力し、セーフモードでNode-REDを立ち上げれば操作ができるので、Pub/Subノードを無効化してデプロイすればフローを停止させることができます。

![セーフコマンド.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/b59559d3-c97c-fa48-5af0-be72f6805c66.png)

内容一部切ってますがセーフモードでフローを停止しましたと出たらNode-REDを開いてください。

![セーフモード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/b65dc177-ee59-e2ec-4de8-efb284d04c0c.png)

セーフモードで立ち上がるのでPub/Subノードを無効化してデプロイします。

## 対処について(追加のセットアップ)
対処法としては[**node-red-contrib-google-cloud**](https://flows.nodered.org/node/node-red-contrib-google-cloud)ノードの認証方法の次**GCP外へのインストール**の項目に書いてあります。

/lib/systemd/system/nodered.serviceファイル内の
[Service]の箇所にEnvironment="GOOGLE_CLOUD_PROJECT=プロジェクトID"を追記保存してRaspberryPiを再起動してください。

![サービスファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/82c43332-229c-89d9-ba3f-34f4c348a7b1.png)

プロジェクトIDはGoogle Cloudのダッシュボード、プロジェクト情報にあるプロジェクトIDを参照してください。
nodered.serviceの編集できない場合は、必要に応じて編集権限を付与してください。

## フローを走らせてみる
上記の対処まで終わったらPub/Subを有効化して再度デプロイします。
Pub/Subノードの下にあるステータスが緑のconnectedになっていればPub/Subに送信できるようになります。

![PubSub接続後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/46656126-86d9-d751-b3c4-0b804c90da3c.png)

injectノードをクリックするとPub/Subに送信をします。

![PubSub画面②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748038/22aec175-a3b4-ebb8-aba4-dc1c516c4dcd.png)

サブスクリプションのメッセージタブでPULLをクリックして文字列が届いていればOKです。

## まとめ
CloudStorageはクレデンシャルのみで送信できていたこともありPub/Subも同様に設定したのですが
デプロイ後、Node-REDの操作ができなくなったため焦りました。
ただ、説明文を下までちゃんと読んでおけば回避できる内容ですので説明文は最後まで読んだ方がいいと思わされた出来事でした。

※記事に掲載しているスクリーンショットは2023年3月時点となります。