Node-REDでストレージサービスを使う（AWS S3編）

# はじめに

Node-REDでファイルをクラウドに保存したい時があります。
世の中には様々なクラウド型のストレージサービスがありますが、今回はAWSのS3ノードの使い方をご紹介します。

## AWSの設定
まずはAWSの設定をしましょう。

### バケットを作成する

#### S3のメニューを選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/3ef6c738-aa6a-ba48-b83e-84d7fcbf99fd.png)

#### バケットを作成します

バケット名やリージョンを選択します。この設定をあとでNode-REDの設定画面で使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/d8e39f6c-a5aa-a212-da53-72018e1e81bc.png)

### IAMでユーザーを作る

#### IAMのメニューを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/7498dc25-3e67-8275-97a5-be5318335bde.png)

#### ユーザーを追加します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/b0850a4b-4536-75b1-35f1-bcf0592554b5.png)

#### ポリシーを追加します

ここではAmazonS3FullAccessを付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/530fe240-2c73-9fea-3020-424ec6689060.png)

ユーザーの作成ボタンを押してユーザーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/7ce02241-7ef8-cb5d-a1e5-30bf95e92b5c.png)

#### 認証情報を入手

認証情報画面が表示されます。こちらのアクセスキーIDとシークレットアクセスキーがこのあと必要になりますので、この画面は開いたままにしましょう。このあとのNode-REDの設定画面で使用します。

![スクリーンショット 2022-11-25 11.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/2b1a8326-0473-0211-1aeb-8223dbdf8c62.png)

# Node-REDの準備

[enebular.com](https://www.enebular.com/ja/)などのNode-REDを使用できる環境を用意します。

## Node-REDのインストール

パレットの管理から、node-red-contrib-s3を検索して追加します。（下の画像は追加した後です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/bc8fb074-6b86-00bd-9840-1d8931b8f8da.png)

ノードをパレット上に配置してフローを以下の様に接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/3b20877d-a1a5-bcb9-252f-cd16ab269949.png)

## ノードの設定

S3ノードの設定をします。

### 認証

先ほどAWSのIAMの画面で取得したアクセスキーIDとシークレットアクセスキーを入力しましょう。シークレットアクセスキーは表示リンクをクリックして表示させてから入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/4de4dcc7-7aa7-0285-4cbc-00ed179430ba.png)


### putノード

S3 putノードはファイルを送信したり、作ったりするノードです。
例えば、
- Bucketが`test-20221125`
- リージョンが`us-east-1`
- ファイル名が`test.txt`
- Content Encodingが`UTF-8`
のファイルにする場合、以下の画像の様に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/974cf819-42db-f53d-7911-9f2c23549850.png)

### getノード

S3 getノードはファイルを読み取ったりするノードです。
例えば、
- Bucketが`test-20221125`
- リージョンが`us-east-1`
- ファイル名が`test.txt`
- payloadで読み取った結果をUTF-8の文字列
にする場合、以下の画像の様に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/14ed53d8-8dbd-b4e9-545c-31b4cb9dc5e3.png)


# 完成したフロー

以下の画像の様なフローを作成して、injectボタンを押してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/abe7a7a6-3a49-0629-925f-497f8c6186c2.png)

## putした場合

putしたときのAWS S3のバケットは以下の通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/8e8f3f44-bd92-cfef-b222-e248d4fc37f6.png)

テキストファイルが生成されており、ダウンロードしてみるとinjectノードが生成したタイムスタンプが書き込まれています。

![スクリーンショット 2022-11-25 11.42.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266424/60dea730-3edb-cc01-f356-f7a149a740df.png)

## getした場合

S3上のテキストファイルから読み取ることができています。
msgオブジェクトは以下のようになっており、ファイルに書き込まれている文字列をpayloadに読み取ることができました。

`{"_msgid":"8e01205d11c1df33","payload":"1669344017416","topic":"","bucket":"test-20221125","filename":"test.txt"}`

# まとめ

今回は以下のノードを使用しました。
ご参考になれば幸いです。

https://flows.nodered.org/node/node-red-contrib-s3