MQTT でAWS IoT にアクセスするための設定

AWS IoTにESP32からMQTT over WebSocketでつなぐ  に関連して、AWS IoTへのアクセス設定について備忘録として残す。

モノ単位でアクセス制御することができるが、ここでは最も単純に IAM で「プログラムによるアクセス」のみを行うユーザを作成して利用する場合を考える。

AWSIoTDataAccess

アクセス許可には、AWSIoTDataAccessを用いる。AWSIoTDataAccessの内容は以下の通りである。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:Connect",
                "iot:Publish",
                "iot:Subscribe",
                "iot:Receive",
                "iot:GetThingShadow",
                "iot:UpdateThingShadow",
                "iot:DeleteThingShadow"
            ],
            "Resource": "*"
        }
    ]
}

ユーザの作成

ここでは、IoT-ESP32 というユーザを作成することにする。

AWSマネジメントコンソールのIAMサービスのユーザを選択する。

「ユーザを追加」ボタンをクリックする。

ユーザ名に IoT-ESP32を入れ、アクセスの種類で「プログラムによるアクセス」にチェックする。

次のステップに進み、アクセス許可の設定で「既存のポリシーを直接アタッチ」をクリックする。

検索窓に「IoT」などを入れて、候補を少なくする。

ポリシー「AWSIoTDataAccess」を選択してから、「次のステップ:確認」ボタンをクリックする。

確認画面の内容が正しいことを確認したら「ユーザの作成」ボタンをクリックする。

正常にユーザを作成することができれば、以下のような画面となる。

必要に応じて、「.csvのダウンロード」をクリックして、アクセスキー、シークレットキーなどをファイルに保存する。アクセスキー、シークレットキーが、アクセスのためには必要になる。

カスタムエンドポイント

AWS IoT に接続するためのカスタムエンドポイントの情報を取得する。

AWSマネジメントコンソールの AWS IoT サービスの設定を選択する。

エンドポイントに示されている情報を用いる。

マクロ定義

AWS IoTにESP32からMQTT over WebSocketでつなぐ  に示したプログラムの場合には、上記の情報を基に以下のマクロをヘッダファイルで設定する。

  • MY_AWS_REGION
    • カスタムエンドポイントの情報に含まれている、us-east-2 などのリージョンを設定する
  • MY_AWS_ENDPOINT
    • カスタムエンドポイントの情報を設定する
  • MY_AWS_IAM_KEY
    • ユーザのキーを設定する
  • MY_AWS_IAM_SECRET_KEY
    • ユーザのシークレットキーを設定する

ヘッダファイル例

一部xxxなどで隠してある部分があるが以下のような定義をヘッダファイルに入れて、プログラムでインクルードする。

AWS IoTにESP32からMQTT over WebSocketでつなぐ のプログラムでは、「myAWSus-east2.h」というヘッダファイルに入れる。

#define	MY_AWS_REGION	"us-east-2"
#define	MY_AWS_ENDPOINT	"a3ixxxxxxxx0p2.iot.us-east-2.amazonaws.com"
#define	MY_AWS_IAM_KEY	"AKIAIEQNTHVLXAW5U34Q"
#define	MY_AWS_IAM_SECRET_KEY	"OPxD47h0xxxxxxxxxxxxxxxxxxxxxxxQzDhAzjYT"

動作確認

上記のようなマクロを含むヘッダファイルを用意して、AWS IoTにESP32からMQTT over WebSocketでつなぐ のプログラムをビルドし、実行することで動作確認する。

AWSマネジメントコンソールの AWS IoT サービスの設定を選択し、「テスト」を選択する。

「トピックへサブスクライブする」を選び、「トピックのサブスクリプション」にトピックを指定する。

AWS IoTにESP32からMQTT over WebSocketでつなぐ のプログラムの場合には、「$aws/things/your-device/shadow/update」を入力し、「トピックへのサブスクライブ」ボタンをクリックする。

この後、AWS IoTにESP32からMQTT over WebSocketでつなぐ のプログラムを実行すると以下のようにメッセージが受信できるはず。