📝

AWS IoT のハンズオンレベルの内容を CloudShell からやってみた

に公開

最後のトピックのサブスクライブとメッセージの確認以外はコマンドのみでできます。

手順

# Thing(仮想デバイス)を作成する
$ THING_NAME="MyTestThing"
$ aws iot create-thing \
--thing-name "$THING_NAME"

# 証明書と秘密鍵を作成
$ aws iot create-keys-and-certificate \
--set-as-active \
--output json > certs.json

# certs.json の中身を確認
$ cat certs.json

# 証明書ファイル(device.pem.crt)を作成
$ jq -r '.certificatePem' certs.json > device.pem.crt

# 秘密鍵ファイル(private.pem.key)を作成
$ jq -r '.keyPair.PrivateKey' certs.json > private.pem.key

# 作成ファイルの内容確認
$ head device.pem.crt
$ head private.pem.key

# 証明書ARNを環境変数にセット
$ CERT_ARN=$(jq -r '.certificateArn' certs.json)
$ echo $CERT_ARN

# 証明書を Thing にアタッチ
$ aws iot attach-thing-principal \
--thing-name "$THING_NAME" \
--principal "$CERT_ARN"

# IoT ポリシー定義ファイルを作成
$ cat <<EOF > iot-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect",
        "iot:Publish",
        "iot:Subscribe",
        "iot:Receive"
      ],
      "Resource": "*"
    }
  ]
}
EOF

# ポリシーを作成
$ POLICY_NAME="MyTestPolicy"
$ aws iot create-policy \
--policy-name "$POLICY_NAME" \
--policy-document file://iot-policy.json

# ポリシーを証明書にアタッチ
$ aws iot attach-policy \
--policy-name "$POLICY_NAME" \
--target "$CERT_ARN"

# Amazon ルート CA 証明書をダウンロード
$ curl -O https://www.amazontrust.com/repository/AmazonRootCA1.pem

# MQTT メッセージ送信用 Python スクリプト作成
$ cat <<EOF > publish.py
import paho.mqtt.client as mqtt
import ssl
import json
import time

endpoint = "<YOUR_ENDPOINT>.iot.ap-northeast-1.amazonaws.com"
port = 8883
topic = "test/topic"

ca_path = "AmazonRootCA1.pem"
cert_path = "device.pem.crt"
key_path = "private.pem.key"

def on_log(client, userdata, level, buf):
    print("log: ", buf)

client = mqtt.Client()
client.on_log = on_log

client.tls_set(ca_certs=ca_path,
               certfile=cert_path,
               keyfile=key_path,
               tls_version=ssl.PROTOCOL_TLSv1_2)

client.connect(endpoint, port, 60)
client.loop_start()

try:
    count = 1
    while True:
        message = {
            "message": f"Hello from CloudShell! ({count})"
        }
        result = client.publish(topic, json.dumps(message), qos=1)
        result.wait_for_publish()
        print(f"[{count}] Published message to topic {topic}: {message}")
        count += 1
        time.sleep(1)
except KeyboardInterrupt:
    print("Stopped by user")

client.loop_stop()
client.disconnect()
EOF

# AWS IoT エンドポイントを取得
$ aws iot describe-endpoint \
--endpoint-type iot:Data-ATS

# publish.py の endpoint を上記で取得した IoT エンドポイントに置換
$ nano publish.py

# Python ライブラリインストール
$ pip3 install --user paho-mqtt

# MQTT メッセージ送信スクリプトを実行
$ python3 publish.py

最後に AWS IoT コンソールの MQTT テストクライアントの画面を開き、test/topic をサブスクライブします。
「Hello from CloudShell!」のメッセージを確認できれば OK です。

まとめ

今回は AWS IoT のハンズオンレベルの内容を CloudShell からやってみました。
どなたかの参考になれば幸いです。

Discussion