预先预调配挂钩 - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

预先预调配挂钩

Amazon 建议在创建配置模板时使用预配置挂钩功能,以便更好地控制您的账户已登录的设备和设备数量。预调配挂钩是 Lambda 函数,可在验证设备传递的参数后允许预调配设备。在您预调配设备之前,此 Lambda 函数必须存在于您的账户中,因为每次设备通过 RegisterThing 发送请求时都会调用该函数。

重要

请务必在附加到 Lambda 操作策略的全局条件上下文键中包含 source-arnsource-account,以便防范权限操纵。有关此问题的更多信息,请参阅 防止跨服务混淆代理

对于要预调配的设备,Lambda 函数必须接受输入对象并返回本节所述的输出对象。仅当 Lambda 函数返回带有 "allowProvisioning": True 的对象时,预调配才会继续。

预先预调配挂钩输入

Amazon IoT 当设备向注册时,会将此对象发送到 Lambda 函数。 Amazon 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 对象包含 parameters 参数中的属性,该参数在 RegisterThing 请求负载中传入。

预先预调配挂钩返回值

Lambda 函数必须返回一个响应,指示它是否已授权预调配请求以及要覆盖的任意属性的值。

以下是来自预先预调配函数的成功响应示例。

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

"parameterOverrides" 值将添加到 RegisterThing 申请负载的 "parameters" 参数中。

注意
  • 如果 Lambda 函数失败,则配置请求将失败,ACCESS_DENIED并在 Logs 中记录错误。 CloudWatch

  • 如果 Lambda 函数未在响应中返回 "allowProvisioning": "true",则预调配请求将失败并显示 ACCESS_DENIED

  • Lambda 函数必须在 5 秒内完成执行并返回,否则预调配请求将失败。

预先预调配挂钩 Lambda 示例

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

中预置挂钩 Lambda JavaScript 的示例。

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