

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# デバイスプロビジョニング
<a name="iot-provision"></a>

AWS には、デバイスをプロビジョニングし、一意のクライアント証明書をインストールするさまざまな方法が用意されています。このセクションでは、各方法と、IoT ソリューションに最適な方法を選択する方法について説明します。これらのオプションについては、「[Device Manufacturing and Provisioning with X.509 Certificates in AWS IoT Core](https://docs.aws.amazon.com/whitepapers/latest/device-manufacturing-provisioning/device-manufacturing-provisioning.html)」(IoTCore における X.509 証明書を使ったデバイス製造およびプロビジョニング) というタイトルのホワイトペーパーで詳しく説明しています。

**状況に最も適したオプションを選択してください**
+ 

**証明書は、配送前に IoT デバイスにインストールできます。**  
エンドユーザーによる使用のために配送される前に IoT デバイスに一意のクライアント証明書を安全にインストールできる場合は、[*ジャストインタイム*プロビジョニング (JITP)](jit-provisioning.md) または[*ジャストインタイム*登録 (JITR)](auto-register-device-cert.md) を使用する必要があります。

  JITP と JITR を使用すると、デバイス証明書の署名に使用される認証機関 (CA) は に登録 AWS IoT され、デバイスが最初に接続 AWS IoT したときに によって認識されます。デバイスは、プロビジョニングテンプレートの詳細を使用して、最初の接続 AWS IoT で にプロビジョニングされます。

  一意の証明書を持つデバイスの単一のモノ、JITP、JITR、およびバルクプロビジョニングの詳細については、「[デバイス証明書があるデバイスのプロビジョニング](provision-w-cert.md)」を参照してください。
+ 

**エンドユーザーまたはインストーラは、アプリケーションを使用して IoT デバイスに証明書をインストールできます**  
エンドユーザーに配信される前に IoT デバイスに一意のクライアント証明書を安全にインストールできないが、エンドユーザーまたはインストーラがアプリケーションを使用してデバイスを登録し、一意のデバイス証明書をインストールできる場合は、[信頼できるユーザープロセスによるプロビジョニング](provision-wo-cert.md#trusted-user)を使用する必要があります。

  エンドユーザーや既知のアカウントを持つインストーラなどの信頼できるユーザーを使用すると、デバイスの製造プロセスを簡素化できます。一意のクライアント証明書の代わりに、デバイスには一時的な証明書があり、デバイスが に接続できる AWS IoT 時間は 5 分のみです。この 5 分間で、信頼されたユーザーは有効期限の長い一意のクライアント証明書を取得し、デバイスにインストールします。クレーム証明書には有効期限があるため、証明書のセキュリティが侵害された場合のリスクを最小限は最小限に抑えられます。

  詳細については、「[信頼されたユーザーによるプロビジョニング](provision-wo-cert.md#trusted-user)」を参照してください。
+ 

**エンドユーザーは、アプリケーションを使用して IoT デバイスに証明書をインストールすることはできません**  
上記のオプションのいずれも IoT ソリューションで機能しない場合は、[クレームプロセスによるプロビジョニング](provision-wo-cert.md#claim-based)を使用します。このプロセスでは、IoT デバイスには、フリート内の他のデバイスによって共有されるクレーム証明書があります。デバイスがクレーム証明書に初めて接続すると、 はプロビジョニングテンプレートを使用してデバイス AWS IoT を登録し、 への後続のアクセスのために一意のクライアント証明書を発行します AWS IoT。

   このオプションを使用すると、デバイスの接続時にデバイスの自動プロビジョニングが可能になりますが AWS IoT、クレーム証明書が侵害された場合、より大きなリスクが生じる可能性があります。クレーム証明書のセキュリティが侵害された場合は、証明書を無効化できます。クレーム証明書を無効化すると、そのクレーム証明書を持つすべてのデバイスが今後登録されなくなります。ただし、クレーム証明書を無効にしても、既にプロビジョニングされているデバイスはブロックされません。

  詳細については、「[クレームによるプロビジョニング](provision-wo-cert.md#claim-based)」を参照してください。

## でのデバイスのプロビジョニング AWS IoT
<a name="provisioning-in-iot"></a>

を使用してデバイスをプロビジョニングするときは AWS IoT、デバイスと が安全に AWS IoT 通信できるようにリソースを作成する必要があります。デバイスフリートの管理に役立つその他のリソースを作成できます。プロビジョニングプロセスでは、次のリソースを作成できます。
+ IoT モノ。

  IoT モノは、 AWS IoT デバイスレジストリのエントリです。各モノには一意の名前と属性のセットがあり、物理デバイスに関連付けられています。モノはモノの種類を使用して定義することも、モノグループにグループ化することもできます。詳細については、「[を使用したデバイスの管理 AWS IoT](iot-thing-management.md)」を参照してください。

   必須ではありませんが、モノを作成することで、モノの種類、モノグループ、およびモノ属性でデバイスを検索し、デバイスフリートをより効率的に管理できます。詳細については、「[フリートインデックス作成](iot-indexing.md)」を参照してください。
**注記**  
モノの接続ステータスデータのインデックスを作成するには、モノをプロビジョニングし、モノの名前が Connect リクエストで使用されるクライアント ID と一致するように設定します。
+ X.509 証明書。

  デバイスは X.509 証明書を使用して相互認証を実行します AWS IoT。既存の証明書を登録するか、 で新しい証明書 AWS IoT を生成して登録できます。証明書を、デバイスを表すモノにアタッチすることで、デバイスと関連付けることができます。また、証明書および関連付けられたプライベートキーをデバイスにコピーする必要もあります。デバイスは接続時に証明書を提示します AWS IoT。詳細については、「[認証](authentication.md)」を参照してください。
+ IoT ポリシー。

  IoT ポリシーは、デバイスが AWS IoTで実行できるオペレーションを定義します。IoT ポリシーはデバイス証明書にアタッチされます。デバイスが証明書を に提示すると AWS IoT、ポリシーで指定されたアクセス許可が付与されます。詳細については、「[Authorization](iot-authorization.md)」を参照してください。各デバイスには、 AWS IoTと通信する証明書が必要です。

AWS IoT は、プロビジョニングテンプレートを使用したフリートの自動プロビジョニングをサポートしています。プロビジョニングテンプレートは、デバイスをプロビジョニング AWS IoT するために必要なリソースを記述します。テンプレートには、1 つのテンプレートを使用して複数のデバイスをプロビジョニングできる変数が含まれています。デバイスをプロビジョニングするときは、ディクショナリまたは*マップ*を使用して、デバイスに固有の変数の値を指定します。別のデバイスをプロビジョニングするには、ディクショナリに新しい値を指定します。

デバイスに固有の証明書 (および関連するプライベートキー) があるかどうかにかかわらず、自動プロビジョニングを使用できます。

## フリートプロビジョニング API
<a name="provisioning-apis"></a>

フリートプロビジョニングで使用されるAPIには、いくつかのカテゴリがあります。
+ これらのコントロールプレーン機能は、フリートのプロビジョニングテンプレートを作成および管理し、信頼できるユーザーポリシーを設定します。
  + [CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)
  + [ CreateProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplateVersion.html)
  + [DeleteProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplate.html)
  + [DeleteProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteProvisioningTemplateVersion.html)
  + [DescribeProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplate.html)
  + [DescribeProvisioningTemplateVersion](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeProvisioningTemplateVersion.html)
  + [ListProvisioningTemplates](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplates.html)
  + [ListProvisioningTemplateVersions](https://docs.aws.amazon.com/iot/latest/apireference/API_ListProvisioningTemplateVersions.html)
  + [UpdateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateProvisioningTemplate.html)
+ 信頼されたユーザーは、このコントロールプレーン機能を使用して、一時的なオンボーディング要求を生成できます。この一時的なクレームは、Wi-Fi 設定または同様の方法を通じてデバイスに渡されます。
  + [CreateProvisioningClaim](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningClaim.html)
+ プロビジョニング処理中に使用される MQTT API。プロビジョニング要求証明書が埋め込まれているデバイスによって使用され、信頼されたユーザーによってそのデバイスに渡されます。
  + [CreateCertificateFromCsr](fleet-provision-api.md#create-cert-csr)
  + [CreateKeysAndCertificate](fleet-provision-api.md#create-keys-cert)
  + [RegisterThing](fleet-provision-api.md#register-thing)

# フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング
<a name="provision-wo-cert"></a>

 AWS IoT フリートプロビジョニングを使用すると、 は、初めて に接続するときにデバイス証明書とプライベートキーを生成してデバイスに安全に配信 AWS IoT できます AWS IoT 。 は、Amazon ルート認証局 (CA) によって署名されたクライアント証明書 AWS IoT を提供します。

フリートプロビジョニングを使用するには、次の 2 つの方法があります。
+ [クレームによるプロビジョニング](#claim-based)
+ [信頼されたユーザーによるプロビジョニング](#trusted-user)

## クレームによるプロビジョニング
<a name="claim-based"></a>

デバイスは、プロビジョニングクレーム証明書とプライベートキー（特別な目的の認証情報）が埋め込まれた状態で製造できます。これらの証明書が に登録されている場合 AWS IoT、サービスはそれらの証明書を、デバイスが通常のオペレーションに使用できる一意のデバイス証明書と交換できます。このプロセスには、以下のステップが含まれます。

**デバイスを配送する前に**

1. [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html) を呼び出して、プロビジョニングテンプレートを作成します。この API はテンプレート ARN を返します。詳細については、「[デバイスプロビジョニング MQTT API](fleet-provision-api.md)」を参照してください。

    AWS IoT コンソールでフリートプロビジョニングテンプレートを作成することもできます。

   1. ナビゲーションペインから、**[多数のデバイスを接続]** ドロップダウンを選択します。次に、**[複数のデバイスを接続]** を選択します。

   1. **[プロビジョニングテンプレートを作成]** を選択します。

   1. **[プロビジョニングシナリオ]** で、インストールプロセスに最適なものを選択します。その後、**[Next]** を選択します。

   1. テンプレートワークフローを完了します。

1. プロビジョニングクレーム証明書として使用する証明書および関連付けられたプライベートキーを作成します。

1. これらの証明書を に登録 AWS IoT し、証明書の使用を制限する IoT ポリシーを関連付けます。次の IoT ポリシーの例では、このポリシーに関連付けられた証明書の使用をプロビジョニングデバイスに制限しています。  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Connect"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Receive"
               ],
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topic/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topic/$aws/provisioning-templates/templateName/provision/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iot:Subscribe",
               "Resource": [
               "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/certificates/create/*",
       "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/provisioning-templates/templateName/provision/*"
               ]
           }
       ]
   }
   ```

1. デバイスのプロビジョニング時に、アカウントのモノや証明書などの IoT リソースを作成または更新するアクセス許可を AWS IoT サービスに付与します。これを行うには、 AWS IoT サービスプリンシパルを信頼する IAM ロール (プロビジョニングロールと呼ばれる) に `AWSIoTThingsRegistration`マネージドポリシーをアタッチします。

1. プロビジョニングクレーム証明書が安全に埋め込まれたデバイスを製造します。

これで、デバイスを設置して使用する場所に配送する準備ができました。

**重要**  
プロビジョニングクレームプライベートキーは、デバイス上を含め、常に保護する必要があります。 AWS IoT CloudWatch メトリクスとログを使用して、誤用の兆候をモニタリングすることをお勧めします。誤用を検出した場合は、プロビジョニングクレーム証明書を無効にして、デバイスのプロビジョニングに使用できないようにします。

**デバイスを使用できるように初期化するには**

1. デバイスは を使用して に接続し[AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client](iot-sdks.md)、デバイスにインストールされているプロビジョニングクレーム証明書 AWS IoT を使用して で認証します。
**注記**  
セキュリティ上の理由から、`CreateCertificateFromCsr` および `CreateKeysAndCertificate` によって返される `certificateOwnershipToken` は 1 時間後に有効期限切れになります。`certificateOwnershipToken` が有効期限切れになる前に、`RegisterThing` を呼び出す必要があります。`CreateCertificateFromCsr` または `CreateKeysAndCertificate` によって作成された証明書がトークンの有効期限が切れるまでにアクティベートされず、ポリシーまたはモノにアタッチされない場合、証明書は削除されます。トークンの有効期限が切れた場合、デバイスは `CreateCertificateFromCsr` または `CreateKeysAndCertificate` を呼び出して新しい証明書を生成します。

1. デバイスは、以下のオプションのいずれかを使用して、永続的な証明書とプライベートキーを取得します。デバイスは、今後のすべての認証に証明書とキーを使用します AWS IoT。

   1. を呼び出し[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)て、認証機関を使用して新しい AWS 証明書とプライベートキーを作成します。

      または

   1. [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) を呼び出して、プライベートキーを安全に保つ証明書署名リクエストから証明書を生成します。

1. デバイスから [`RegisterThing`](fleet-provision-api.md#register-thing) を呼び出してデバイスを AWS IoT に登録し、クラウドリソースを作成します。

   フリートプロビジョニングサービスでは、プロビジョニングテンプレートを使用して、IoT のモノなどのクラウドリソースを定義および作成します。このテンプレートでは、モノが属する属性とグループを指定できます。新しいモノを追加するには、モノのグループが存在している必要があります。

1. デバイスに永続的な証明書を保存した後、デバイスはプロビジョニングクレーム証明書を使用して開始したセッションから切断し、永続的な証明書を使用して再接続する必要があります。

これで、デバイスは正常に通信する準備が整いました AWS IoT。

## 信頼されたユーザーによるプロビジョニング
<a name="trusted-user"></a>

多くの場合、エンドユーザーやインストール技術者などの信頼されたユーザーがモバイルアプリを使用してデプロイされた場所にデバイスを設定すると、デバイスは AWS IoT 初めて に接続します。

**重要**  
この手順を実行するには、信頼されたユーザーのアクセスとアクセス許可を管理する必要があります。そのための 1 つの方法は、信頼されたユーザーに対して、これらのユーザーを認証し、この手順の実行に必要な AWS IoT 機能および API オペレーションへのアクセスを許可するアカウントを提供して維持することです。

**デバイスを配送する前に**

1. [https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningTemplate.html) を呼び出してプロビジョニングテンプレートを作成し、その *templateArn* および *templateName* を返します。

1. 信頼されたユーザーがプロビジョニングプロセスを開始するために使用する IAM ロールを作成します。プロビジョニングテンプレートでは、そのユーザーだけがデバイスをプロビジョニングできます。例えば、次のようになります。

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "arn:aws:iot:aws-region:aws-account-id:provisioningtemplate/templateName"
       ]
   }
   ```

1. デバイスのプロビジョニング時に、アカウントのモノや証明書などの IoT リソースを作成または更新するアクセス許可を AWS IoT サービスに付与します。これを行うには、 AWS IoT サービスプリンシパルを信頼する IAM ロール (*プロビジョニングロール*と呼ばれる) に `AWSIoTThingsRegistration`管理ポリシーをアタッチします。

1. 信頼されたユーザーを識別する手段を提供します。例えば、これらのユーザーを認証し、デバイスの登録に必要な AWS API オペレーションとのやり取りを許可できるアカウントを提供します。

**デバイスを使用できるように初期化するには**

1. 信頼されたユーザーは、プロビジョニングモバイルアプリまたはウェブサービスにサインインします。

1. モバイルアプリケーションまたはウェブアプリケーションは、IAM ロールを使用し、[https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateProvisioningClaim.html) を呼び出して、 AWS IoTから一時的なプロビジョニングクレーム証明書を取得します。
**注記**  
セキュリティ上の理由から、`CreateProvisioningClaim` から返される一時的なプロビジョニングクレーム証明書は 5 分後に有効期限切れになります。以下の手順では、一時的なプロビジョニングクレーム証明書の有効期限が切れる前に、有効な証明書を正常に返す必要があります。一時的なプロビジョニングクレーム証明書はアカウントの証明書のリストには表示されません。

1. モバイルアプリまたはウェブアプリケーションは、Wi-Fi 認証情報などの必要な設定情報と共に、一時的なプロビジョニングクレーム証明書をデバイスに提供します。

1. デバイスは、一時的なプロビジョニングクレーム証明書と AWS IoT を使用して [AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client](iot-sdks.md) に接続します。

1. デバイスは、一時的なプロビジョニングクレーム証明書 AWS IoT を使用して に接続してから 5 分以内に、これらのオプションのいずれかを使用して永続的な証明書とプライベートキーを取得します。デバイスは証明書を使用し、これらのオプションが返すキーを今後のすべての認証に使用します AWS IoT。

   1. を呼び出し[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert)て、認証機関を使用して新しい AWS 証明書とプライベートキーを作成します。

      または

   1. [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) を呼び出して、プライベートキーを安全に保つ証明書署名リクエストから証明書を生成します。
**注記**  
[`CreateKeysAndCertificate`](fleet-provision-api.md#create-keys-cert) または は、一時的なプロビジョニングクレーム証明書 AWS IoT を使用して に接続してから 5 分以内に有効な証明書を返す[`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr)必要があります。

1. デバイスは [`RegisterThing`](fleet-provision-api.md#register-thing)を呼び出してデバイスを に登録 AWS IoT し、クラウドリソースを作成します。

   フリートプロビジョニングサービスでは、プロビジョニングテンプレートを使用して、IoT のモノなどのクラウドリソースを定義および作成します。このテンプレートでは、モノが属する属性とグループを指定できます。新しいモノを追加するには、モノのグループが存在している必要があります。

1. 永続的な証明書をデバイスに保存した後、デバイスは一時的なプロビジョニングクレーム証明書を使用して開始したセッションから切断し、永続的な証明書を使用して再接続する必要があります。

これで、デバイスは正常に通信する準備が整いました AWS IoT。

## CLI AWS での事前プロビジョニングフックの使用
<a name="hooks-cli-instruc"></a>

次の手順では、事前プロビジョニングフックを使用してプロビジョニングテンプレートを作成します。ここで使用されている Lambda 関数の例は変更可能です。

**事前プロビジョニングフックを作成してプロビジョニングテンプレートに適用するには**

1. 定義された入力と出力を持つ Lambda 関数を作成します。Lambda 関数は高度にカスタマイズ可能であり、`allowProvisioning` および `parameterOverrides` は事前プロビジョニングフックを作成するために必要です。Lambda 関数の作成の詳細については、[AWS 「 コマンドラインインターフェイス AWS Lambda で を使用する](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)」を参照してください。

   Lambda 関数出力の例を次に示します。

   ```
   {
     "allowProvisioning": True,
     "parameterOverrides": {
       "incomingKey0": "incomingValue0",
       "incomingKey1": "incomingValue1"
     }
   }
   ```

1. AWS IoT はリソースベースのポリシーを使用して Lambda を呼び出すため、Lambda 関数を呼び出すアクセス許可を付与 AWS IoT する必要があります。
**重要**  
Lambda アクションにアタッチされたポリシーのグローバル条件コンテキストキーに `source-arn` または `source-account` を必ず含め、アクセス許可の操作を防止します。詳細については、「[サービス間での不分別な代理処理の防止](cross-service-confused-deputy-prevention.md)」を参照してください。

   以下は、[add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) を使用して Lambda に IoT アクセス許可を付与する例です。

   ```
   aws lambda add-permission \
       --function-name myLambdaFunction \
       --statement-id iot-permission \
       --action lambda:InvokeFunction \
       --principal iot.amazonaws.com
   ```

1. [create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html) または [update-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/update-provisioning-template.html) コマンドを使用して、テンプレートに事前プロビジョニングフックを追加します。

   次の CLI 例では、[create-provisioning-template](https://docs.aws.amazon.com/cli/latest/reference/iot/create-provisioning-template.html) を使用して、事前プロビジョニングフックを持つプロビジョニングテンプレートを作成します。

   ```
   aws iot create-provisioning-template \
       --template-name myTemplate \
       --provisioning-role-arn arn:aws:iam:us-east-1:1234564789012:role/myRole \
       --template-body file://template.json \
       --pre-provisioning-hook file://hooks.json
   ```

   このコマンドの出力は以下のようになります。

   ```
   {
       "templateArn": "arn:aws:iot:us-east-1:1234564789012:provisioningtemplate/myTemplate",
       "defaultVersionId": 1,
       "templateName": myTemplate
   }
   ```

   また、パラメータをすべてコマンドラインパラメータ値として入力する代わりに、ファイルからロードして、時間を節約することもできます。詳細については、「[ファイルから AWS CLI パラメータをロードする](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-file.html)」を参照してください。次に、拡張された JSON 形式の `template` パラメータを示します。

   ```
   {
       "Parameters" : {
           "DeviceLocation": {
               "Type": "String"
           }
       },
       "Mappings": {
           "LocationTable": {
               "Seattle": {
                   "LocationUrl": "https://example.aws"
               }
           }
       },
       "Resources" : {
           "thing" : {
               "Type" : "AWS::IoT::Thing",
               "Properties" : {
                   "AttributePayload" : {
                       "version" : "v1",
                       "serialNumber" : "serialNumber"
                   },
                   "ThingName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingTypeName" : {"Fn::Join":["",["ThingTypePrefix_",{"Ref":"SerialNumber"}]]},
                   "ThingGroups" : ["widgets", "WA"],
                   "BillingGroup": "BillingGroup"
               },
               "OverrideSettings" : {
                   "AttributePayload" : "MERGE",
                   "ThingTypeName" : "REPLACE",
                   "ThingGroups" : "DO_NOTHING"
               }
           },
           "certificate" : {
               "Type" : "AWS::IoT::Certificate",
               "Properties" : {
                   "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                   "Status" : "Active",
                   "ThingPrincipalType" : "EXCLUSIVE_THING"
               }
           },
           "policy" : {
               "Type" : "AWS::IoT::Policy",
               "Properties" : {
                   "PolicyDocument" : {
                       "Version": "2012-10-17",		 	 	 
                       "Statement": [{
                           "Effect": "Allow",
                           "Action":["iot:Publish"],
                           "Resource": ["arn:aws:iot:us-east-1:504350838278:topic/foo/bar"]
                       }]
                   }
               }
           }
       },
       "DeviceConfiguration": {
           "FallbackUrl": "https://www.example.com/test-site",
           "LocationUrl": {
               "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
       }
   }
   ```

   次に、拡張された JSON 形式の `pre-provisioning-hook` パラメータを示します。

   ```
   {
        "targetArn" : "arn:aws:lambda:us-east-1:765219403047:function:pre_provisioning_test",
        "payloadVersion" : "2020-04-01"
   }
   ```

# デバイス証明書があるデバイスのプロビジョニング
<a name="provision-w-cert"></a>

AWS IoT には、デバイスにデバイス証明書 (および関連するプライベートキー) が既にある場合にデバイスをプロビジョニングする 3 つの方法があります。
+ プロビジョニングテンプレートを使用した単一のモノのプロビジョニング。このオプションは、一度に 1 つずつデバイスをプロビジョニングするだけの場合に適しています。
+ デバイスを最初に接続するときにプロビジョニングするテンプレートを使用したJust-in-timeプロビジョニング (JITP) AWS IoT。このオプションは、大量のデバイスを登録する必要があるが、それらのデバイスに関して一括プロビジョニングリストにまとめることができる情報がない場合に適しています。
+ 一括登録。このオプションを使用すると、S3 バケットのファイルに保存された単一のモノのプロビジョニングテンプレートの値のリストを指定できます。このアプローチは、目的の特性をリストにまとめることができる、既知のデバイスが大量にある場合に適しています。

**Topics**
+ [

# 単一のモノプロビジョニング
](single-thing-provisioning.md)
+ [

# ジャストインタイムプロビジョニング
](jit-provisioning.md)
+ [

# 一括登録
](bulk-provisioning.md)

# 単一のモノプロビジョニング
<a name="single-thing-provisioning"></a>

モノをプロビジョニングするには、[RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html) API または `register-thing` CLI コマンドを使用します。`register-thing` CLI コマンドは次の引数をとります。

--template-body  
プロビジョニングテンプレート｡

--parameters  
プロビジョニングテンプレートで使用される、JSON 形式のパラメータの名前/値のペアのリスト（例: `{"ThingName" : "MyProvisionedThing", "CSR" : "csr-text"}`）。

「[プロビジョニングテンプレート](provision-template.md)」を参照してください。

[RegisterThing](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterThing.html) または `register-thing` は、作成した証明書のリソースとテキストの ARN を返します。

```
{
    "certificatePem": "certificate-text",
    "resourceArns": {
    "PolicyLogicalName": "arn:aws:iot:us-west-2:123456789012:policy/2A6577675B7CD1823E271C7AAD8184F44630FFD7",
    "certificate": "arn:aws:iot:us-west-2:123456789012:cert/cd82bb924d4c6ccbb14986dcb4f40f30d892cc6b3ce7ad5008ed6542eea2b049",
    "thing": "arn:aws:iot:us-west-2:123456789012:thing/MyProvisionedThing"
    }
}
```

ディクショナリからパラメータを省略すると、デフォルト値が使用されます。デフォルト値が指定されていない場合、パラメータは値に置き換えられません。

# ジャストインタイムプロビジョニング
<a name="jit-provisioning"></a>

ジャストインタイムプロビジョニング (JITP) を使用して、デバイスが最初に AWS IoTに接続しようとするときにデバイスをプロビジョニングできます。デバイスをプロビジョニングするには、自動登録を有効にして、プロビジョニングテンプレートを、デバイス証明書に署名するために使用される CA 証明書に関連付ける必要があります。プロビジョニングの成功とエラーは、Amazon CloudWatch の [デバイスプロビジョニングのメトリクス](metrics_dimensions.md#provisioning-metrics) と同様にログに記録されます。

**Topics**
+ [

## JITP の概要
](#jit-provisioning-overview)
+ [

## プロビジョニングテンプレートを使用して CA を登録する
](#jit-provisioning-registerCA-template)
+ [

## プロビジョニングテンプレート名を使用して CA を登録する
](#jit-provisioning-registerCA-templateName)

## JITP の概要
<a name="jit-provisioning-overview"></a>

登録された CA 証明書によって署名された証明書 AWS IoT を使用してデバイスが に接続しようとすると、 は CA 証明書からテンプレートを AWS IoT ロードし、それを使用して [RegisterThing](fleet-provision-api.md#register-thing) を呼び出します。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()`関数を使用して取得できます。

**注記**  
デバイスの最初の接続で信頼チェーン全体を送信しなくても、ジャ AWS IoT Core just-in-timeプロビジョニング (JITP) 機能を使用してデバイスをプロビジョニングできます AWS IoT Core。CA 証明書の提示はオプションですが、デバイスが AWS IoT Coreに接続するときに [[Server Name Indication (SNI)]](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) (サーバーネームインディケーション (SNI)) エクステンションを送信する必要があります。

### テンプレート本文の例
<a name="jit-provisioning-example-templatebody"></a>

次の JSON ファイルは、完全な JITP テンプレートのテンプレート本文の例です。

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

このサンプルテンプレートでは、証明書から抽出され、`AWS::IoT::Certificate::CommonName` セクションで使用されている `AWS::IoT::Certificate::SerialNumber`、`AWS::IoT::Certificate::Country`、`AWS::IoT::Certificate::Id` および `Resources` プロビジョニングパラメータの値を宣言します。次に、JITP ワークフローはこのテンプレートを使用して次のアクションを実行します。
+ 証明書を登録し、そのステータスを PENDING\$1ACTIVE に設定します。
+ 1 つのモノのリソースを作成します。
+ 1 つのポリシーのリソースを作成します。
+ ポリシーを証明書にアタッチします。
+ 証明書をモノにアタッチします。
+ 証明書のステータスを ACTIVE に更新します。

`templateBody` の `Parameters` セクションに記載されているすべてのプロパティが証明書に含まれていない場合、デバイスのプロビジョニングは失敗します。例えば、`AWS::IoT::Certificate::Country` がテンプレートに含まれていても、証明書に `Country` プロパティがない場合、デバイスのプロビジョニングは失敗します。

CloudTrail を使用して、JITP テンプレートに関する問題をトラブルシューティングすることもできます。Amazon CloudWatch にログ記録されるメトリクスについては、「[デバイスプロビジョニングのメトリクス](metrics_dimensions.md#provisioning-metrics)」を参照してください。プロビジョニングテンプレートの詳細については、「[プロビジョニングテンプレート](provision-template.md)」を参照してください。

**注記**  
プロビジョニングプロセス中に、just-in-timeプロビジョニング (JITP) は他の AWS IoT コントロールプレーン API オペレーションを呼び出します。これらの呼び出しは、アカウントに設定された[AWS IoT スロットリングクォータ](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits)を超過し、スロットリングされた呼び出しが発生する可能性があります。必要に応じて、[AWS カスタマーサポート](https://console.aws.amazon.com/support/home)に連絡して、スロットリングのクォータを引き上げてください。

## プロビジョニングテンプレートを使用して CA を登録する
<a name="jit-provisioning-registerCA-template"></a>

完全なプロビジョニングテンプレートを使用して CA を登録するには、次の手順に従います。

1. 次の例に示すようなプロビジョニングテンプレートとロール ARN 情報を JSON ファイルとして保存します。

   ```
   { 
        "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"
   }
   ```

   この例で、`templateBody` フィールドの値は、エスケープ文字列として指定された JSON オブジェクトである必要があり、[前のリスト](#jit-provisioning-overview)に示した値のみを使用できます。`json.dumps` (Python) や `JSON.stringify` （ノード）など、必要な JSON 出力を作成するには、さまざまなツールを使用できます。`roleARN` フィールドの値は、`AWSIoTThingsRegistration` がアタッチされたロールの ARN である必要があります。また、テンプレートでは例のインライン `PolicyName` の代わりに、既存の `PolicyDocument` を使用できます 

1. [RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) API オペレーションまたは [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html) CLI コマンドを使用して CA 証明書を登録します。前のステップで保存したプロビジョニングテンプレートとロール ARN 情報のディレクトリを指定します。

   以下に、 AWS CLIを使用して `DEFAULT` モードで 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
   ```

   以下に、 AWS CLIを使用して `SNI_ONLY` モードで CA 証明書を登録する方法の例を示します。

   ```
   aws iot register-ca-certificate --ca-certificate file://your-ca-cert --certificate-mode SNI_ONLY
                    --set-as-active --allow-auto-registration --registration-config file://your-template
   ```

   詳細については､「[Register your CA Certificates](https://docs.aws.amazon.com//iot/latest/developerguide/register-CA-cert.html)」(CA 証明書の登録) を参照してください。

1.  (オプション) [UpdateCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateCACertificate.html) API オペレーションまたは [https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-ca-certificate.html) CLI コマンドを使用して、CA 証明書の設定を更新します。

    AWS CLIを使用して CA 証明書を更新する方法の例を次に示します。

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

## プロビジョニングテンプレート名を使用して CA を登録する
<a name="jit-provisioning-registerCA-templateName"></a>

プロビジョニングテンプレート名を使用して CA を登録するには、次の手順に従います。

1. プロビジョニングテンプレート本文を JSON ファイルとして保存します。テンプレート本文の例は「[テンプレート本文の例](#jit-provisioning-example-templatebody)」にあります。

1. プロビジョニングテンプレートを作成するには、[CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html) API または [https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-provisioning-template.html)CLI コマンドを使用します。

   ```
   aws iot create-provisioning-template --template-name your-template-name \
           --template-body file://your-template-body.json --type JITP \
           --provisioning-role-arn arn:aws:iam::123456789012:role/test
   ```
**注記**  
ジャストインタイムプロビジョニング (JITP) の場合は、プロビジョニングテンプレートを作成するときにテンプレートタイプとして `JITP` を指定する必要があります｡ テンプレートタイプの詳細については、「*AWS API リファレンス*」の「[CreateProvisioningTemplate](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html)」を参照してください。

1. CA をテンプレート名で登録するには、[RegisterCACertificate](https://docs.aws.amazon.com/iot/latest/apireference/API_RegisterCACertificate.html) API または [https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html](https://docs.aws.amazon.com//cli/latest/reference/iot/register-ca-certificate.html) CLI コマンドを使用します。

   ```
   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 templateName=your-template-name
   ```

# 一括登録
<a name="bulk-provisioning"></a>

[https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html](https://docs.aws.amazon.com/iot/latest/apireference/API_StartThingRegistrationTask.html) コマンドを使用して、モノを一括で登録できます。このコマンドは、プロビジョニングテンプレート、S3 バケット名、キー名、ロール ARN (S3 バケット内のファイルへのアクセスを許可する) を使用します。S3 バケットのファイルには、テンプレート内のパラメータを置き換えるために使用される値が含まれています。このファイルは､改行で区切られた JSON ファイルでなければなりません。各行には、単一のデバイスを登録するためのすべてのパラメータ値が含まれています。例: 

```
{"ThingName": "foo", "SerialNumber": "123", "CSR": "csr1"}
{"ThingName": "bar", "SerialNumber": "456", "CSR": "csr2"}
```

以下の一括登録関連の API オペレーションが役立つ場合があります。
+ [ListThingRegistrationTasks](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTasks.html): 現在のモノの一括プロビジョニングタスクを一覧表示します。
+ [DescribeThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeThingRegistrationTask.html): 特定のモノの一括登録タスクに関する情報を提供します。
+ [StopThingRegistrationTask](https://docs.aws.amazon.com/iot/latest/apireference/API_StopThingRegistrationTask.html): 一括登録タスクを停止します。
+ [ListThingRegistrationTaskReports](https://docs.aws.amazon.com/iot/latest/apireference/API_ListThingRegistrationTaskReports.html): モノの一括登録タスクの結果、失敗、またはその両方を確認するために使用されます。

**注記**  
一度に実行できる一括登録オペレーションタスクは、（アカウントごとに） 1 つだけです。
一括登録オペレーションは、他の AWS IoT コントロールプレーン API オペレーションを呼び出します。これらの呼び出しは、アカウントの [AWS IoT スロットリングクォータ](https://docs.aws.amazon.com/general/latest/gr/iot-core.html#throttling-limits)を超過し、スロットルエラーが発生する可能性があります。必要に応じて、[AWS カスタマーサポート](https://console.aws.amazon.com/support/home)に連絡して AWS IoT スロットリングクォータを引き上げます。

# プロビジョニングテンプレート
<a name="provision-template"></a>

プロビジョニングテンプレートは、 パラメータを使用して、デバイスが操作するために使用する必要があるリソースを記述する JSON ドキュメントです AWS IoT。プロビジョニングテンプレートには `Parameters` と `Resources` の 2 つのセクションがあります。には 2 種類のプロビジョニングテンプレートがあります AWS IoT。1 つはジャストインタイムプロビジョニング (JITP) および一括登録に使用し、もう 1 つはフリートプロビジョニングに使用します。

**Topics**
+ [

## Parameters セクション
](#parameters-section)
+ [

## Resources セクション
](#resources-section)
+ [

## 一括登録のテンプレート例
](#bulk-template-example)
+ [

## ジャストインタイムプロビジョニング (JITP) のテンプレート例
](#JITP-template-example)
+ [

## フリートプロビジョニング
](#fleet-provision-template)

## Parameters セクション
<a name="parameters-section"></a>

`Parameters` セクションでは、`Resources` セクションで使用されるパラメータを宣言します。各パラメータは、名前、タイプ、およびオプションのデフォルト値を宣言します。デフォルト値は、テンプレートで渡されたディクショナリにパラメータの値が含まれていない場合に使用されます。テンプレートドキュメントの `Parameters` セクションは、次のようになります。

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    }
}
```

このテンプレート本文のスニペットでは、4 つのパラメータ (`ThingName`、`SerialNumber`、`Location`、`CSR`) を宣言します。これらのすべてのパラメータタイプは `String` です。`Location` パラメータは､デフォルト値 `"WA"` を宣言します。

## Resources セクション
<a name="resources-section"></a>

テンプレート本文の `Resources`セクションは、デバイスが通信するために必要なリソースを宣言します AWS IoT。モノ、証明書、および 1 つ以上の IoT ポリシーです。各リソースは、論理名、タイプ、および一連のプロパティを指定します。

論理名を使用すると、テンプレートの別の場所でリソースを参照できます。

タイプは、宣言するリソースのタイプを指定します。有効なタイプは次のとおりです｡
+ `AWS::IoT::Thing`
+ `AWS::IoT::Certificate`
+ `AWS::IoT::Policy`

指定するプロパティは、宣言するリソースのタイプによって異なります。

### モノのリソース
<a name="thing-resources"></a>

モノのリソースは、次のプロパティを使用して宣言されます。
+ `ThingName`: 文字列。
+ `AttributePayload`: オプション。名前と値のペアのリスト。
+ `ThingTypeName`: オプション。モノに関連するモノのタイプ型の文字列。
+ `ThingGroups`: オプション。モノが属するグループのリスト。
+ `BillingGroup`: オプション。関連する請求グループ名の文字列。
+ `PackageVersions`: オプション。関連するパッケージとバージョン名の文字列。

### 証明書リソース
<a name="certificate-resources"></a>

証明書は、次のいずれかの方法で指定できます。
+ 証明書署名リクエスト (CSR)｡
+ 既存のデバイス証明書の証明書 ID。(フリートプロビジョニングテンプレートで使用できるのは証明書 ID のみです)。
+  AWS IoTで登録された CA 証明書で作成されたデバイス証明書。同じ件名フィールドに複数の CA 証明書が登録されている場合は、デバイス証明書の署名に使用された CA 証明書も渡す必要があります。

**注記**  
テンプレートで証明書を宣言する場合は、これらのいずれかの方法のみを使用してください。たとえば、CSR を使用する場合は、証明書 ID またはデバイス証明書を指定することもできません。詳細については、「[X.509 クライアント証明書](x509-client-certs.md)」を参照してください。

詳細については、「[X.509 証明書の概要](authentication.md#x509-certificate-overview)」を参照してください。

証明書リソースは、次のプロパティを使用して宣言されます。
+ `CertificateSigningRequest`: 文字列。
+ `CertificateId`: 文字列。
+ `CertificatePem`: 文字列。
+ `CACertificatePem`: 文字列。
+ `Status`: オプション。`ACTIVE` または `INACTIVE` を指定できる文字列。デフォルトは ACTIVE です。
+ `ThingPrincipalType`: オプション。モノとプリンシパル (証明書) の関係のタイプを指定する文字列。
  + `EXCLUSIVE_THING`: 排他的な関係を確立します。プリンシパルは、この特定のモノにのみアタッチでき、これ以外のモノにはアタッチできません。
  + `NON_EXCLUSIVE_THING`: 指定されたプリンシパルをモノにアタッチします。プリンシパルに複数のモノをアタッチできます。値が指定されていない場合は、これがデフォルト値です。
**注記**  
デバイス証明書なしでデバイスをプロビジョニングすることもできます。詳細については、「[フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング](provision-wo-cert.md)」を参照してください。

例:
+ CSR で指定された証明書:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateSigningRequest": {"Ref" : "CSR"},
              "Status" : "ACTIVE"      
          }
      }
  }
  ```
+ 既存の証明書 ID で指定された証明書:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CertificateId": {"Ref" : "CertificateId"}
          }
      }
  }
  ```
+ 既存の証明書 .pem および CA 証明書 .pem で指定された証明書:

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CACertificatePem": {"Ref" : "CACertificatePem"},
              "CertificatePem": {"Ref" : "CertificatePem"}
          }
      }
  }
  ```
+ プリンシパルに 1 つのモノを排他的にアタッチします。

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "ThingPrincipalType" : "EXCLUSIVE_THING"
          }
      }
  }
  ```

### ポリシーリソース
<a name="policy-resources"></a>

ポリシーリソースは、以下のいずれかのプロパティを使用して宣言されます。
+ `PolicyName`: オプション。文字列。デフォルトはポリシードキュメントのハッシュです。`PolicyName` は AWS IoT ポリシーのみ参照可能で、IAM ポリシーは参照可能ではありません。既存の AWS IoT ポリシーを使用している場合は、`PolicyName` プロパティに、ポリシーの名前を入力します。`PolicyDocument` プロパティを含めないでください。
+ `PolicyDocument`: オプション。エスケープした文字列として指定された JSON オブジェクト。`PolicyDocument` が指定されていない場合は、ポリシーを作成しておく必要があります。

**注記**  
`Policy` セクションが存在する場合、`PolicyName` または `PolicyDocument` を指定する必要がありますが、両方を指定することはできません。

### 上書き設定
<a name="override-settings"></a>

テンプレートに既に存在するリソースが指定されている場合、`OverrideSettings` セクションでは、実行するアクションを指定できます。

`DO_NOTHING`  
リソースはそのままにしておきます。

`REPLACE`  
リソースをテンプレートで指定されたリソースに置き換えます。

`FAIL`  
リクエストが `ResourceConflictsException`で失敗します。

`MERGE`  
`ThingGroups` の `AttributePayload` および `thing` プロパティにのみ有効です。モノの既存の属性またはグループメンバーシップを、テンプレートで指定された属性またはグループメンバーシップとマージします。

モノのリソースを宣言する場合は、次のプロパティに `OverrideSettings` を指定できます。
+ `ATTRIBUTE_PAYLOAD`
+ `THING_TYPE_NAME`
+ `THING_GROUPS`

モノの証明書リソースを宣言する場合は、`OverrideSettings` プロパティに `Status` を指定できます。

`OverrideSettings` をこのポリシーリソースに使用することはできません。

### リソースの例
<a name="resource-example"></a>

次のテンプレートスニペットでは、モノ、証明書、およびポリシーを宣言します。

```
{ 
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },  
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE"      
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

モノは､次のもので宣言されます。
+ 論理名 `"thing"`。
+ 型 `AWS::IoT::Thing`。
+  モノのプロパティのセット。

  モノのプロパティには、モノの名前、属性セット、オプションのモノのタイプ名、モノが属するモノのグループのオプションのリストが含まれます。

パラメータは､`{"Ref":"parameter-name"}` によって参照されます。テンプレートが評価されると、パラメータは、テンプレートと共に渡されたディクショナリのパラメータの値に置き換えられます。

証明書は､次のもので宣言されます。
+ 論理名 `"certificate"`。
+ 型 `AWS::IoT::Certificate`。
+ プロパティのセット。

  プロパティには証明書の CSR を含めて､ステータスを `ACTIVE` に設定します。CSR テキストは、テンプレートと共に渡されたディクショナリのパラメータとして渡されます。

ポリシーは､次のもので宣言されます。
+ 論理名 `"policy"`。
+ 型 `AWS::IoT::Policy`。
+ 既存のポリシー名またはポリシードキュメントの名前。

## 一括登録のテンプレート例
<a name="bulk-template-example"></a>

以下の JSON ファイルは、CSR で証明書を指定する完全なプロビジョニングテンプレートの例です。

(`PolicyDocument` フィールドの値は、エスケープ文字列として指定された JSON オブジェクトである必要があります。)

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber" : {
            "Type" : "String"
        },
        "Location" : {
            "Type" : "String",
            "Default" : "WA"
        },
        "CSR" : {
            "Type" : "String"    
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "ThingName" : {"Ref" : "ThingName"},
                "AttributePayload" : { "version" : "v1", "serialNumber" :  {"Ref" : "SerialNumber"}}, 
                "ThingTypeName" :  "lightBulb-versionA",
                "ThingGroups" : ["v1-lightbulbs", {"Ref" : "Location"}]
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateSigningRequest": {"Ref" : "CSR"},
                "Status" : "ACTIVE",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : "{ \"Version\": \"2012-10-17\",		 	 	  \"Statement\": [{ \"Effect\": \"Allow\", \"Action\":[\"iot:Publish\"], \"Resource\": [\"arn:aws:iot:us-east-1:123456789012:topic/foo/bar\"] }] }"
            }
        }
    }
}
```

## ジャストインタイムプロビジョニング (JITP) のテンプレート例
<a name="JITP-template-example"></a>

以下の JSON ファイルは、証明書 ID で既存の証明書を指定する完全なプロビジョニングテンプレートの例です。

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

**重要**  
JIT プロビジョニング用のテンプレートでは `CertificateId` を使用する必要があります。

プロビジョニングテンプレートのタイプの詳細については、 [https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateProvisioningTemplate.html#iot-CreateProvisioningTemplate-request-type) AWS API リファレンスの「」を参照してください。

このテンプレートをジャストインタイムプロビジョニングに使用する方法の詳細については、「[ジャストインタイムプロビジョニング](https://docs.aws.amazon.com/iot/latest/developerguide/jit-provisioning.html)」を参照してください。

## フリートプロビジョニング
<a name="fleet-provision-template"></a>

フリートプロビジョニングテンプレートは、クラウドおよびデバイス設定をセットアップ AWS IoT するために によって使用されます。これらのテンプレートは、JITP テンプレートおよび一括登録テンプレートと同じパラメータおよびリソースを使用します。詳細については、「[プロビジョニングテンプレート](#provision-template)」を参照してください。フリートプロビジョニングテンプレートには、`Mapping` セクションと `DeviceConfiguration` セクションを含めることができます。フリートプロビジョニングテンプレート内で組み込み関数を使用して、デバイス固有の設定を生成できます。フリートプロビジョニングテンプレートは名前付きリソースで、ARN によって識別されます (例: `arn:aws:iot:us-west-2:1234568788:provisioningtemplate/templateName`)。

### Mappings
<a name="mappings"></a>

任意の `Mappings` セクションでは、キーと名前付きの一連の値とが対応付けられます。たとえば、リージョンに基づいて AWS 値を設定する場合は、その AWS リージョン 名前をキーとして使用し、特定のリージョンごとに指定する値を含むマッピングを作成できます。マップ内の値を取得するには、`Fn::FindInMap` 組み込み関数を使用します。

`Mappings` セクションにパラメータ、擬似パラメータを含めること、または組み込み関数を呼び出すことはできません

### デバイス設定
<a name="device-config"></a>

デバイス設定セクションには、プロビジョニング時にデバイスに送信する任意のデータが含まれています。例えば、次のようになります。

```
{
    "DeviceConfiguration": {
        "Foo":"Bar"
    }
}
```

JavaScript Object Notation (JSON) ペイロード形式を使用してデバイスにメッセージを送信する場合、 はこのデータを JSON として AWS IoT Core フォーマットします。Concise Binary Object Representation (CBOR) ペイロード形式を使用している場合、 AWS IoT Core はこのデータを CBOR としてフォーマットします。`DeviceConfiguration` セクションは、ネストされた JSON オブジェクトをサポートしていません。

### 組み込み関数
<a name="intrinsic-functions"></a>

組み込み関数は、`Mappings` セクションを除くプロビジョニングテンプレートの任意のセクションで使用されます。

`Fn::Join`  
一連の値を特定の区切り文字で区切って 1 つの値に追加します。区切り文字が空の文字列の場合、値は区切り文字を使用することなく連結されます。  
`Fn::Join` は [ポリシーリソース](#policy-resources) に対してサポートされていません。

`Fn::Select`  
インデックスによってオブジェクトのリストから単一のオブジェクトを返します。  
`Fn::Select` では、`null` 値のチェックや、インデックスが配列の範囲外であるかどうかのチェックは行われません。どちらの条件もプロビジョニングエラーになるため、有効なインデックス値を選択し、リストに null 以外が含まれていることを確認してください。

`Fn::FindInMap`  
`Mappings` セクションで宣言された 2 つのレベルのマッピングのキーに対応する値を返します。

`Fn::Split`  
文字列を文字列値のリストに分割して、文字列リストから要素を選択できるようにします。文字列の分割位置を決定する区切り文字 (カンマなど) を指定します。文字列を分割した後、`Fn::Select` を使用して要素を選択します。  
たとえば、サブネット ID のカンマ区切りの文字列がスタックテンプレートにインポートされる場合は、各カンマで文字列を分割できます。サブネット ID のリストから、`Fn::Select` を使用してリソースのサブネット ID を指定します。

`Fn::Sub`  
特定した値の入力文字列にある変数の代わりになります。スタックを作成または更新するまで使用できない値を含むコマンドまたは出力を作成するために、この関数を使用できます。

### フリートプロビジョニングのテンプレート例
<a name="fleet-provisioning-example"></a>

```
{
    "Parameters" : {
        "ThingName" : {
            "Type" : "String"
        },
        "SerialNumber": {
            "Type": "String"
        },
        "DeviceLocation": {
            "Type": "String"
        }
    },
    "Mappings": {
        "LocationTable": {
            "Seattle": {
                "LocationUrl": "https://example.aws"
            }
        }
    },
    "Resources" : {
        "thing" : {
            "Type" : "AWS::IoT::Thing",
            "Properties" : {
                "AttributePayload" : { 
                    "version" : "v1",
                    "serialNumber" : "serialNumber"
                },
                "ThingName" : {"Ref" : "ThingName"},
                "ThingTypeName" : {"Fn::Join":["",["ThingPrefix_",{"Ref":"SerialNumber"}]]},
                "ThingGroups" : ["v1-lightbulbs", "WA"],
                "BillingGroup": "LightBulbBillingGroup"
            },
            "OverrideSettings" : {
                "AttributePayload" : "MERGE",
                "ThingTypeName" : "REPLACE",
                "ThingGroups" : "DO_NOTHING"
            }
        },
        "certificate" : {
            "Type" : "AWS::IoT::Certificate",
            "Properties" : {
                "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
                "Status" : "Active",
                "ThingPrincipalType" : "EXCLUSIVE_THING"
            }
        },
        "policy" : {
            "Type" : "AWS::IoT::Policy",
            "Properties" : {
                "PolicyDocument" : {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [{
                        "Effect": "Allow",
                        "Action":["iot:Publish"],
                        "Resource": ["arn:aws:iot:us-east-1:123456789012:topic/foo/bar"]
                    }]
                }
            }
        }
    },
    "DeviceConfiguration": {
        "FallbackUrl": "https://www.example.com/test-site",
        "LocationUrl": {
            "Fn::FindInMap": ["LocationTable",{"Ref": "DeviceLocation"}, "LocationUrl"]}
        }
}
```

**注記**  
既存のプロビジョニングテンプレートを更新して、[事前プロビジョニングフック](pre-provisioning-hook.md)を追加できます。

# 事前プロビジョニングフック
<a name="pre-provisioning-hook"></a>

AWS では、プロビジョニングテンプレートを作成するときに事前プロビジョニングフック関数を使用することをお勧めします。これにより、アカウントがオンボードするデバイスとその数をより詳細に制御できます。事前プロビジョニングフックは、デバイスのプロビジョニングを許可する前に、デバイスから渡されたパラメータを検証する Lambda 関数です。この Lambda 関数は、デバイスが [RegisterThing](fleet-provision-api.md#register-thing) を介してリクエストを送信するたびに呼び出されるため、デバイスをプロビジョニングする前にアカウントに存在する必要があります。

**重要**  
Lambda アクションにアタッチされたポリシーのグローバル条件コンテキストキーに `source-arn` または `source-account` を必ず含め、アクセス許可の操作を防止します。詳細については、「[サービス間での不分別な代理処理の防止](cross-service-confused-deputy-prevention.md)」を参照してください。

デバイスをプロビジョニングするには、Lambda 関数が入力オブジェクトを受け入れ、このセクションで説明する出力オブジェクトを返す必要があります。プロビジョニングは、Lambda 関数が `"allowProvisioning": True` のオブジェクトを返す場合にのみ続行されます。

## 事前プロビジョニングフックの入力
<a name="pre-provisioning-hook-input"></a>

AWS IoT デバイスが に登録されると、 はこのオブジェクトを Lambda 関数に送信します AWS IoT。

```
{
    "claimCertificateId" : "string",
    "certificateId" : "string",
    "certificatePem" : "string",
    "templateArn" : "arn:aws:iot:us-east-1:1234567890:provisioningtemplate/MyTemplate",
    "clientId" : "221a6d10-9c7f-42f1-9153-e52e6fc869c1",
    "parameters" : {
        "string" : "string",
        ...
    }
}
```

Lambda 関数に渡される `parameters` オブジェクトには、[RegisterThing](fleet-provision-api.md#register-thing) リクエストペイロードで渡される `parameters` 引数のプロパティが含まれています。

## 事前プロビジョニングフックの戻り値
<a name="pre-provisioning-hook-output"></a>

この Lambda 関数は、プロビジョニングリクエスト、およびオーバーライドするプロパティの値を承認したかどうかを示す応答を返す必要があります。

次に、事前プロビジョニング機能からの正常な応答の例を示します。

```
{
    "allowProvisioning": true,
    "parameterOverrides" : {
        "Key": "newCustomValue",
        ...
    }
}
```

`"parameterOverrides"` 値は、[RegisterThing](fleet-provision-api.md#register-thing) リクエストペイロードの `"parameters"` パラメータに追加されます。

**注記**  
Lambda 関数が失敗すると、プロビジョニングリクエストは `ACCESS_DENIED` で失敗し、エラーが CloudWatch Logs に記録されます。
Lambda 関数が応答で `"allowProvisioning": "true"` を返さない場合、プロビジョニング要求は `ACCESS_DENIED` で失敗します。
Lambda 関数の実行が終了し、5 秒以内に戻る必要があります。そうでない場合は、プロビジョニングリクエストは失敗します。

## 事前プロビジョニングフック Lambda の例
<a name="pre-provisioning-example"></a>

------
#### [ Python ]

Python での事前プロビジョニングフック Lambda の例。

```
import json

def pre_provisioning_hook(event, context):
    print(event)

    return {
        'allowProvisioning': True,
        'parameterOverrides': {
            'DeviceLocation': 'Seattle'
        }
    }
```

------
#### [ Java ]

Java での事前プロビジョニングフック Lambda の例。

ハンドラークラス:

```
package example;

import java.util.Map;
import java.util.HashMap;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class PreProvisioningHook implements RequestHandler<PreProvisioningHookRequest, PreProvisioningHookResponse> {

    public PreProvisioningHookResponse handleRequest(PreProvisioningHookRequest object, Context context) {
        Map<String, String> parameterOverrides = new HashMap<String, String>();
        parameterOverrides.put("DeviceLocation", "Seattle");

        PreProvisioningHookResponse response = PreProvisioningHookResponse.builder()
                .allowProvisioning(true)
                .parameterOverrides(parameterOverrides)
                .build();

        return response;
    }

}
```

リクエストクラス:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookRequest {
    private String claimCertificateId;
    private String certificateId;
    private String certificatePem;
    private String templateArn;
    private String clientId;
    private Map<String, String> parameters;
}
```

Response クラス:

```
package example;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;


@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PreProvisioningHookResponse {
    private boolean allowProvisioning;
    private Map<String, String> parameterOverrides;
}
```

------
#### [ JavaScript ]

JavaScript での事前プロビジョニングフック Lambda の例。

```
exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event, null, 2));
    var reply = { 
        allowProvisioning: true,
        parameterOverrides: {
            DeviceLocation: 'Seattle'
        }
     };
     callback(null, reply);
}
```

------

# 証明書プロバイダーを使用したセルフマネージド AWS IoT Core 証明書署名
<a name="provisioning-cert-provider"></a>

 AWS IoT Core 証明書プロバイダーを作成して、 AWS IoT フリートプロビジョニングで証明書署名リクエスト (CSRsに署名できます。証明書プロバイダーは、Lambda 関数と[`CreateCertificateFromCsr`フリートプロビジョニング の MQTT API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) を参照します。Lambda 関数は CSR を受け入れ、署名付きクライアント証明書を返します。

に証明書プロバイダーがない場合 AWS アカウント、[CreateCertificateFromCsr MQTT API ](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr)はフリートプロビジョニングで呼び出され、CSR から証明書を生成します。証明書プロバイダーを作成すると、[CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) の動作が変更され、この MQTT API へのすべての呼び出しは証明書プロバイダーを呼び出して証明書を発行します。

 AWS IoT Core 証明書プロバイダーを使用すると、、他のパブリックに信頼された CAs[AWS Private CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)、または独自のパブリックキーインフラストラクチャ (PKI) などのプライベート認証機関 (CAs) を利用して CSR に署名するソリューションを実装できます。さらに、証明書プロバイダーを使用して、有効期間、署名アルゴリズム、発行者、拡張機能などのクライアント証明書のフィールドをカスタマイズできます。

**重要**  
作成できる証明書プロバイダーは、 AWS アカウントごとに 1 つだけです。署名動作の変更は、 AWS アカウントから証明書プロバイダーを削除するまで [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) を呼び出すフリート全体に適用されます。

**Topics**
+ [

## フリートプロビジョニングでのセルフマネージド証明書署名の仕組み
](#provisioning-cert-provider-how-it-works)
+ [

## 証明書プロバイダーの Lambda 関数入力
](#provisioning-cert-provider-lambda-input)
+ [

## 証明書プロバイダーの Lambda 関数の戻り値
](#provisioning-cert-provider-lambda-return)
+ [

## Lambda 関数の例
](#provisioning-cert-provider-lambda)
+ [

## フリートプロビジョニング用のセルフマネージド証明書署名
](#provisioning-self-certificate-signing)
+ [

## AWS CLI 証明書プロバイダーの コマンド
](#provisioning-cert-provider-cli)

## フリートプロビジョニングでのセルフマネージド証明書署名の仕組み
<a name="provisioning-cert-provider-how-it-works"></a>

### 主要なコンセプト
<a name="provisioning-cert-provider-concepts"></a>

以下の概念は、フリー AWS IoT トプロビジョニングでのセルフマネージド証明書署名の仕組みを理解するのに役立つ詳細を提供します。詳細については、「[フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング](https://docs.aws.amazon.com//iot/latest/developerguide/provision-wo-cert.html)」を参照してください。

**AWS IoT フリートのプロビジョニング**  
 AWS IoT フリートプロビジョニング (フリートプロビジョニングの略) では、 は、初めて に接続するときにデバイス証明書 AWS IoT Core を生成し AWS IoT Core 、安全にデバイスに配信します。フリートプロビジョニングを使用して、デバイス証明書のないデバイスを AWS IoT Coreに接続できます。

**証明書署名リクエスト (CSR)**  
フリートプロビジョニングの過程で、デバイスは[フリートプロビジョニング MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) を介して AWS IoT Core にリクエストします。このリクエストには、クライアント証明書を作成するために署名される証明書署名リクエスト (CSR) が含まれます。

**AWS フリートプロビジョニングでの マネージド証明書署名**  
AWS managed は、フリートプロビジョニングでの証明書署名のデフォルト設定です。 AWS マネージド証明書署名では、 AWS IoT Core は独自の CA を使用して CSRs に署名します。 CAs

**フリートプロビジョニングでのセルフマネージド証明書署名**  
セルフマネージドは、フリートプロビジョニングで証明書に署名するためのもう 1 つのオプションです。セルフマネージド証明書署名では、CSR に署名するための AWS IoT Core 証明書プロバイダーを作成します。セルフマネージド証明書署名を使用して、 AWS プライベート CA、その他のパブリックに信頼された CA、または独自のパブリックキーインフラストラクチャ (PKI) によって生成された CA を使用して CSR に署名できます。

**AWS IoT Core 証明書プロバイダー**  
AWS IoT Core 証明書プロバイダー (証明書プロバイダーの略) は、フリートプロビジョニングのセルフマネージド証明書署名に使用されるカスタマーマネージドリソースです。

### 図
<a name="provisioning-cert-provider-diagram"></a>

次の図は、 AWS IoT フリートプロビジョニングでの自己証明書署名の仕組みを簡略化したものです。

![\[AWS IoT Core フリートプロビジョニングの証明書プロバイダー\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/images/provisioning-cert-provider.png)

+ 新しい IoT デバイスが製造またはフリートに導入された場合、それ自体を認証するにはクライアント証明書が必要です AWS IoT Core。
+ フリートプロビジョニングプロセスの一環として、デバイスはフリートプロビジョニング MQTT API を通じてクライアント証明書を AWS IoT Core にリクエストします。 [ APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) このリクエストには、証明書署名リクエスト (CSR) が含まれます。
+ AWS IoT Core は証明書プロバイダーを呼び出し、CSR を入力としてプロバイダーに渡します。
+ 証明書プロバイダーは CSR を入力として受け取り、クライアント証明書を発行します。

   AWS マネージド証明書署名の場合、 は独自の CA を使用して CSR AWS IoT Core に署名し、クライアント証明書を発行します。
+ 発行されたクライアント証明書により、デバイスはフリートのプロビジョニングを継続し、 AWS IoT Coreとの安全な接続を確立します。

## 証明書プロバイダーの Lambda 関数入力
<a name="provisioning-cert-provider-lambda-input"></a>

AWS IoT Core は、デバイスが Lambda 関数に登録するときに、次のオブジェクトを Lambda 関数に送信します。`certificateSigningRequest` の値は、`CreateCertificateFromCsr` リクエストで提供される[プライバシー強化メール (PEM) 形式](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate-format.html)の CSR です。`principalId` は、`CreateCertificateFromCsr`リクエストの実行 AWS IoT Core 時に に接続するために使用されるプリンシパルの ID です。 `clientId`は、MQTT 接続に設定されたクライアント ID です。

```
{
	"certificateSigningRequest": "string",
	"principalId": "string",
	"clientId": "string"
}
```

## 証明書プロバイダーの Lambda 関数の戻り値
<a name="provisioning-cert-provider-lambda-return"></a>

Lambda 関数は、`certificatePem` 値を含むレスポンスを返す必要があります。以下は、成功したレスポンスの例です。 AWS IoT Core は戻り値 (`certificatePem`) を使用して証明書を作成します。

```
{
	"certificatePem": "string"
}
```

登録が成功すると、`CreateCertificateFromCsr` は `CreateCertificateFromCsr` レスポンスで同じ `certificatePem` を返します。詳細については、[CreateCertificateFromCsr](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) のレスポンスペイロードの例を参照してください。

## Lambda 関数の例
<a name="provisioning-cert-provider-lambda"></a>

証明書プロバイダーを作成する前に、CSR に署名するための Lambda 関数を作成する必要があります。次のコードは、Python での Lambda 関数の例です。この関数は AWS Private CA を呼び出して、プライベート CA と `SHA256WITHRSA` 署名アルゴリズムを使用して入力 CSR に署名します。返されたクライアント証明書は 1 年間有効です。の詳細 AWS Private CA とプライベート CA の作成方法については、[AWS 「プライベート CA とは](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)」および[「プライベート CA の作成](https://docs.aws.amazon.com/privateca/latest/userguide/create-CA.html)」を参照してください。

```
import os
import time
import uuid
import boto3

def lambda_handler(event, context):
    ca_arn = os.environ['CA_ARN']
    csr = (event['certificateSigningRequest']).encode('utf-8')

    acmpca = boto3.client('acm-pca')
    cert_arn = acmpca.issue_certificate(
        CertificateAuthorityArn=ca_arn, 
        Csr=csr,
        Validity={"Type": "DAYS", "Value": 365}, 
        SigningAlgorithm='SHA256WITHRSA',
        IdempotencyToken=str(uuid.uuid4())
    )['CertificateArn']
    
    # Wait for certificate to be issued
    time.sleep(1)    
    cert_pem = acmpca.get_certificate(
        CertificateAuthorityArn=ca_arn,
        CertificateArn=cert_arn
    )['Certificate']
    
    return {
        'certificatePem': cert_pem
    }
```

**重要**  
Lambda 関数によって返される証明書には、証明書署名リクエスト (CSR) と同じサブジェクト名とパブリックキーが必要です。
Lambda 関数の実行は 5 秒で完了する必要があります。
Lambda 関数は、証明書プロバイダーリソースと同じ AWS アカウント およびリージョンにある必要があります。
 AWS IoT サービスプリンシパルには、Lambda 関数への呼び出しアクセス許可を付与する必要があります。[混乱した代理問題](https://docs.aws.amazon.com//IAM/latest/UserGuide/confused-deputy.html)を回避するため、 呼び出しアクセス許可には `sourceArn`と `sourceAccount` を設定することをお勧めします。詳細については、[クロスサービスでの混乱した代理処理を防止する](https://docs.aws.amazon.com//iot/latest/developerguide/cross-service-confused-deputy-prevention.html)を参照してください。

[Lambda](https://docs.aws.amazon.com//lambda/latest/dg/access-control-resource-based.html) の次のリソースベースのポリシー例では、Lambda 関数を呼び出すアクセス許可を AWS IoT に付与します。

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Id": "InvokePermission",
	"Statement": [
		{
			"Sid": "LambdaAllowIotProvider",
			"Effect": "Allow",
			"Principal": {
				"Service": "iot.amazonaws.com"
			},
			"Action": "lambda:InvokeFunction",
			"Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
			"Condition": {
				"StringEquals": {
					"AWS:SourceAccount": "123456789012"
				},
				"ArnLike": {
				"AWS:SourceArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider/my-certificate-provider"
				}
			}
		}
	]
}
```

## フリートプロビジョニング用のセルフマネージド証明書署名
<a name="provisioning-self-certificate-signing"></a>

 AWS CLI または AWS マネジメントコンソールを使用して、フリートプロビジョニング用のセルフマネージド証明書署名を選択できます。

### AWS CLI
<a name="provisioning-self-certificate-signing-cli"></a>

セルフマネージド証明書署名を選択するには、フリートプロビジョニングで CSRs に署名する証明書プロバイダーを作成 AWS IoT Core する必要があります。 は証明書プロバイダーを AWS IoT Core 呼び出し、CSR を入力として受け取り、クライアント証明書を返します。証明書プロバイダーを作成するには、`CreateCertificateProvider` API オペレーションまたは `create-certificate-provider` CLI コマンドを使用します。

**注記**  
証明書プロバイダーを作成すると、[`CreateCertificateFromCsr`フリートプロビジョニング用の API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) の動作が変更され、`CreateCertificateFromCsr` へのすべての呼び出しが証明書プロバイダーを呼び出して証明書を作成します。この動作は、証明書プロバイダーの作成後に変更されるまでに数分かかる場合があります。

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

次は、このコマンドの出力の例を示しています。

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

詳細については、「*AWS IoT** API リファレンス*」の「`[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)`」を参照してください。

### AWS マネジメントコンソール
<a name="provisioning-self-certificate-signing-console"></a>

を使用したセルフマネージド証明書署名を選択するには AWS マネジメントコンソール、次の手順に従います。

1. [[AWS IoT コンソール]](https://console.aws.amazon.com//iot/home) に移動します。

1. 左のナビゲーションペインの **[セキュリティ]** で、**[証明書]** を選択します。

1. **[証明書署名]** ページで、**[証明書署名の詳細]** で **[証明書署名方法の編集]** を選択します。

1. **[証明書署名方法の編集]** ページで、**[証明書署名方法]** で **[セルフマネージド]** を選択します。

1. **[セルフマネージド設定]** セクションで、証明書プロバイダーの名前を入力し、Lambda 関数を作成または選択します。

1. **[証明書署名を更新]** を選択します。

## AWS CLI 証明書プロバイダーの コマンド
<a name="provisioning-cert-provider-cli"></a>

### 証明書プロバイダーを作成する
<a name="provisioning-create-cert-provider"></a>

証明書プロバイダーを作成するには、`CreateCertificateProvider` API オペレーションまたは `create-certificate-provider` CLI コマンドを使用します。

**注記**  
証明書プロバイダーを作成すると、[`CreateCertificateFromCsr`フリートプロビジョニング用の API](https://docs.aws.amazon.com/iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) の動作が変更され、`CreateCertificateFromCsr` へのすべての呼び出しが証明書プロバイダーを呼び出して証明書を作成します。この動作は、証明書プロバイダーの作成後に変更されるまでに数分かかる場合があります。

```
aws iot create-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-1 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

次は、このコマンドの出力の例を示しています。

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

詳細については、「*AWS IoT* *API リファレンス*」の「`[CreateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateCertificateProvider.html)`」を参照してください。

### 証明書プロバイダーを更新する
<a name="provisioning-update-cert-provider"></a>

証明書プロバイダーを更新するには、`UpdateCertificateProvider` API オペレーションまたは `update-certificate-provider` CLI コマンドを使用します。

```
aws iot update-certificate-provider \
                --certificateProviderName my-certificate-provider \
                --lambdaFunctionArn arn:aws:lambda:us-east-1:123456789012:function:my-function-2 \
                --accountDefaultForOperations CreateCertificateFromCsr
```

次は、このコマンドの出力の例を示しています。

```
{
	"certificateProviderName": "my-certificate-provider",
	"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
}
```

詳細については、「*AWS IoT** API リファレンス*」の「`[UpdateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateCertificateProvider.html)`」を参照してください。

### 証明書プロバイダーを記述する
<a name="provisioning-describe-cert-provider"></a>

証明書プロバイダーを記述するには、`DescribeCertificateProvider` API オペレーションまたは `describe-certificate-provider` CLI コマンドを使用します。

```
aws iot describe-certificate-provider --certificateProviderName my-certificate-provider
```

次は、このコマンドの出力の例を示しています。

```
{
	"certificateProviderName": "my-certificate-provider",
	"lambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
	"accountDefaultForOperations": [
		"CreateCertificateFromCsr"
	],
	"creationDate": "2022-11-03T00:15",
	"lastModifiedDate": "2022-11-18T00:15"
}
```

詳細については、「*AWS IoT* *API リファレンス*」の「`[DescribeCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DescribeCertificateProvider.html)`」を参照してください。

### 証明書プロバイダーを削除する
<a name="provisioning-delete-cert-provider"></a>

証明書プロバイダーを削除するには、`DeleteCertificateProvider` API オペレーションまたは `delete-certificate-provider` CLI コマンドを使用します。証明書プロバイダーリソースを削除すると、 の動作`CreateCertificateFromCsr`が再開され、CSR AWS IoT から によって署名された証明書 AWS IoT が作成されます。

```
aws iot delete-certificate-provider --certificateProviderName my-certificate-provider
```

このコマンドでは、出力が生成されません。

詳細については、「*AWS IoT* *API リファレンス*」の「`[DeleteCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_DeleteCertificateProvider.html)`」を参照してください。

### 証明書プロバイダーを一覧表示する
<a name="provisioning-list-cert-provider"></a>

内の証明書プロバイダーを一覧表示するには AWS アカウント、 `ListCertificateProviders` API オペレーションまたは `list-certificate-providers` CLI コマンドを使用します。

```
aws iot list-certificate-providers
```

次は、このコマンドの出力の例を示しています。

```
{
	"certificateProviders": [
		{
			"certificateProviderName": "my-certificate-provider",
			"certificateProviderArn": "arn:aws:iot:us-east-1:123456789012:certificateprovider:my-certificate-provider"
		}
	]
}
```

詳細については、「*AWS IoT** API リファレンス*」の「[https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html](https://docs.aws.amazon.com//iot/latest/apireference/API_ListCertificateProviders.html)」を参照してください。

# デバイスをインストールするユーザーの IAM ポリシーとロールの作成
<a name="provision-create-role"></a>

**注記**  
これらの手順は、 AWS IoT コンソールから指示された場合にのみ使用します。  
コンソールからこのページに移動するには、[[create a new provisioning template]](https://console.aws.amazon.com//iot/home#/provisioningtemplate/create/provisioningmethods/trustedUser) (新しいプロビジョニングテンプレートを作成) を開きます。

## AWS IoT これをコンソールで実行できないのはなぜですか?
<a name="provision-create-role-why"></a>

最も安全な操作のために、IAM アクションは IAM コンソールで実行されます。このセクションの手順では、プロビジョニングテンプレートを使用するために必要な IAM ロールとポリシーを作成するステップについて説明します。

## デバイスをインストールするユーザーの IAM ポリシーの作成
<a name="provision-create-role-policy"></a>

この手順では、プロビジョニングテンプレートを使用してデバイスをインストールすることをユーザーに許可する IAM ポリシーの作成方法について説明します。

この手順の実行中に、IAM コンソールと AWS IoT コンソールを切り替えます。この手順を完了するまで、両方のコンソールを同時に開いておくことをお勧めします。

**デバイスをインストールするユーザーの IAM ポリシーを作成するには**

1. [IAM コンソールのポリシーハブ](https://console.aws.amazon.com//iamv2/home#/policies)を開きます。

1. **[ポリシーを作成]** を選択します。

1. **[ポリシーの作成]** ページで、**[JSON]** タブを選択します。

1. **ユーザーポリシーとロールの設定**を選択した AWS IoT コンソールのページに切り替えます。

1. **[Sample provisioning policy]** (プロビジョニングポリシーのサンプル) で、**[Copy]** (コピー) を選択します。

1. IAM コンソールに切り替えます。

1. **JSON** エディタで、 AWS IoT コンソールからコピーしたポリシーを貼り付けます。このポリシーは、 AWS IoT コンソールで作成するテンプレートに固有です。

1. 続行するには、**[Next: Tags]** (次へ: タグ) を選択します。

1. **[Add tags (Optional)]** (タグの追加 (オプション)) ページで、このポリシーに追加するタグごとに **[Add tag]** (タグを追加) を選択します。追加するタグがない場合は、このステップをスキップできます。

1. **[次へ: 確認]** を選択して続行します。

1. [**ポリシーの確認**] ページで、以下の作業を行います。

   1. **[Name\$1]** (名前\$1) に、ポリシーの目的を簡単に示すポリシー名を入力します。

      次の手順で使用するため、このポリシーの名前を書き留めておきます。

   1. 作成するポリシーの説明 (オプション) を入力できます。

   1. このポリシーの残りの部分とそのタグを確認します。

1. ポリシーの作成を完了するには、**[Create Policy]** (ポリシーの作成) を選択します。

新しいポリシーを作成したら、引き続き「[デバイスをインストールするユーザーの IAM ロールの作成](#provision-create-role-role)」に移動して、このポリシーをアタッチするユーザーのロールエントリを作成します。

## デバイスをインストールするユーザーの IAM ロールの作成
<a name="provision-create-role-role"></a>

以下の手順では、プロビジョニングテンプレートを使用してデバイスをインストールするユーザーを認証する IAM ロールの作成方法について説明します。

**デバイスをインストールするユーザーの IAM ポリシーを作成するには**

1. [IAM コンソールのロールハブ](https://console.aws.amazon.com//iamv2/home#/roles)を開きます。

1. [**ロールの作成**] を選択してください。

1. **[Select trusted entity]** (信頼されたエンティティを選択) で、作成するテンプレートへのアクセスを許可する信頼されたエンティティのタイプを選択します。

1. アクセスを許可する信頼されたエンティティの ID を選択または入力して、**[Next]** (次へ) を選択します。

1. **[Add permissions]** (許可を追加) ページの **[Permission policies]** (許可ポリシー) で、検索ボックスに[前の手順](#provision-create-role-policy)で作成したポリシーの名前を入力します。

1. ポリシーのリストで、前の手順で作成したポリシーを選択し、**[Next]** (次へ) を選択します。

1. **[Name, review, and create]** (名前、確認、および作成) セクションで、以下の操作を実行します。

   1. **[Role name]** (ロール名) に、このロールの目的を簡単に示すロール名を入力します。

   1. **[Description]** (説明) に、ロールの説明 (オプション) を入力できます。これを省略しても続行できます。

   1. **ステップ 1** と**ステップ 2** の値を確認します。

   1. **[Add tags (Optional)]** (タグの追加 (オプション)) では、このロールにタグを追加することを選択できます。これを省略しても続行できます。

   1. このページの情報が完全で正しいことを確認して、**[Create role]** (ロールを作成) を選択します。

新しいロールを作成したら、 AWS IoT コンソールに戻ってテンプレートの作成を続行します。

## 新しいテンプレートを許可するように既存のポリシーを更新する
<a name="provision-create-role-update"></a>

次の手順では、プロビジョニングテンプレートを使用してデバイスをインストールすることをユーザーに許可する新しいテンプレートを IAM ポリシーに追加する方法について説明します。

**既存の IAM ポリシーに新しいテンプレートを追加するには**

1. [IAM コンソールのポリシーハブ](https://console.aws.amazon.com//iamv2/home#/policies)を開きます。

1. 検索ボックスに、更新するポリシーの名前を入力します。

1. 検索ボックスの下のリストで、更新するポリシーを見つけ、そのポリシー名を選択します。

1. **[Policy summary]** (ポリシー概要) で、**[JSON]** タブを選択します (まだ表示されていない場合)。

1. ポリシードキュメントを編集するには、**[Edit policy]** (ポリシーの編集) を選択します。

1. エディタで、**[JSON]** タブを選択します (まだ表示されていない場合)。

1. ポリシードキュメントで、`iot:CreateProvisioningClaim` アクションが含まれているポリシーステートメントを見つけます。

   ポリシードキュメント内に `iot:CreateProvisioningClaim` アクションが含まれているポリシーステートメントがない場合は、次のステートメントスニペットをコピーして、ポリシードキュメント内の `Statement` 配列に追加のエントリとして貼り付けます。
**注記**  
このスニペットは、`Statement` 配列の閉じ文字 `]` の前に配置する必要があります。構文エラーを修正するには、このスニペットの前または後にカンマの追加が必要になる場合があります。

   ```
   {
       "Effect": "Allow",
       "Action": [
           "iot:CreateProvisioningClaim"
       ],
       "Resource": [
           "--PUT YOUR NEW TEMPLATE ARN HERE--"
       ]
   }
   ```

1. ユーザー**ロールのアクセス許可の変更**を選択した AWS IoT コンソールのページに切り替えます。

1. テンプレートの**リソース ARN** を見つけて **[Copy]** (コピー) を選択します。

1. IAM コンソールに切り替えます。

1. コピーした Amazon リソースネーム (ARN) を、`Statement` 配列内でテンプレート ARN のリストの先頭に貼り付けて最初のエントリにします。

   これが配列内で唯一の ARN である場合は、貼り付けた値の末尾にあるカンマを削除します。

1. 更新したポリシーステートメントを確認し、エディタによって示されたエラーがあれば修正します。

1. 更新したポリシードキュメントを保存するには、**[Review policy]** (ポリシーの確認) を選択します。

1. ポリシーを確認して、**[Save changes]** (変更の保存) を選択します。

1.  AWS IoT コンソールに戻ります。

# デバイスプロビジョニング MQTT API
<a name="fleet-provision-api"></a><a name="provision-mqtt-api"></a>

フリートプロビジョニングサービスは、次の MQTT API オペレーションをサポートしています。
+ `CreateCertificateFromCsr`
+ `CreateKeysAndCertificate`
+ `RegisterThing`

この API は、トピックの*ペイロード形式*に応じて、簡潔なバイナリオブジェクト表現 (CCOR) 形式および JavaScript Object Notation (JSON) 形式のレスポンスバッファをサポートします。わかりやすくするために、このセクションのレスポンスとリクエストの例を JSON 形式で示します。


| *ペイロード形式* | レスポンス形式のデータ型 | 
| --- | --- | 
| cbor | 簡潔なバイナリオブジェクトの表現 (CCOR) | 
| json | JavaScript Object Notation (JSON) | 

**重要**  
リクエストメッセージトピックを発行する前に、応答トピックをサブスクライブしてレスポンスを受信します。この API で使用されるメッセージは、MQTT のパブリッシュ/サブスクライブプロトコルを使用して、リクエストとレスポンスの相互作用を提供します。  
リクエストを発行*する前に*レスポントピックをサブスクライブしていない場合、そのリクエストの結果を受信できない可能性があります。  
IoT Core フリートプロビジョニングは、API リクエストの発行に使用したのと同じ MQTT 接続を介して、デバイスのプロビジョニング MQTT API 結果を返します。

## CreateCertificateFromCsr
<a name="create-cert-csr"></a>

証明書署名リクエスト (CSR) から証明書を作成します。 は、Amazon ルート認証局 (CA) によって署名されたクライアント証明書 AWS IoT を提供します。新しい証明書には `PENDING_ACTIVATION` ステータスがあります。`RegisterThing` を呼び出して、この証明書を使用してモノをプロビジョニングすると、テンプレートで説明されているように、証明書のステータスが `ACTIVE` または `INACTIVE` に変わります。

認証局証明書と証明書署名リクエストを使用してクライアント証明書を作成する方法の詳細については、「[CA 証明書を使用してクライアント証明書を作成する](create-device-cert.md)」を参照してください。

**注記**  
セキュリティ上の理由から、`CreateCertificateFromCsr` によって返される `certificateOwnershipToken` は 1 時間後に有効期限切れになります。`certificateOwnershipToken` が有効期限切れになる前に、`RegisterThing` を呼び出す必要があります。`CreateCertificateFromCsr` によって作成された証明書がトークンの有効期限が切れるまでにアクティブにならず、ポリシーまたはモノにアタッチされない場合、証明書は削除されます。トークンの有効期限が切れた場合、デバイスは `CreateCertificateFromCsr` を呼び出して新しい証明書を生成します。

### CreateCertificateFromCsr リクエスト
<a name="create-cert-csr-request"></a>

`$aws/certificates/create-from-csr/payload-format` トピックを含むメッセージを発行します。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

#### CreateCertificateFromCsr リクエストペイロード
<a name="create-cert-csr-request-payload"></a>

```
{
    "certificateSigningRequest": "string"
}
```

`certificateSigningRequest`  
PEM 形式の CSR。

### CreateCertificateFromCsr レスポンス
<a name="create-cert-csr-response"></a>

`$aws/certificates/create-from-csr/payload-format/accepted`​ をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

#### CreateCertificateFromCsr レスポンスペイロード
<a name="create-cert-csr-response-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "certificateId": "string",
    "certificatePem": "string"
}
```

`certificateOwnershipToken`  
プロビジョニング中に証明書の所有権を証明するトークン。

`certificateId`  
証明書の ID。証明書管理オペレーションでは、証明書 ID のみが使用されます。

`certificatePem`  
PEM 形式の証明書データ。

### CreateCertificateFromCsr エラー
<a name="create-cert-csr-error"></a>

エラーレスポンスを受信するには、`$aws/certificates/create-from-csr/payload-format/rejected` をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

#### CreateCertificateFromCsr エラーペイロード
<a name="create-cert-csr-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
ステータスコード。

`errorCode`  
エラーコード。

`errorMessage`  
エラーメッセージです。

## CreateKeysAndCertificate
<a name="create-keys-cert"></a>

新しいキーと証明書を作成します。Amazon ルート認証局 (CA) によって署名されたクライアント証明書 AWS IoT を提供します。新しい証明書には `PENDING_ACTIVATION` ステータスがあります。`RegisterThing` を呼び出して、この証明書を使用してモノをプロビジョニングすると、テンプレートで説明されているように、証明書のステータスが `ACTIVE` または `INACTIVE` に変わります。

**注記**  
セキュリティ上の理由から、`CreateKeysAndCertificate` によって返される `certificateOwnershipToken` は 1 時間後に有効期限切れになります。`certificateOwnershipToken` が有効期限切れになる前に、`RegisterThing` を呼び出す必要があります。`CreateKeysAndCertificate` によって作成された証明書がトークンの有効期限が切れるまでにアクティブにならず、ポリシーまたはモノにアタッチされない場合、証明書は削除されます。トークンの有効期限が切れた場合、デバイスは `CreateKeysAndCertificate` を呼び出して新しい証明書を生成します。

### CreateKeysAndCertificate リクエスト
<a name="create-keys-cert-request"></a>

空のメッセージペイロードで `$aws/certificates/create/payload-format` にメッセージを発行します。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

### CreateKeysAndCertificate レスポンス
<a name="create-keys-cert-response"></a>

`$aws/certificates/create/payload-format/accepted`​ をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

#### CreateKeysAndCertificate レスポンス
<a name="create-keys-cert-response-payload"></a>

```
{
    "certificateId": "string",
    "certificatePem": "string",
    "privateKey": "string",
    "certificateOwnershipToken": "string"
}
```

`certificateId`  
証明書 ID｡

`certificatePem`  
PEM 形式の証明書データ。

`privateKey`  
プライベートキー。

`certificateOwnershipToken`  
プロビジョニング中に証明書の所有権を証明するトークン。

### CreateKeysAndCertificate エラー
<a name="create-keys-cert-error"></a>

エラーレスポンスを受信するには、`$aws/certificates/create/payload-format/rejected` をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

#### CreateKeysAndCertificate エラーペイロード
<a name="create-keys-cert-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
ステータスコード。

`errorCode`  
エラーコード。

`errorMessage`  
エラーメッセージです。

## RegisterThing
<a name="register-thing"></a>

事前定義されたテンプレートを使用してモノをプロビジョニングします。

### RegisterThing リクエスト
<a name="register-thing-request"></a>

`$aws/provisioning-templates/templateName/provision/payload-format` にメッセージを発行します。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

`templateName`  
プロビジョニングテンプレート名。

#### RegisterThing リクエストペイロード
<a name="register-thing-request-payload"></a>

```
{
    "certificateOwnershipToken": "string",
    "parameters": {
        "string": "string",
        ...
    }
}
```

`certificateOwnershipToken`  
証明書の所有権を証明するトークン。MQTT で証明書を作成すると、 AWS IoT によってトークンが生成されます。

`parameters`  
オプション。登録リクエストを評価するために[事前プロビジョニングフック](pre-provisioning-hook.md)で使用されるデバイスからの、キーと値のペア。

### RegisterThing レスポンス
<a name="register-thing-response"></a>

`$aws/provisioning-templates/templateName/provision/payload-format/accepted`​ をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

`templateName`  
プロビジョニングテンプレート名。

#### RegisterThing レスポンスペイロード
<a name="register-thing-response-payload"></a>

```
{
    "deviceConfiguration": {
        "string": "string",
        ...
    },
    "thingName": "string"
}
```

`deviceConfiguration`  
テンプレートで定義されているデバイス設定。

`thingName`  
プロビジョニング中に作成される IoT モノの名前。

### RegisterThing エラーレスポンス
<a name="register-thing-error"></a>

エラーレスポンスを受信するには、`$aws/provisioning-templates/templateName/provision/payload-format/rejected` をサブスクライブします。

`payload-format`  
メッセージペイロード形式 (`cbor` または `json`)。

`templateName`  
プロビジョニングテンプレート名。

#### RegisterThing エラーレスポンスペイロード
<a name="register-thing-error-payload"></a>

```
{
    "statusCode": int,
    "errorCode": "string",
    "errorMessage": "string"
}
```

`statusCode`  
ステータスコード。

`errorCode`  
エラーコード。

`errorMessage`  
エラーメッセージ。