

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

# 事前プロビジョニングフック
<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;
}
```

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

------
#### [ 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);
}
```

------