M5Stack Core2 for AWSのTrust&GOセキュアエレメント「ATECC608A」を使ってAWS IoT Coreへアクセスします。Windows10にインストールしたVS Codeに環境構築したPlatformIOを使用します(「PlatformIOでM5Stack Core2 for AWSの開発環境の構築」を参照)。「CLOUD CONNECTED BLINKY」に示す手順に従ってAWS IoT Coreにアクセスします。

Trust&GOセキュアエレメント「ATECC608A」によるAWS IoT Coreへのアクセス

一般的にはセキュアエレメントにはクライアント証明書は入っていないため、セキュアエレメント内のコマンド(opensslコマンド相当)で作成する必要があります。しかしTrust&GOセキュアエレメント「ATECC608A」は、 “プロビジョニング済み” 即ち、秘密鍵とクライアント証明書が格納された状態で出荷されるため、秘密鍵やクライアント証明書の作成が不要です。

クライアント証明書入りセキュアエレメントを使うことで以下の利点があります。

  • IoT Core接続時に使うクライアント証明書の作成やCA運用が不要
  • ハードウェア内に格納した秘密鍵の漏洩対策が不要

Project「Blinky Hello World」のOpen

M5Stack Core2 for AWS IoT EduKit Code Repository」から取得したM5Stack Core2 for AWS用のコードをからProject「Blinky Hello World」をOpenします。

IAM ユーザーアクセス認証情報の取得とAWS CLIの設定

AWS Identity and Access Management (IAM)のコンソールで認証情報を取得します。「Microchip AVR-IoT WA開発ボードをAWS IoT Coreに接続」も参考にしてください。

各名称は次のように設定します。

  • グループ:Core2provtoolgroup
  • ユーザー名:Core2provtooluser
  • ポリシー名:Core2ProvToolAccess

ポリシー作成時には次のようにサービスは「IoT」「IoT Events」を選択しました。

AWS CLI をダウンロードしてインストールし、IAM ユーザー用に取得したアクセスキー ID とシークレットアクセスキーを用いて、PlatformIOのターミナルから次のコマンドでAWS CLIを設定します。

>  aws configure
AWS Access Key ID [****************PL7L]: xxxxxxxxxxxx
AWS Secret Access Key [****************4uHF]: yyyyyyyyyyy
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [None]: json

次のコマンドで、AWS CLI が IAM 認証情報およびリージョンで設定されていることを確認します。

> aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "a3s2xxxxxxxxx5z-ats.iot.ap-northeast-1.amazonaws.com"
}

この時、次のようなエラーが発生しました。原因はユーザをグループに登録するときにポリシーの設定を忘れていました。

An error occurred (AccessDeniedException) when calling the DescribeEndpoint operation: User: arn:aws:iam::613481514529:user/Core2provtooluser is not authorized to perform: iot:DescribeEndpoint  

AWSアクセスキーIDとシークレットアクセスキーの確認方法

AWSアクセスキーIDとシークレットアクセスキーはそれぞれ次のコマンドで確認できます。

>  aws configure get aws_access_key_id
>  aws configure  get aws_secret_access_key

Windows10の場合、AWSアクセスキーIDとシークレットアクセスキーは「C:/Users/(ユーザ)/.aws/credentials」に保存されています。

デバイスのプロビジョニング

Trust&GOセキュアエレメント「ATECC608A」を使用して AWS IoT Core に接続するためのデバイスをプロビジョニングし、TLS 接続を確立します。

PlatformIOのターミナルから次のコマンドを入力して、レジストレーションスクリプト「registration_helper.py」( utilities¥AWS_IoT_registration_helper に存在)を実行します。

>  cd utilities/AWS_IoT_registration_helper
>  python registration_helper.py -p COM6

レジストレーションスクリプト「registration_helper.py」の実行が完了すると、次のようにフォルダ「output_files」内に{Serial Number}_manifest.jsonが作成されます。

今回新規に登録された「モノ」は、 次のようにASW IoT Coreの左側のメニューで「管理」→「モノ」を選択すると表示されます。割り当てられたSerial Numberが登録されています。ただし、Wi-Fiやエンドポイントホスト名の設定後に登録されます。

ESP32 ファームウェアの設定

デバイスが Wi-Fi ネットワークと AWS IoT Core に接続できるように次のコマンドでESP32 ファームウェアを設定します。なおこの設定は、新規プロジェクトを作成するごとに必要になります。

> pio run --environment core2foraws --target menuconfig

次のメニューが表示され、キーボードによって項目を選択します。

仕様とは異なっており、メニュー選択は、「K」:Up 、「J」:Downとなります。

次の情報を設定します。設定された値は「xxx\PlatformIO\Projects\Core2-for-AWS-IoT-EduKit\Blinky-Hello-World\sdkconfig」に保存されます。

  • エンドポイントホスト名(取得したendpointAddress「xxs2xxxxxxxxx5z-ats.iot.ap-northeast-1.amazonaws.com」を設定):
  • Component config ?> Amazon Web Services IoT Platform ?>AWS IoT Endpoint Hostname

  • Wi-Fiの設定:
  • AWS IoT EduKit Configuration ?> WiFi SSID / WiFi Password

AWS IoT Coreとの接続

M5Stack Core2 for AWSの次の表示画面を見るとAWS IoT Coreに接続できたことが確認できます。

AWS IoT Coreに入り、次のように左側のメニューで「テスト」→「MQTTテストクライアント」を選択すると、次の画面が表示されます。トピックのサブスクリプションに「#」を設定し、「トピックへのサブスクリプション」ボタンをクリックすると、次のように、M5Stack Core2 for AWSからAWS IoT Coreに送信されているメッセージが表示されます。