事前プロビジョニングフック - AWS IoT Core

事前プロビジョニングフック

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

重要

Lambda アクションにアタッチされたポリシーのグローバル条件コンテキストキーに source-arn または source-account を必ず含め、アクセス許可の操作を防止します。この詳細については、「サービス間の混乱した代理の防止」を参照してください。

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

事前プロビジョニングフックの入力

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

{ "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 リクエストペイロードで渡される parameters 引数のプロパティが含まれています。

事前プロビジョニングフックの戻り値

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

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

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

"parameterOverrides" 値は、RegisterThing リクエストペイロードの "parameters" パラメータに追加されます。

注記
  • Lambda 関数が失敗すると、プロビジョニングリクエストは ACCESS_DENIED で失敗し、エラーが CloudWatch Logs に記録されます。

  • 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; }

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; }