Raspberry PiからSQSのQueueを送る

# はじめに
Raspberry PiでIoTをするために、PiからAWSにデータを集める手段として、SQSが利用できるのではないかと、試行錯誤しました。

##準備したもの
* Raspberry Pi 4 Model B 2GB (SSH接続できるようにしておくと便利です。)

# 内容
AWSの[Amazon Simple Queue Service(SQS)](https://aws.amazon.com/jp/sqs/)はQueueというものを使って情報をやり取りする私書箱のようなサービスです。Raspberry Piから様々なデータをQueueとして発行できれば、AWS内のいろいろなサービスで受け取りが可能になります。さらに、月間100万通まで無料で利用できるというので試してみました。

##Queueを作成
ここでQueueとはメッセージをため込む入れ物のようなものです。Queueの中にどんどんメッセージを発行していき、受け取り側は好きなタイミングでQueueからメッセージを受け取っていくことができます。

* AWSコンソールからSQSの```RoomTemperature```という名前のQueueを作成します。名前以外は全て初期値のままで作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/d2b80e10-92e6-e853-e91b-239e320129ce.png)

* 作成したQueueの```https://sqs.```で始まるURLが必要になるのでコピーしておきます。

##IAMユーザーを作成
Raspberry PiがSQSにアクセスするためのIAMユーザーを作成します。

* ユーザー名 : bat
* アクセスの種類 : プログラムによるアクセス
* 権限 : 既存のポリシー「AmazonSQSFullAccess」を直接アタッチしました。
* CLIでアクセスするには「アクセスキー」と「シークレットアクセスキー」が必要になるので、ユーザー作成時にコピーしておきます。

##Raspberry PiにCLIをインストール
「[RaspberryPi で AWS CLI を使う方法](https://qiita.com/ekzemplaro/items/b5b42ce90fbe2fb05cd2)」を参考にさせていただきつつCLIをインストールする。操作はコンソールから行います。

```shell:CLIのインストール
#awscliのインストール
$ sudo apt install awscli
#awscliの最新化
$ sudo pip3 install awscli --upgrade
#awscliのバージョン確認
$ aws --version
aws-cli/1.19.21 Python/3.7.3 Linux/5.4.83-v7l+ botocore/1.20.21
```

##CLIの設定
ここでIAMユーザー作成の際に取得したアクセスキーとシークレットアクセスキーをセットしておきます。

```shell:CLIの設定
$ aws configure
AWS Access Key ID [None]: AKI***IJR
AWS Secret Access Key [None]:3ZUp***hV3d
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
##メッセージを発行する
Queueにメッセージを発行してみます。

```shell:Queueの発行
#作成したQueueのURLをセットします。
$ SQS_URL='https://sqs.ap-northeast-1.amazonaws.com/614446643541/RoomTemperature'
#メッセージの内容です。なんでもOKです。
$ SQS_MSG='This is test Message.'
#メッセージの発行。送信が成功すると結果がJSONで返ってきます。
$ aws sqs send-message --queue-url $SQS_URL --message-body "$SQS_MSG"
{
    "MD5OfMessageBody": "b10bca437abb82d836dddf23e216e747",
    "MessageId": "d7fac5a0-8b90-4e83-9e01-cbc018695887"
}
```

SQSの「メッセージ送受信画面」で、メッセージが届いていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/09c656dc-d3cc-7039-1988-e5ed9ef644ac.png)
メッセージの中身もOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/588c93bb-0afd-1be7-a5ff-9be9c2ba60fd.png)
最大で256KBまでのサイズを送ることができ、削除されなければ14日間保持可能です。

##CPUの温度をQueueに送る
Pythonで日時とCPU温度を送るスクリプトを作りました。実際は温度センサーで室温を取得したいですがとりあえず。

```Python:send_temperature_to_sqs.py
#!/usr/bin/python3
import subprocess
import datetime

#CPU温度を取得してtemperatureに入れる
commandlines = ['cat','/sys/class/thermal/thermal_zone0/temp']
temperature = subprocess.check_output(commandlines)
temperature = str(temperature[0:5])[2:7]
print(temperature)

#日時を取得してnow_datetimeに入れる
now_datetime = str(datetime.datetime.today())
print(now_datetime)

#メッセージを作成していQueueに送信する
SQS_URL = 'https://sqs.ap-northeast-1.amazonaws.com/614446643541/RoomTemperature'
SQS_MSG = now_datetime + ',' + temperature
commandlines = ['aws','sqs','send-message','--queue-url',SQS_URL ,'--message-body',SQS_MSG]
ret = subprocess.run(commandlines)
```

このスクリプトをcronで1時間ごとにキックします。

```shell:crontab
0 * * * * /home/pi/send_temperature_to_sqs.py
```

このようにCPU温度データがQueueできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/10d1229c-6239-d334-1995-6ca6b974b9b3.png)

# おわりに
SQSはインターネットのどこからでも、データをAWSに非同期で送信でき、CLIを使うことで収集を自動化することができます。次の目標はAWSの他サービスでデータを蓄積・加工できる環境の実現です。

AWSのサービスはどれも多機能で敷居が高いものも多いのですが、SQSのメニューはとてもシンプルで気に入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/460b594c-d669-0bd4-4387-fffb9227264b.png)

# 参考文献

* [RaspberryPi で AWS CLI を使う方法](https://qiita.com/ekzemplaro/items/b5b42ce90fbe2fb05cd2)
* [LinuxでCPUの温度を取得する](https://qiita.com/koara-local/items/1fac13704123717f5cc8)
* [Pythonからシェルコマンドを実行！subprocessでサブプロセスを実行する方法まとめ](https://dev.classmethod.jp/articles/python-subprocess-shell-command/)