Node-REDでストレージサービスを使う（GCP Cloud Storage編）

# はじめに
Node-REDでファイルをクラウドに保存したい時があります。
今回はGCPのCloud Storageノードの使い方をご紹介します。

# GCPの準備

## 新しいプロジェクトを作成

プロジェクトがない場合は、プロジェクトを新規で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/5ba0c3c8-2c26-d268-d338-d07a77b26033.png)

## 新しいバケットを作成

バケットを作成するウィザードに従って、作成します。今回は以下の様な設定でやってみました。

- 名前： test-20221125
- ロケーション: us-east1 (サウスカロライナ)
- ロケーション タイプ: Region
- デフォルトのストレージ クラス: Standard
- 公開アクセスの防止:オン
- アクセス制御: 均一
- 保護ツール: なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/6ae11aea-0193-0f8f-da64-1bdb3fc079bf.png)

公開アクセスの防止でチェックボックスが入力された状態で確認ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/deff9559-2f24-2e9b-06a5-cbbfd845ce9c.png)

バケットが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/3f0e0600-9f35-7c59-9093-792f2673800a.png)


## IAMによるサービスアカウントの作成

次にIAMによるサービスアカウントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/aa7889d3-f7b0-904f-8506-02eb3df32a0a.png)

バケットを作成した同じプロジェクトであることを確認して、`+サービスアカウントを作成`のリンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/70f3ba58-2fc0-4c08-a9ed-6dff8efa931f.png)

　サービスアカウント名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/4faae827-b4de-b58f-84e1-e1e28ba5db09.png)

サービスアカウントにロールを追加して権限を付与します。今回はロールに`Storageオブジェクト管理者`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/3fb6db9b-69aa-6a5b-7c34-35891b23269f.png)

`完了`をクリックして作成完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/3a399344-4149-b662-cf7b-9322bd780f6e.png)

## 秘密鍵を作成

作成されたサービスアカウントのリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/ac91561c-593c-6e4e-3b7e-cca856f61f16.png)

`鍵を追加`のプルダウンをクリックして、`新しい鍵を作成`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/8f399c8b-1ad7-5b2f-1341-e4ebd1852683.png)

キーのタイプは`JSON`を選択し、`作成`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/d26e7cae-60f9-7423-081f-159e83ea2dc2.png)

秘密鍵がパソコンに保存するようなダイアログが開きますので、保存しておいてください。

# Node-REDのフロー

## gcs-writeノード

gcs-writeノードは、Google Cloud Storage上にファイルを保存するノードです。
今回は、ファイルの中身に「こんにちは」と書き込み、それを先ほど作成したバケット上にファイルとして格納してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/4c2f1a95-e296-42d3-a6a0-f3be13366cb1.png)

このようなフローを作ったら、injectノードのpayloadに`こんにちは`という文字列を予め入力しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/0c77d8d2-eb0d-7875-fe7a-d57973a8a310.png)


### Credentials 

gcs-wirteノードの認証情報に先ほどダウンロードした秘密鍵のファイル（●●●.json）の中身をコピーしてkeyに貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/867ce82f-faf0-f1d4-e7cd-fdc6f9ae1e50.png)

### その他のプロパティの設定
- Key File は空欄
- File Name には、`gs://test-20221125/test.txt`
- Content Typeには、`text/plain`

と入力します。
Google Cloud Storage上のオブジェクトへのアクセスは、gs://test-20221125/test.txtのような書き方で、バケット名とオブジェクト名を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/4e1e06a5-fdc3-1eee-a1fc-2adee97156c4.png)

### 実行

injectノードを実行すると、GCPのバケットにファイルができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/58c7f891-b172-aa92-204f-08341d3ac9ce.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/b48b1dd9-acac-c474-3b08-3e3ca97a297b.png)

## gcs-readノード

gcs-readノードは、Google Cloud Storage上のファイルを読み込むノードです。
先ほど作成したファイルを指定して、その中身をNode-REDで取りだしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/f54ce56c-0d7a-de25-ee61-2658a7f40f6c.png)

プロパティの設定は、こちらを参考にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/05bf4e38-3ac3-8f5a-cf64-01b8d37c76df.png)

実行すると以下の様になると思います。英数値の羅列がでてきますが、これはBuffer型のデータです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/d46c867e-0b11-6258-8494-957fde269d5c.png)

そのため、人間が読めるテキストデータに変換する必要があります。
まずは、Functionノードをreadノードとdebugノードの間に入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/63964452-48bd-6722-43fe-b5cfa77026dc.png)

Functionノードのコードに以下のようなコードを入れて、Buffer型から文字列に変換しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/7a5deb38-3431-f462-7508-6af11a40ac08.png)

```
msg.payload = msg.payload.toString();
return msg;
```

再度injectノードを実行してみます。
こんどはうまく行きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/bbf339f3-69f8-dab8-4e65-4244c16bbbcc.png)


# まとめ

今回はこちらのノードを使用しました。

https://flows.nodered.org/node/node-red-contrib-google-cloud

参考になれば幸いです。