

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.

# Création d'une fonction Lambda de fournisseur de disponibilité personnalisé
<a name="building_cap"></a>

Les fournisseurs de disponibilité personnalisés (CAPs) sont configurés avec un protocole de demande et de réponse basé sur JSON écrit dans un schéma JSON bien défini. Une fonction Lambda analysera la demande et fournira une réponse valide.

**Topics**
+ [Éléments de demande et de réponse](#cap_request_response_elements)
+ [Octroi d’accès](#granting_access)
+ [Exemple d' WorkMail utilisation par Amazon d'une fonction CAP Lambda](#cap_example_github)

## Éléments de demande et de réponse
<a name="cap_request_response_elements"></a>

### Éléments d'une demande
<a name="cap_request"></a>

Voici un exemple de demande utilisé pour configurer un CAP pour un WorkMail utilisateur Amazon : 

```
{
    "requester": {
        "email": "user1@internal.example.com",
        "userName": "user1",
        "organization": "m-0123456789abcdef0123456789abcdef",
        "userId": "S-1-5-18",
        "origin": "127.0.0.1"
    },
    "mailboxes": [
        "user2@external.example.com",
        "unknown@internal.example.com"
    ],
    "window": {
        "startDate": "2021-05-04T00:00:00.000Z",
        "endDate": "2021-05-06T00:00:00.000Z"
    }
}
```

**Une demande est composée de trois sections : **demandeur**, **boîtes aux lettres** et fenêtre.** Ils sont décrits dans ce qui suit [Demandeur](#cap_request_requester) et dans [Fenêtre](#cap_request_window) les sections de ce guide. [Boîtes aux lettres](#cap_request_mailboxes)

#### Demandeur
<a name="cap_request_requester"></a>

La section du *demandeur* fournit des informations sur l'utilisateur qui a fait la demande initiale à Amazon WorkMail. CAPs utilisez ces informations pour modifier le comportement du fournisseur. Par exemple, ces données peuvent être utilisées pour se faire passer pour le même utilisateur auprès du fournisseur de disponibilité du backend ou certains détails peuvent être omis de la réponse.


| Champ | Description | Obligatoire | 
| --- | --- | --- | 
|  `Email`  |  Adresse e-mail principale du demandeur.  |  Oui  | 
|  `Username`  |  Le nom d'utilisateur du demandeur.  |  Oui  | 
|  `Organization`  |  ID d'organisation du demandeur.  |  Oui  | 
|  `UserID`  |  L'ID du demandeur.  |  Oui  | 
|  `Origin`  |  Adresse distante de la demande.  |  Non  | 
|  `Bearer`  |  Réservé pour un usage futur.  |  Non  | 

#### Boîtes aux lettres
<a name="cap_request_mailboxes"></a>

La section *des boîtes aux lettres* contient une liste séparée par des virgules des adresses e-mail des utilisateurs pour lesquels des informations de disponibilité sont demandées.

#### Fenêtre
<a name="cap_request_window"></a>

La section *fenêtre* contient la fenêtre horaire pour laquelle les informations de disponibilité sont demandées. Les deux `startDate` `endDate` sont spécifiés en UTC et sont formatés conformément à la [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339. Les événements ne devraient pas être tronqués. En d'autres termes, si un événement commence avant la date définie`StartDate`, le début d'origine sera utilisé.

### Éléments de réponse
<a name="cap_response"></a>

Amazon WorkMail attendra 25 secondes pour obtenir une réponse de la fonction CAP Lambda. Au bout de 25 secondes, Amazon WorkMail considérera que la fonction a échoué et générera des défaillances pour les boîtes aux lettres associées dans la GetUserAvailability réponse EWS. Cela n'entraînera pas l'échec de l'ensemble de l' GetUserAvailability opération.

Voici un exemple de réponse issu de la configuration définie au début de cette section : 

```
{
    "mailboxes": [{
        "mailbox": "user2@external.example.com",
        "events": [{
            "startTime": "2021-05-03T23:00:00.000Z",
            "endTime": "2021-05-04T03:00:00.000Z",
            "busyType": "BUSY"|"FREE"|"TENTATIVE",
            "details": {  // optional
                "subject": "Late meeting",
                "location": "Chime",
                "instanceType": "SINGLE_INSTANCE"|"RECURRING_INSTANCE"|"EXCEPTION",
                "isMeeting": true,
                "isReminderSet": true,
                "isPrivate": false
            }
        }],
        "workingHours": {
            "timezone": {
                "name": "W. Europe Standard Time"
                "bias": 60,
                "standardTime": {  // optional (not needed for fixed offsets)
                    "offset": 60,
                    "time": "02:00:00",
                    "month": "JAN"|"FEB"|"MAR"|"APR"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC",
                    "week": "FIRST"|"SECOND"|"THIRD"|"FOURTH"|"LAST",
                    "dayOfWeek": "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"
                },
                "daylightTime": {  // optional (not needed for fixed offsets)
                    "offset": 0,
                    "time": "03:00:00",
                    "month": "JAN"|"FEB"|"MAR"|"APR"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC",
                    "week": "FIRST"|"SECOND"|"THIRD"|"FOURTH"|"LAST",
                    "dayOfWeek": "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"
                },                
            },
            "workingPeriods":[{
                "startMinutes": 480,
                "endMinutes": 1040,
                "days": ["SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"]
            }]
        }
    },{
        "mailbox": "unknown@internal.example.com",
        "error": "MailboxNotFound"
    }]
}
```

Une réponse est composée d'une seule section de *boîtes aux lettres* qui consiste en une liste de boîtes aux lettres. Chaque boîte aux lettres dont la disponibilité est obtenue avec succès est composée de trois sections : *boîte aux lettres*, *événements* et *heures de travail.* Si le fournisseur de disponibilité n'a pas réussi à obtenir les informations de disponibilité d'une boîte aux lettres, la section est composée de deux sections : *boîte aux lettres* et *erreur*. Ils sont décrits dans les [Erreur](#cap_response_error) sections suivantes [Boîte aux lettres](#cap_response_mailbox) de ce guide. [Événements](#cap_response_events) [Heures de travail](#cap_response_workinghours) [Fuseau horaire](#cap_response_timezone) [Périodes de travail](#cap_response_workingperiods)

#### Boîte aux lettres
<a name="cap_response_mailbox"></a>

La section *boîte aux lettres* est l'adresse e-mail de l'utilisateur trouvée dans la section *boîtes aux lettres* de la demande.

#### Événements
<a name="cap_response_events"></a>

La section *des événements* est une liste des événements qui se produisent dans la fenêtre demandée. Chaque événement est défini avec les paramètres suivants :


| Champ | Description | Obligatoire | 
| --- | --- | --- | 
|  `startTime`  |  Heure de début de l'événement en UTC et formatée conformément à la [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339.  |  Oui  | 
|  `endTime`  |  Heure de fin de l'événement en UTC et formatée conformément à la [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339.  |  Oui  | 
|  `busyType`  |  Type d'événement très fréquenté. Peut être `Busy`, `Free` ou `Tentative`.  |  Oui  | 
|  `details`  |  Les détails de l'événement.  |  Non  | 
|  `details.subject`  |  Le sujet de l'événement.  |  Oui  | 
|  `details.location`  |  Le lieu de l'événement.  |  Oui  | 
|  `details.instanceType`  |  Type d'instance de l'événement. Peut être `Single_Instance`, `Recurring_Instance` ou `Exception`.  |  Oui  | 
|  `details.isMeeting`  |  Un booléen pour indiquer si l'événement a des participants.  |  Oui  | 
|  `details.isReminderSet`  |  Un booléen pour indiquer si un rappel est défini pour l'événement.  |  Oui  | 
|  `details.isPrivate`  |  Un booléen pour indiquer si l'événement est défini comme privé.  |  Oui  | 

#### Heures de travail
<a name="cap_response_workinghours"></a>

La section *Heures de travail* contient des informations sur les heures de travail du propriétaire de la boîte aux lettres. Il contient deux sections : *timezone* et *WorkingPeriods*. 

#### Fuseau horaire
<a name="cap_response_timezone"></a>

La sous-section *fuseau horaire* décrit le fuseau horaire du propriétaire de la boîte aux lettres. Il est important d'afficher correctement les heures de travail de l'utilisateur lorsque le demandeur travaille dans un autre fuseau horaire. Le fournisseur de disponibilité est tenu de décrire explicitement le fuseau horaire, plutôt que d'utiliser un nom. L'utilisation de la description normalisée du fuseau horaire permet d'éviter les incohérences entre les fuseaux horaires.


| Champ | Description | Obligatoire | 
| --- | --- | --- | 
|  `name`  |  Le nom du fuseau horaire.  |  Oui  | 
|  `bias`  |  Décalage par défaut par rapport à l'heure GMT en minutes.  |  Oui  | 
|  `standardTime`  |  Début de l'heure normale pour le fuseau horaire spécifié.  |  Non  | 
|  `daylightTime`  |  Début de l'heure d'été pour le fuseau horaire spécifié.  |  Non  | 

Vous devez soit définir `standardTime` les deux`daylightTime`, soit omettre les deux. Les champs de l'`daylightTime`objet `standardTime` et sont les suivants :


| Champ | Description | Valeurs autorisées | 
| --- | --- | --- | 
|  `offset`  |  Le décalage par rapport au décalage par défaut en minutes.  |  NA  | 
|  `time`  |  Heure à laquelle la transition entre l'heure normale et l'heure d'été a lieu, spécifiée sous la forme`hh:mm:ss`.  |  NA  | 
|  `month`  |  Le mois au cours duquel la transition entre l'heure normale et l'heure d'été a lieu.  |  `JAN`,`FEB`, `MAR`, `APR`, `JUN`, `JUL`, `AUG`, `SEP`, `OCT`, `NOV`, `DEC`  | 
|  `week`  |  Semaine du mois spécifié pendant laquelle la transition entre l'heure normale et l'heure d'été a lieu.  |  `FIRST`, `SECOND`, `THIRD`, `FOURTH`, `LAST`  | 
|  `dayOfWeek`  |  Le jour de la semaine spécifiée où la transition entre l'heure normale et l'heure d'été a lieu.  |  `SUN`, `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`  | 

#### Périodes de travail
<a name="cap_response_workingperiods"></a>

La section *WorkingPeriods* contient un ou plusieurs objets de période de travail. Chaque période définit un début et une fin de journée de travail pour un ou plusieurs jours. 


| Champ | Description | Valeurs autorisées | 
| --- | --- | --- | 
|  `startMinutes`  |  Début de la journée de travail en quelques minutes à partir de minuit.  |  NA  | 
|  `endMinutes`  |  Fin de la journée de travail en quelques minutes à partir de minuit.  |  NA  | 
|  `days`  |  Les jours auxquels cette période s'applique.  |  `SUN`, `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`  | 

#### Erreur
<a name="cap_response_error"></a>

Le champ *d'erreur* peut contenir des messages d'erreur arbitraires. Le tableau suivant répertorie un mappage des codes connus avec les codes d'erreur EWS. Tous les autres messages seront mappés vers. `ERROR_FREE_BUSY_GENERATION_FAILED` 


| Value | Code d'erreur EWS | 
| --- | --- | 
|  `MailboxNotFound`  |  `ERROR_MAIL_RECIPIENT_NOT_FOUND`  | 
|  `ErrorAvailabilityConfigNotFound`  |  `ERROR_AVAILABILITY_CONFIG_NOT_FOUND`  | 
|  `ErrorServerBusy`  |  `ERROR_SERVER_BUSY`  | 
|  `ErrorTimeoutExpired`  |  `ERROR_TIMEOUT_EXPIRED`  | 
|  `ErrorFreeBusyGenerationFailed`  |  `ERROR_FREE_BUSY_GENERATION_FAILED`  | 
|  `ErrorResponseSchemaValidation`  |  `ERROR_RESPONSE_SCHEMA_VALIDATION`  | 

## Octroi d’accès
<a name="granting_access"></a>

Exécutez la commande Lambda suivante à partir du AWS Command Line Interface ()AWS CLI. Cette commande ajoute une politique de ressources à la fonction Lambda qui analyse le CAP. Cette fonction permet au service de WorkMail disponibilité Amazon d'appeler votre fonction Lambda.

```
aws lambda add-permission \
    --region LAMBDA_REGION \
    --function-name CAP_FUNCTION_NAME \
    --statement-id AllowWorkMail \
    --action "lambda:InvokeFunction" \
    --principal availability.workmail.WM_REGION.amazonaws.com \
    --source-account WM_ACCOUNT_ID \
    --source-arn arn:aws:workmail:WM_REGION:WM_ACCOUNT_ID:organization/ORGANIZATION_ID
```

Dans la commande, ajoutez les paramètres suivants là où cela est indiqué :
+ *LAMBDA\$1REGION*— Nom de la région dans laquelle le CAP Lambda est déployé. Par exemple, `us-east-1`.
+ *CAP\$1FUNCTION\$1NAME*— Nom de la fonction CAP Lambda. 
**Note**  
Il peut s'agir du nom, de l'alias ou de l'ARN partiel ou complet de la fonction CAP Lambda.
+ *WM\$1REGION*— Nom de la région dans laquelle l' WorkMail organisation Amazon invoque la fonction Lambda. 
**Note**  
Seules les régions suivantes peuvent être utilisées avec CAP :  
USA Est (Virginie du Nord)
USA Ouest (Oregon)
Europe (Irlande)
+ *WM\$1ACCOUNT\$1ID*— L'identifiant du compte de l'organisation.
+ *ORGANIZATION\$1ID*— L'ID de l'organisation qui invoque le CAP Lambda. Par exemple, ID d'organisation : m-934ebb9eb57145d0a6cab566ca81a21f.

**Note**  
*LAMBDA\$1REGION*et ne *WM\$1REGION* sera différent que si des appels interrégionaux sont nécessaires. Si les appels interrégionaux ne sont pas nécessaires, ils seront identiques.

## Exemple d' WorkMail utilisation par Amazon d'une fonction CAP Lambda
<a name="cap_example_github"></a>

Pour un exemple d'Amazon WorkMail utilisant une fonction CAP Lambda pour interroger un point de terminaison EWS, consultez cet [AWS exemple d'application](https://github.com/aws-samples/amazon-workmail-lambda-templates/tree/master/workmail-cap-exchange) sur le référentiel *Serverless applications for Amazon*. WorkMail GitHub 