

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Hooks de mise en service en amont
<a name="pre-provisioning-hook"></a>

AWS recommande d'utiliser des fonctions de pré-approvisionnement lors de la création de modèles de provisionnement afin de mieux contrôler quels appareils et combien d'appareils sont intégrés à votre compte. Les hooks de mise en service en amont sont des fonctions Lambda qui valident les paramètres transmis par l’appareil avant d’autoriser la mise en service de l’appareil. Cette fonction Lambda doit exister dans votre compte avant la mise en service d’un appareil, car elle est appelée chaque fois qu’un appareil envoie une demande via [RegisterThing](fleet-provision-api.md#register-thing).

**Important**  
Assurez-vous d’inclure le `source-arn` ou `source-account` dans les clés de contexte de condition globale des politiques associées à votre action Lambda afin d’empêcher toute manipulation des autorisations. Pour de plus amples informations à ce sujet, veuillez consulter [Prévention du cas de figure de l’adjoint désorienté entre services](cross-service-confused-deputy-prevention.md).

Pour que les appareils soient provisionnés, votre fonction Lambda doit accepter l’objet d’entrée et renvoyer l’objet de sortie décrit dans cette section. La mise en service ne se déroule que si la fonction Lambda renvoie un objet avec la valeur `"allowProvisioning": True`.

## Entrée du hook de pré-provisionnement
<a name="pre-provisioning-hook-input"></a>

AWS IoT envoie cet objet à la fonction Lambda lorsqu'un appareil s'enregistre auprès de. 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",
        ...
    }
}
```

L’objet `parameters` transmis à la fonction Lambda contient les propriétés de l’argument `parameters` passé dans la charge utile de la demande [RegisterThing](fleet-provision-api.md#register-thing). 

## Valeur de retour du hook de pré-provisionnement
<a name="pre-provisioning-hook-output"></a>

La fonction Lambda doit renvoyer une réponse indiquant si elle a autorisé la demande de mise en service et les valeurs de toutes les propriétés à remplacer.

Voici un exemple de réponse réussie de la fonction de pré-provisionnement.

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

Les valeurs `"parameterOverrides"` seront ajoutées au paramètre `"parameters"` dans la charge utile de la demande [RegisterThing](fleet-provision-api.md#register-thing).

**Note**  
Si la fonction Lambda échoue, la demande de provisionnement échoue `ACCESS_DENIED` et une erreur est enregistrée dans Logs. CloudWatch 
Si la fonction Lambda ne renvoie pas `"allowProvisioning": "true"` dans la réponse, la demande de mise en service échoue avec `ACCESS_DENIED`.
La fonction Lambda doit procéder à l’exécution et renvoyer dans un délai de 5 secondes, sinon la demande de mise en service échoue.

## Exemple Lambda de hook de mise en service
<a name="pre-provisioning-example"></a>

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

Exemple de hook de mise en service en amont Lambda en Python.

```
import json

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

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

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

Exemple de hook de mise en service en amont Lambda en Java.

Classe de gestionnaire :

```
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 demande :

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

La classe de réponse :

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

Exemple d'un hook de pré-provisionnement Lambda dans. JavaScript

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

------