ジャストインタイムのプロビジョニング - AWS IoT

ジャストインタイムのプロビジョニング

AWS IoT への接続を最初に試みたときに、デバイスをプロビジョニングできるようにすることができます。ジャストインタイムプロビジョニング (JITP) の設定は、CA 証明書に対して行われます。デバイスをプロビジョニングするには、自動登録を有効にして、プロビジョニングテンプレートを、デバイス証明書に署名するために使用される CA 証明書に関連付ける必要があります。

これらの設定は、RegisterCACertificate API または register-ca-certificate CLI コマンドを使用して CA 証明書を登録するときに行うことができます。

aws iot register-ca-certificate --ca-certificate file://<your-ca-cert> --verification-cert file://<your-verification-cert> --set-as-active --allow-auto-registration --registration-config file://<your-template>

詳細については、「CA 証明書の登録」を参照してください。

また、UpdateCACertificate API または update-ca-certificate CLI コマンドを使用して、CA 証明書の設定を更新することもできます。

aws iot update-ca-certificate --cert-id <caCertificateId> --new-auto-registration-status ENABLE --registration-config file://<your-template>

デバイスが登録された CA 認定で署名された証明書を使用して AWS IoT に接続しようとすると、AWS IoT はその CA 認定からテンプレートを読み込み、そのテンプレートを使用して RegisterThing を呼び出します。JITP ワークフローは、最初に PENDING_ACTIVATION というステータス値で証明書を登録します。デバイスのプロビジョニングフローが完了すると、証明書のステータスは ACTIVE に変わります。

AWS IoT では、プロビジョニングテンプレートで宣言および参照できる次のパラメータを定義しています。

  • AWS::IoT::Certificate::Country

  • AWS::IoT::Certificate::Organization

  • AWS::IoT::Certificate::OrganizationalUnit

  • AWS::IoT::Certificate::DistinguishedNameQualifier

  • AWS::IoT::Certificate::StateName

  • AWS::IoT::Certificate::CommonName

  • AWS::IoT::Certificate::SerialNumber

  • AWS::IoT::Certificate::Id

これらのプロビジョニングテンプレートパラメータの値は、プロビジョニング対象のデバイスの証明書の件名フィールドから JITP が抽出できるものに限られます。証明書には、テンプレート本体のすべてのパラメータの値が含まれている必要があります。AWS::IoT::Certificate::Id パラメータは、証明書に含まれている ID ではなく、内部で生成された ID を参照します。この ID の値は、AWS IoT ルール内で principal() 関数を使用して取得できます。

次の JSON ファイルは、完全な JITP テンプレートの例です。templateBody フィールドの値は、エスケープ文字列として指定された JSON オブジェクトである必要があり、前のリストの値のみを使用できます。json.dumps (Python) や JSON.stringify (ノード)など、必要な JSON 出力を作成するには、さまざまなツールを使用できます。roleARN フィールドの値は、AWSIoTThingsRegistration がアタッチされたロールの ARN である必要があります。また、テンプレートでは例のインライン PolicyDocument の代わりに、既存の PolicyName を使用できます(最初の例では、読みやすいように改行が追加されていますが、すぐ下に表示されたテンプレートをコピーして貼り付けることもできます)。

{ "templateBody" : "{ \r\n \"Parameters\" : {\r\n \"AWS::IoT::Certificate::CommonName\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::SerialNumber\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::Country\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::Id\": {\r\n \"Type\": \"String\"\r\n }\r\n },\r\n \"Resources\": {\r\n \"thing\": {\r\n \"Type\": \"AWS::IoT::Thing\",\r\n \"Properties\": {\r\n \"ThingName\": {\r\n \"Ref\": \"AWS::IoT::Certificate::CommonName\"\r\n },\r\n \"AttributePayload\": {\r\n \"version\": \"v1\",\r\n \"serialNumber\": {\r\n \"Ref\": \"AWS::IoT::Certificate::SerialNumber\"\r\n }\r\n },\r\n \"ThingTypeName\": \"lightBulb-versionA\",\r\n \"ThingGroups\": [\r\n \"v1-lightbulbs\",\r\n {\r\n \"Ref\": \"AWS::IoT::Certificate::Country\"\r\n }\r\n ]\r\n },\r\n \"OverrideSettings\": {\r\n \"AttributePayload\": \"MERGE\",\r\n \"ThingTypeName\": \"REPLACE\",\r\n \"ThingGroups\": \"DO_NOTHING\"\r\n }\r\n },\r\n \"certificate\": {\r\n \"Type\": \"AWS::IoT::Certificate\",\r\n \"Properties\": {\r\n \"CertificateId\": {\r\n \"Ref\": \"AWS::IoT::Certificate::Id\"\r\n },\r\n \"Status\": \"ACTIVE\"\r\n },\r\n \"OverrideSettings\": {\r\n \"Status\": \"DO_NOTHING\"\r\n }\r\n },\r\n \"policy\": {\r\n \"Type\": \"AWS::IoT::Policy\",\r\n \"Properties\": {\r\n \"PolicyDocument\": \"{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{ \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\":[\\\"iot:Publish\\\"], \\\"Resource\\\": [\\\"arn:aws:iot:us-east-1:123456789012:topic\/sample\/topic\\\"] }] }\"\r\n }\r\n }\r\n }\r\n}", "roleArn" : "arn:aws:iam::123456789012:role/Provisioning-JITP" }

コピーして貼り付けることができるバージョン:

{ "templateBody" : "{\r\n \"Parameters\" : {\r\n \"AWS::IoT::Certificate::CommonName\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::SerialNumber\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::Country\": {\r\n \"Type\": \"String\"\r\n },\r\n \"AWS::IoT::Certificate::Id\": {\r\n \"Type\": \"String\"\r\n }\r\n },\r\n \"Resources\": {\r\n \"thing\": {\r\n \"Type\": \"AWS::IoT::Thing\",\r\n \"Properties\": {\r\n \"ThingName\": {\r\n \"Ref\": \"AWS::IoT::Certificate::CommonName\"\r\n },\r\n \"AttributePayload\": {\r\n \"version\": \"v1\",\r\n \"serialNumber\": {\r\n \"Ref\": \"AWS::IoT::Certificate::SerialNumber\"\r\n }\r\n },\r\n \"ThingTypeName\": \"lightBulb-versionA\",\r\n \"ThingGroups\": [\r\n \"v1-lightbulbs\",\r\n {\r\n \"Ref\": \"AWS::IoT::Certificate::Country\"\r\n }\r\n ]\r\n },\r\n \"OverrideSettings\": {\r\n \"AttributePayload\": \"MERGE\",\r\n \"ThingTypeName\": \"REPLACE\",\r\n \"ThingGroups\": \"DO_NOTHING\"\r\n }\r\n },\r\n \"certificate\": {\r\n \"Type\": \"AWS::IoT::Certificate\",\r\n \"Properties\": {\r\n \"CertificateId\": {\r\n \"Ref\": \"AWS::IoT::Certificate::Id\"\r\n },\r\n \"Status\": \"ACTIVE\"\r\n },\r\n \"OverrideSettings\": {\r\n \"Status\": \"DO_NOTHING\"\r\n }\r\n },\r\n \"policy\": {\r\n \"Type\": \"AWS::IoT::Policy\",\r\n \"Properties\": {\r\n \"PolicyDocument\": \"{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{ \\\"Effect\\\": \\\"Allow\\\", \\\"Action\\\":[\\\"iot:Publish\\\"], \\\"Resource\\\": [\\\"arn:aws:iot:us-east-1:123456789012:topic\/foo\/bar\\\"] }] }\"\r\n }\r\n }\r\n }\r\n}", "roleArn" : "arn:aws:iam::123456789012:role/JITPRole" }

このサンプルテンプレートでは、証明書から抽出され、AWS::IoT::Certificate::CommonName セクションで使用されている AWS::IoT::Certificate::SerialNumberAWS::IoT::Certificate::CountryAWS::IoT::Certificate::Id および Resources プロビジョニングパラメータの値を宣言します。次に、JITP ワークフローはこのテンプレートを使用して次のアクションを実行します。

  • 証明書を登録し、そのステータスを PENDING_ACTIVE に設定します。

  • 1 つのモノのリソースを作成します。

  • 1 つのポリシーのリソースを作成します。

  • ポリシーを証明書にアタッチします。

  • 証明書をモノにアタッチします。

  • 証明書のステータスを ACTIVE に更新します。

証明書の登録は、RegisterCACertificate で記録されたイベント (AWS CloudTrail) として表示されます。CloudTrail を使用して、JITP テンプレートに関する問題をトラブルシューティングすることもできます。

注記

JITP は、プロビジョニングプロセス中に他の AWS IoT コントロールプレーン API を呼び出します。これらの呼び出しは、アカウントに設定された AWS IoT スロットリングクォータを超過し、スロットリングされた呼び出しが発生する可能性があります。必要に応じて、AWS カスタマーサポートに連絡して、スロットリングのクォータを引き上げてください。