

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 사전 프로비저닝 후크
<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);
}
```

------