AWS IoTサービスを使ってみた
こんにちは。呉屋です。
最近、AWSのIoTサービスに関する記事やセミナーも増えているな~と思いました。
以前から興味があったのですが、難しそうで避けていたのが本音です。。。
”まずはやってみる”という気持ちで使ってみました。
AWS IoT サービスとは
サービス一覧はこちら!
かなり多い、、、とりあえず、何でもできそうです(笑)

どこから手をつければいいのか。。。
まずは「IoTとAWSを連携してシンプルな処理を行う」ところから始めてみます。
赤枠の部分だけで、できそうです。

「IoT Core」について調べてみると、IoT Device SDK、IoTポリシー、IoTルール、IoTトピック。。。。
難しい言葉がたくさん出てきました。一つずつ見ていきましょう!
サービス概要
IoTからAWS連携する順番は、このようになります。
①IoT(デバイス)
↓
②通信(HTTPS、MQTT)
↓
③認証(AWS接続)
↓
④ルール(何をさせるか)
次に各サービスの概要について、ざっくり理解します。
深堀すると迷ってしまうので、初めはこのくらいにしておくことをおすすめします。
①IoT(デバイス)
今回の検証はラズパイを使います。
IoTに開発ツールをインストールします。
②通信(HTTPS、MQTT)
IoTからAWSへ接続する際の通信方式です。
MQTT通信を調べてみると、良さそうだったので使ってみます。
[メリット]
・シンプル、軽量、省電力である。
・多数のデバイス間で短いメッセージを頻繁に送受信することを想定して作られている。
・通信量やCPU負荷、電力消費量などを従来の10分の1に抑えることができる。
③認証(AWS接続)
IoTが安全であることを証明させます。
証明書作成サービスがあるので、簡単に作成できます。
④ルール(何をさせるか)
AWS内部のサービスにつなぐルールを設定します。
LambdaやS3など、各サービスに連携できます。
設計
構築するものは、以前作った「ラズパイからAWSに画像を転送して通知させる」とします。

[前回]

[今回]
ラズパイからの転送部分を「CLI」から「IoT Core」に変更します。

構築
ここから実際に構築してみます。
Lambdaを使って転送する部分とSNSで通知する部分は、以前の投稿で紹介していますので、省略します。
ポリシーの作成
IAMポリシーのように、リソースやアクションを制限するためのものです。
ポリシー名と制限を決めます。

これにて完了です。

モノを作成
IoTであるラズパイを作成します。
今回は1台ですが、同時に複数作成もできます。

モノの名前を決めます。

証明書を作成します。
自分で用意したものを使用することもできます。

先ほど作成したポリシーをアタッチ(紐づけ)します。

証明書をダウンロードします。
必要なのは3つです。

これにて完了です。

ルールの作成
何をするのか、ルールを決めます。
今回はS3に画像を転送させます。
以前作った転送処理Lambdaを指定します。
次に「トピック」というURL(パス)を指定して、ラズパイからの受け口を作ります。

また、Lambda以外にも各サービスと連携できます。(※画像は一部です。)

エンドポイント
IoTサービスには、アカウント固有のエンドポイントがあるので確認します。

以上で、AWS側の準備は完了です。
もうひと踏ん張りです!
ラズパイ設定
ここからは、ラズパイの設定を行います。
AWSから用意されている開発ツール(AWS IoT Device SDK)をインストールします。
様々なデバイスからIoT Coreに接続するためのSDKです。
pipでインストールします。
pip3 install AWSIoTPythonSDK
次にコードです。Pythonを使用しました。
転送処理は、Lambdaでやったことがあったので、IoTCoreに接続できれば何とかなると思って書きました。
証明書ファイルは、SCPやCLI、Gitなどを使ってラズパイに転送する必要があります。
import time
from datetime import datetime, timedelta, timezone
import json
import base64
import AWSIoTPythonSDK.MQTTLib as AWSIoTPyMQTT# IoTCore設定
endpoint = "xxxxx-ats.iot.ap-northeast-1.amazonaws.com"
clientId = "RaspberryPi_dev01"
certKey = "./cert/certificate.pem.crt"
privateKey = "./cert/private.pem.key"
rootKey = "./cert/root-ca.pem"
topic = "topic_s3_push"
bucket = "xxxxx"# 接続設定
myAWSIoTMQTTClient = AWSIoTPyMQTT.AWSIoTMQTTClient(clientId)
myAWSIoTMQTTClient.configureEndpoint(endpoint, 8883)
myAWSIoTMQTTClient.configureCredentials(rootKey, privateKey, certKey)# 接続開始
myAWSIoTMQTTClient.connect()def main():
# 画像読取
img = open("./sample.jpg", 'rb').read()
# base64変換
base64Img = base64.b64encode(img).decode("utf-8")
# タイムスタンプ取得
jst = timezone(timedelta(hours=+9), 'JST')
timestamp = datetime.now(jst)
timestamp = timestamp.strftime('%Y-%m-%d-%H%M%S')
# 転送ファイル名指定
key = timestamp + ".jpg"
# JSON形式変換
obj = json.dumps({
"img" : base64Img,
"bucket" : bucket,
"key" : key}) # 転送
print("File Send Start Key : " + key)
myAWSIoTMQTTClient.publish(topic, obj, 1)
print("File Send End")
time.sleep(1)main()
# 切断
myAWSIoTMQTTClient.disconnect()
検証
これにて準備ができましたので、検証してみます。
プログラム実行
Keyとなるファイル名は、「2021-09-08-085750.jpg」です。

S3確認
転送OKです。

SNS通知確認

通知もOKでした!
ちなみにAWS側の受け口(トピック)をみると、json形式で受信されていることが確認できます。

さいごに
AWS IoTサービスを使ってみて、奥が深いな~と思いました。
今回はIoTからの受信側でしたが、送信側でIoTの音を鳴らしたり、光を点滅させるなどすると面白そうです。
また、集めたデータを分析して"見える化"にも挑戦したいと思います(^o^)/