即时预置 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

即时预置

您可在设备首次尝试连接到 Amazon IoT 时对设备进行预置。即时预置 (JITP) 设置在 CA 证书上进行。要预置设备,您必须启用自动注册,并将预置模板与用于对设备证书进行签名的 CA 证书关联。预置成功和错误记录均作为 设备预配置指标 录入 Amazon CloudWatch 中。

您可以在使用 RegisterCACertificate API 或 register-ca-certificate CLI 命令注册新 CA 证书时执行这些设置。

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

有关更多信息,请参阅注册 CA 证书

您还可以使用 UpdateCACertificate API 或 update-ca-certificate CLI 命令来更新 CA 证书的设置:

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

在预置过程中,JITP 会调用其他 Amazon IoT 控制层面 API。这些调用可能会超过为您的账户设置的 Amazon IoT 配额,并导致调用受到限制。如有必要,请联系Amazon客户支持来增大节流配额。

当设备尝试使用由已注册 CA 证书签名的证书连接到 Amazon IoT 时,Amazon IoT 会从 CA 证书加载模板,并使用它来调用 RegisterThing。JITP 工作流首先将注册一个状态值为 PENDING_ACTIVATION 的证书。当设备预置流程完成时,该证书的状态将更改为 ACTIVE。

Amazon 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。您可以使用 principal() 规则内的 Amazon IoT 函数获取此 ID 的值。

以下 JSON 文件是完整 JITP 模板的示例。templateBody 字段的值必须是指定为转义字符串的 JSON 对象,并且只能使用前述表中的值。您可以使用各种工具来创建所需的 JSON 输出,例如 json.dumps (Python) 或 JSON.stringify(节点)。roleARN 字段的值必须是附加有 AWSIoTThingsRegistration 的角色的 ARN。此外,您的模板还可以在示例中使用现有PolicyName,而不是内联 PolicyDocument。(第一个示例添加了换行符以提高可读性,但您可以复制并粘贴直接显示在它下方的模板。)

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

下面是您可以复制并粘贴的版本:

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

此示例模板声明了从证书中提取并在 AWS::IoT::Certificate::CommonName 部分中使用的 AWS::IoT::Certificate::SerialNumberAWS::IoT::Certificate::CountryAWS::IoT::Certificate::IdResources 预置参数的值。JITP 工作流随后将使用此模板执行以下操作:

  • 注册一个证书并将其状态设置为 PENDING_ACTIVE。

  • 创建一个事物资源。

  • 创建一个策略资源。

  • 将策略附加到证书。

  • 将证书附加到事物。

  • 将证书状态更新为 ACTIVE。

请注意,如果证书不具有 templateBodyParameters 部分中提及的所有属性,则设备将会预置失败。例如,如果 AWS::IoT::Certificate::Country 包含在模板中,但证书没有 Country 属性,设备预置操作将会失败。

您还可以使用 CloudTrail 排查 JITP 模板的问题。有关 Amazon CloudWatch 中录入的指标的信息,请参阅 设备预配置指标