

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

# フリートプロビジョニングを使用したデバイス証明書がないデバイスのプロビジョニング
<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"
   }
   ```