

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 裝置佈建
<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) 的白皮書中詳細描述。

**選取最適合您情況的選項**
+ 

**您可以在 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 所需的資源。範本包含的變數可讓您使用一個範本來佈建多個裝置。佈建裝置時，您可以使用字典或 *map*，為裝置特定的變數指定值。若要佈建另一個裝置，請在字典中指定新值。

無論您的裝置是否具有唯一憑證 (及其關聯的私有金鑰)，您都可以使用自動佈建。

## 機群佈建 API
<a name="provisioning-apis"></a>

機群佈建中使用的 API 有數種類別：
+ 這些控制平面 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 首次連線至 時，產生裝置憑證和私有金鑰並將其安全地交付至您的裝置。 AWS IoT 提供由 Amazon 根憑證授權單位 (CA) 簽署的用戶端憑證。

使用機群佈建的方式有兩種：
+ [透過要求佈建](#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. 選擇最適合您安裝程序**的佈建案例**。然後選擇**下一步**。

   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. 授予 AWS IoT 服務許可，以在佈建裝置時建立或更新 IoT 資源，例如帳戶中的物件和憑證。透過將 `AWSIoTThingsRegistration`受管政策連接至信任 AWS IoT 服務主體的 IAM 角色 （稱為佈建角色） 來執行此操作。

1. 製造裝置，並安全地將佈建宣告憑證內嵌其中。

裝置現已準備就緒，可以傳送到將安裝的位置以供使用。

**重要**  
佈建要求私有金鑰應該始終加以保護，包括在裝置上。我們建議您使用 AWS IoT CloudWatch 指標和日誌來監控是否有濫用跡象。如果您偵測到誤用，請關閉佈建宣告憑證，使其無法用於裝置佈建。

**初始化裝置以供使用**

1. 裝置使用 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md)連線至 ，並使用安裝在裝置上的佈建宣告憑證 AWS IoT 來驗證 。
**注意**  
為了安全起見，由 `CreateCertificateFromCsr` 和 `CreateKeysAndCertificate` 傳回的 `certificateOwnershipToken` 會在一小時後過期。必須在 `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 第一次連線到 。

**重要**  
您必須管理信任之使用者的存取權和許可，才能執行此程序。其中一種方法是為信任的使用者提供和維護帳戶，以驗證他們，並授予他們存取執行此程序所需的 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. 授予 AWS IoT 服務許可，以在佈建裝置時建立或更新 IoT 資源，例如帳戶中的物件和憑證。您可以透過將 `AWSIoTThingsRegistration`受管政策連接至信任 AWS IoT 服務主體的 IAM 角色 （稱為*佈建角色*) 來執行此操作。

1. 提供識別您信任使用者的方法，例如為他們提供可進行身分驗證的帳戶，並授權他們與註冊其裝置所需的 AWS API 操作互動。

**初始化裝置以供使用**

1. 信任的使用者會登入您的佈建行動應用程式或 Web 服務。

1. 行動應用程式或 Web 應用程式會使用 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` 傳回的暫時佈建宣告憑證會在五分鐘後過期。在暫時佈建宣告憑證到期之前，下列步驟必須成功傳回有效的憑證。暫時佈建宣告憑證不會出現在您帳戶的憑證清單中。

1. 行動應用程式或 Web 應用程式會將暫時佈建宣告憑證以及任何必要的設定資訊 (例如 Wi-Fi 認證) 提供給裝置。

1. 裝置會使用暫時佈建宣告憑證，使用 AWS IoT 來連線至 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md)。

1. 裝置會在 AWS IoT 使用暫時佈建宣告憑證連線至 的五分鐘內，使用其中一個選項取得永久憑證和私有金鑰。裝置將使用憑證和金鑰，這些選項會傳回以供所有未來的身分驗證使用 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) 或 [`CreateCertificateFromCsr`](fleet-provision-api.md#create-cert-csr) 必須在 AWS IoT 使用暫時佈建宣告憑證連線至 的五分鐘內傳回有效的憑證。

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 Lambda 與 AWS 命令列界面](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-awscli.html)。

   以下是 Lambda 函數輸出的範例：

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

1. AWS IoT 使用資源型政策來呼叫 Lambda，因此您必須授予 AWS IoT 呼叫 Lambda 函數的許可。
**重要**  
請務必在連接到 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) 將 IoT 許可授予您 Lambda 的範例。

   ```
   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 當裝置已有裝置憑證 （和相關聯的私有金鑰） 時， 提供三種佈建裝置的方式：
+ 含佈建範本的單一物件佈建。如果您一次只需要佈建一部裝置，適合使用此選項。
+ 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>

您可以在裝置首次嘗試連線至 AWS IoT時，使用即時佈建 (JITP) 來佈建裝置。若要佈建裝置，您必須啟用自動註冊，而且您在佈建裝置時，其裝置憑證簽署所用的憑證授權機構憑證，必須與佈建範本建立關聯。佈建成功且錯誤會在 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>

當裝置嘗試 AWS IoT 使用已註冊 CA 憑證簽署的憑證連線至 時， 會從 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。您可以使用 AWS IoT 規則內的 `principal()`函數來取得此 ID 的值。

**注意**  
您可以使用 AWS IoT Core just-in-time(JITP) 功能佈建裝置，而不必在裝置的第一個連線上傳送整個信任鏈 AWS IoT Core。雖不要求顯示憑證授權機構憑證，但需要裝置在連線至 AWS IoT Core時傳送[伺服器名稱指示 (SNI)](https://datatracker.ietf.org/doc/html/rfc3546#section-3.1) 延伸。

### 範例範本內文
<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\"] }] }"
         }
      }
   }
}
```

此範例範本會宣告擷取自憑證並使用在 `Resources` 部分的 `AWS::IoT::Certificate::CommonName`、`AWS::IoT::Certificate::SerialNumber`、`AWS::IoT::Certificate::Country` 和 `AWS::IoT::Certificate::Id` 佈建參數的值。JITP 工作流程接著使用此範本執行下列動作：
+ 註冊憑證並將其狀態設為 PENDING\$1ACTIVE。
+ 建立一個物件資源。
+ 建立一個政策資源。
+ 將政策連接至憑證。
+ 將憑證連接至物件。
+ 更新憑證狀態為 ACTIVE。

如果憑證沒有 `Parameters`區段中提及的所有屬性，裝置佈建會失敗`templateBody`。例如，如果 `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 輸出，例如 `json.dumps` (Python) 或 `JSON.stringify` (節點)。`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
   ```

   如需詳細資訊，請參閱[註冊 CA 憑證](https://docs.aws.amazon.com//iot/latest/developerguide/register-CA-cert.html)。

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 儲存貯體名稱、金鑰名稱，以及可存取 S3 儲存貯體檔案的角色 ARN。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)：用於檢查大量物件註冊任務的結果及/或失敗。

**注意**  
一次僅可執行一個大量註冊操作任務 (每個帳戶)。
大量註冊操作會呼叫其他 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`。佈建範本有兩種類型 AWS IoT。一個用於即時佈建 (JITP) 和大量註冊，第二個則用於機群佈建。

**Topics**
+ [參數部分](#parameters-section)
+ [資源部分](#resources-section)
+ [大量註冊的範本範例](#bulk-template-example)
+ [即時佈建 (JITP) 的範本範例](#JITP-template-example)
+ [機群佈建](#fleet-provision-template)

## 參數部分
<a name="parameters-section"></a>

`Parameters` 部分宣告 `Resources` 部分所使用的參數。每個參數都會宣告名稱、類型和可選的預設值。與範本一同傳入的字典若未包含該參數的值，將使用預設值。範本文件的 `Parameters` 部分如下：

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

此範本內文片段宣告四項參數：`ThingName`、`SerialNumber`、`Location` 和 `CSR`。這些參數均為類型 `String`。`Location` 參數宣告的預設值為 `"WA"`。

## 資源部分
<a name="resources-section"></a>

範本內文的 `Resources`區段會宣告裝置與之通訊所需的資源 AWS IoT：物件、憑證，以及一或多個 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註冊所建立的裝置憑證。如果您的多個 憑證授權機構憑證註冊使用相同的主體欄位，您也必須輸入用於簽署該裝置憑證的憑證授權機構憑證。

**注意**  
若您使用範本宣告憑證，請透過這些方法其中之一。例如，若您使用 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 和憑證授權機構憑證 .pem 指定的憑證：

  ```
  {
      "certificate" : {
          "Type" : "AWS::IoT::Certificate",
          "Properties" : {
              "CACertificatePem": {"Ref" : "CACertificatePem"},
              "CertificatePem": {"Ref" : "CertificatePem"}
          }
      }
  }
  ```
+ 僅將一個物件連接至委託人：

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

如需佈建範本類型的詳細資訊，請參閱 AWS API 參考[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)中的 。

如需了解如何使用此範本進行即時佈建，請參閱：[即時佈建](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`)。

### 映射項目
<a name="mappings"></a>

選用的 `Mappings` 區段會比對索引鍵與對應的一組命名值。例如，如果您想要根據 AWS 區域設定值，您可以建立使用 AWS 區域 名稱做為索引鍵的映射，並包含您要為每個特定區域指定的值。您可以使用 `Fn::FindInMap` 內部函數來擷取映射中的值。

您不能在 `Mappings` 區段中包含參數、虛擬參數或呼叫內部函數。

### 裝置組態
<a name="device-config"></a>

裝置組態區段包含您要在佈建時傳送至裝置的任意資料。例如：

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

如果您使用 JavaScript 物件標記法 (JSON) 承載格式傳送訊息至裝置， 會將此資料 AWS IoT Core 格式化為 JSON。如果您使用的是 Concise Binary Object Representation (CBOR) 承載格式， AWS IoT Core 會將此資料格式化為 CBOR。`DeviceConfiguration` 區段不支援巢狀 JSON 物件。

### 內建函數
<a name="intrinsic-functions"></a>

內部函數用於佈建範本的任何區段，但 `Mappings` 區段除外。

`Fn::Join`  
將一組值附加至單一值，並以指定的分隔符號隔開。如果分隔符號是空白字串，系統即會串連這些值，而不使用分隔符號。  
[政策資源](#policy-resources) 不支援 `Fn::Join`。

`Fn::Select`  
依索引從物件清單傳回單一物件。  
`Fn::Select` 不會檢查 `null` 值或索引是否超出陣列邊界。這兩個條件都會導致佈建錯誤，因此請務必選擇有效的索引值，且清單包含非空值。

`Fn::FindInMap`  
傳回對應 `Mappings` 區段所宣告之兩個層級映射之索引鍵的值。

`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](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;
}
```

回應類別：

```
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 私有 CA](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)、其他公開信任CAs，或您自己的公有金鑰基礎設施 (PKI) 來簽署 CSR。此外，您可以使用憑證提供者自訂用戶端憑證的欄位，例如有效期間、簽署演算法、發行者和延伸項目。

**重要**  
每個 只能建立一個憑證提供者 AWS 帳戶。簽署行為變更適用於呼叫 [CreateCertificateFromCsr MQTT API](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html#create-cert-csr) 的整個機群，直到您從 中刪除憑證提供者為止 AWS 帳戶。

**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)**  
在機群佈建過程中，裝置 AWS IoT Core 會透過[機群佈建 MQTT APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) 向 發出請求。此請求包含憑證簽署請求 (CSR)，該請求將簽署以建立用戶端憑證。

**AWS 機群佈建中的受管憑證登入**  
AWS 受管是機群佈建中憑證簽署的預設設定。透過 AWS 受管憑證簽署， AWS IoT Core 將使用自己的 CAs簽署 CSRs。

**機群佈建中的自我管理憑證簽署**  
自我管理是在機群佈建中簽署憑證的另一個選項。透過自我管理憑證簽署，您可以建立 AWS IoT Core 憑證提供者來簽署 CSRs。您可以使用自我管理憑證簽署，透過 AWS 私有 CA、其他公開信任 CA 或您自己的公有金鑰基礎設施 (PKI) 產生的 CA 簽署 CSRs。

**AWS IoT Core 憑證提供者**  
AWS IoT Core 憑證提供者 （憑證提供者的簡稱） 是客戶管理的資源，用於在機群佈建中進行自我管理憑證簽署。

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

下圖是自我認證簽署如何在機 AWS IoT 群佈建中運作的簡化說明。

![\[AWS IoT Core 機群佈建的憑證供應商\]](http://docs.aws.amazon.com/zh_tw/iot/latest/developerguide/images/provisioning-cert-provider.png)

+ 當新的 IoT 裝置製造或引入機群時，它需要用戶端憑證才能進行自我驗證 AWS IoT Core。
+ 在機群佈建程序中，裝置會透過機[群佈建 MQTT APIs](https://docs.aws.amazon.com//iot/latest/developerguide/fleet-provision-api.html) 向 提出用戶端憑證 AWS IoT Core 的請求。此請求包含憑證簽署請求 (CSR)。
+ AWS IoT Core 叫用憑證提供者，並將 CSR 做為輸入傳遞給提供者。
+ 憑證提供者會將 CSR 視為輸入，並發出用戶端憑證。

  對於 AWS 受管憑證簽署， 會使用自己的 CA AWS IoT Core 簽署 CSR 並發出用戶端憑證。
+ 使用發行的用戶端憑證，裝置會繼續機群佈建，並與 建立安全連線 AWS IoT Core。

## 憑證提供者 Lambda 函數輸入
<a name="provisioning-cert-provider-lambda-input"></a>

AWS IoT Core 當裝置向 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>

在建立憑證提供者之前，您必須建立 Lambda 函數來簽署 CSR。以下是 Python 中的 Lambda 函數範例。此函數 AWS 私有 CA 會使用私有 CA 和`SHA256WITHRSA`簽署演算法呼叫 來簽署輸入 CSR。傳回的用戶端憑證有效期為一年。如需 AWS 私有 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)，建議您`sourceAccount`為調用許可設定 `sourceArn`和 。如需詳細資訊，請參閱[預防跨服務混淆代理人](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) 政策範例 AWS IoT 會授予叫用 Lambda 函數的許可：

****  

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

若要選擇自我管理憑證簽署，您必須建立 AWS IoT Core 憑證提供者以在機群佈建中簽署 CSRs。 會 AWS IoT Core 叫用憑證提供者，以 CSR 做為輸入並傳回用戶端憑證。若要建立憑證提供者，請使用 `CreateCertificateProvider` API 操作或 CLI `create-certificate-provider` 命令。

**注意**  
建立憑證提供者之後，機[`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 操作或 CLI `create-certificate-provider` 命令。

**注意**  
建立憑證提供者之後，機[`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 操作或 CLI `update-certificate-provider` 命令。

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

如需詳細資訊，請參閱 API `[UpdateCertificateProvider](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateCertificateProvider.html)` 參考中的 。 *AWS IoT** *

### 描述憑證提供者
<a name="provisioning-describe-cert-provider"></a>

若要描述憑證提供者，請使用 `DescribeCertificateProvider` API 操作或 CLI `describe-certificate-provider` 命令。

```
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 操作或 CLI `delete-certificate-provider` 命令。如果您刪除憑證提供者資源， 的行為`CreateCertificateFromCsr`將會繼續，並且 AWS IoT 會從 AWS IoT CSR 建立由 簽署的憑證。

```
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 操作或 CLI `list-certificate-providers` 命令。

```
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 主控台指示時使用。  
若要從主控台前往此頁面，請開啟[建立新的佈建範本](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. 若要繼續，請選擇 **Next: Review (下一步：檢閱)**。

1. 在 **Review Policy (檢閱政策)** 頁面上，執行下列動作：

   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 主控台中 Roles (角色) 頁面](https://console.aws.amazon.com//iamv2/home#/roles)。

1. 選擇建**立角色**。

1. 在 **Select trusted entity** (選擇信任實體) 選擇您要授予存取權的信任實體類型，這些實體類型能存取您建立範本。

1. 選擇或輸入您要授予存取許可的信任實體識別，然後選擇 **Next** (下一頁)。

1. 在 **Add permissions** (新增許可) 頁面的 **Permission policies** (許可政策) 上，於搜尋方塊中輸入您在[上一個程序中](#provision-create-role-policy)建立的政策名稱。

1. 針對政策清單，請選擇您在前一個程序所建立的政策，然後選擇 **Next** (下一頁)。

1. 在 **Name, review, and create** (命名、檢閱和建立) 區段上，執行以下作業：

   1. 針對 **Role name** (角色名稱)，請輸入可協助您記住此角色用途的角色名稱。

   1. 針對 **Description** (描述)，您可以選擇輸入角色的選擇性描述。不需要此操作即可繼續。

   1. 檢閱 **Step 1** (步驟 1) 和 **Step 2** (步驟 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. 尋找 **Resource ARN** (資源 ARN) 範本，並選擇 **Copy** (複製)。

1. 切換回 IAM 主控台。

1. 將複製的 Amazon Resource Name (ARN) 貼到範本 ARN 的頂端 `Statement` 陣列成為第一個項目。

   如果這是陣列中唯一的 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 支援 Concise Binary Object Representation (CBOR) 格式和 JavaScript 物件標記法 (JSON) 的回應緩衝區，具體取決於主題的*承載格式*而定。為了清楚起見，本節中的回應和請求範例會以 JSON 格式顯示。


| *承載格式* | 回應格式資料類型 | 
| --- | --- | 
| cbor | Concise Binary Object Representation (CBOR) | 
| json | JavaScript 物件標記法 (JSON) | 

**重要**  
發佈請求訊息主題之前，請先訂閱回應主題以接收回應。此 API 使用的訊息使用 MQTT 的發佈/訂閱通訊協定，以提供請求和回應互動。  
如果您在發佈請求*之前*未訂閱回應主題，則可能不會收到該請求的結果。  
IoT Core Fleet Provisioning 透過用於發佈 API 請求的相同 MQTT 連線，傳回裝置佈建 MQTT API 結果。

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

從憑證簽署請求 (CSR) 建立憑證。 AWS IoT 提供由 Amazon 根憑證授權機構 (CA) 簽署的用戶端憑證。新憑證的狀態為 `PENDING_ACTIVATION`。當您呼叫 `RegisterThing` 以使用此憑證佈建實物時，憑證狀態會變更為 `INACTIVE` 或 `ACTIVE`，如範本中所述。

如需有關使用憑證授權單位憑證和憑證簽署請求建立用戶端憑證的詳細資訊，請參閱 [使用您的憑證授權機構憑證建立用戶端憑證](create-device-cert.md)。

**注意**  
為了安全起見，由 `CreateCertificateFromCsr` 傳回的 `certificateOwnershipToken` 會在一小時後過期。必須在 `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`  
CSR，採用 PEM 格式。

### 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。僅需 certificateId 即可進行憑證管理操作。

`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>

建立新的金鑰和憑證。 AWS IoT 提供由 Amazon 根憑證授權單位 (CA) 簽署的用戶端憑證。新憑證的狀態為 `PENDING_ACTIVATION`。當您呼叫 `RegisterThing` 以使用此憑證佈建實物時，憑證狀態會變更為 `INACTIVE` 或 `ACTIVE`，如範本中所述。

**注意**  
為了安全起見，由 `CreateKeysAndCertificate` 傳回的 `certificateOwnershipToken` 會在一小時後過期。必須在 `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`  
用來證明憑證擁有權的權杖。 AWS IoT 當您透過 MQTT 建立憑證時， 會產生權杖。

`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`  
錯誤訊息。