

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Ganchos de pré-provisionamento
<a name="pre-provisioning-hook"></a>

AWS recomenda o uso de funções de gancho de pré-provisionamento ao criar modelos de provisionamento para permitir mais controle sobre quais e quantos dispositivos sua conta incorpora. Os hooks de pré-provisionamento são funções do Lambda que validam parâmetros passados do dispositivo antes de permitir que ele seja provisionado. Essa função do Lambda deve existir na sua conta antes de provisionar um dispositivo, já que ela é chamada sempre que um dispositivo envia uma solicitação por meio de [RegisterThing](fleet-provision-api.md#register-thing).

**Importante**  
Certifique-se de incluir `source-arn` ou `source-account` nas chaves de contexto de condição global das políticas anexadas à sua ação do Lambda, para evitar a manipulação de permissões. Para obter mais informações sobre isso, consulte [Prevenção contra o ataque do “substituto confuso” em todos os serviços](cross-service-confused-deputy-prevention.md).

Para dispositivos a serem provisionados, a função do Lambda deve aceitar o objeto de entrada e retornar o objeto de saída descrito nesta seção. O provisionamento prosseguirá somente se a função do Lambda retornar um objeto com `"allowProvisioning": True`.

## Entrada de hook de pré-provisão
<a name="pre-provisioning-hook-input"></a>

AWS IoT envia esse objeto para a função Lambda quando um dispositivo se registra com. 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",
        ...
    }
}
```

O objeto `parameters` passado para a função do Lambda contém as propriedades no argumento `parameters` passado na carga da solicitação de[RegisterThing](fleet-provision-api.md#register-thing). 

## Valor de retorno do hook de pré-provisão
<a name="pre-provisioning-hook-output"></a>

A função do Lambda deve retornar uma resposta que indique se autorizou a solicitação de provisionamento e os valores de quaisquer propriedades a serem substituídos.

Veja a seguir um exemplo de uma resposta bem-sucedida da função de pré-provisionamento.

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

Os valores de `"parameterOverrides"` serão adicionados ao parâmetro `"parameters"` na carga da solicitação de [RegisterThing](fleet-provision-api.md#register-thing).

**nota**  
Se a função Lambda falhar, a solicitação de provisionamento falhará `ACCESS_DENIED` e um erro será registrado no Logs. CloudWatch 
Se a função do Lambda não retornar `"allowProvisioning": "true"` na resposta, a solicitação de provisionamento falhará com `ACCESS_DENIED`.
A função do Lambda deve concluir a execução e retornar em até 5 segundos, caso contrário, a solicitação de provisionamento falhará.

## Exemplo de hook de pré-provisionamento do Lambda
<a name="pre-provisioning-example"></a>

------
#### [ Python ]

Um exemplo de hook de pré-provisionamento do Lambda em Python.

```
import json

def pre_provisioning_hook(event, context):
    print(event)

    return {
        'allowProvisioning': True,
        'parameterOverrides': {
            'DeviceLocation': 'Seattle'
        }
    }
```

------
#### [ Java ]

Um exemplo de hook de pré-provisionamento do Lambda em Java.

Classe de handler:

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

}
```

Classe de solicitação:

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

Classe de resposta:

```
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 ]

Um exemplo de um gancho de pré-provisionamento no 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);
}
```

------