

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.

# Découvrez comment utiliser la découverte AWS Cloud Map de services avec des attributs personnalisés
<a name="tutorial-microservices"></a>

Le didacticiel suivant montre comment utiliser la découverte de AWS Cloud Map services avec des attributs personnalisés détectables à l'aide de l' AWS Cloud Map API. Le didacticiel vous explique comment créer et exécuter des applications clientes à l'aide de AWS CloudShell. Les applications utilisent deux fonctions Lambda pour écrire des données dans une table DynamoDB, puis les lire à partir de cette table. Les fonctions Lambda et la table DynamoDB sont enregistrées en tant qu'instances de service. AWS Cloud Map Le code des applications clientes et des fonctions Lambda utilise des attributs AWS Cloud Map personnalisés pour découvrir les ressources nécessaires à l'exécution du travail.

Pour une version AWS CLI basée de ce didacticiel, voir[Apprenez à utiliser la découverte AWS Cloud Map de services avec des attributs personnalisés à l'aide du AWS CLI](tutorial-microservices-cli.md).

**Important**  
Vous créerez des AWS ressources au cours de l'atelier, ce qui entraînera des frais sur votre AWS compte. Il est recommandé de nettoyer les ressources dès la fin de l'atelier afin de minimiser les coûts.

## Conditions préalables
<a name="tutorial-customattributes-prerequisites"></a>

Avant de commencer, complétez les étapes détaillées dans [Configurer pour utiliser AWS Cloud Map](setting-up-cloud-map.md).

## Étape 1 : créer un espace de AWS Cloud Map noms
<a name="tutorial-customattributes-step1"></a>

Au cours de cette étape, vous allez créer un espace de AWS Cloud Map noms. Un espace de noms est une construction utilisée pour regrouper les services d'une application. Lorsque vous créez l'espace de noms, vous spécifiez la manière dont les ressources seront détectables. Les ressources créées dans l'espace de noms créé au cours de cette étape seront détectables à l'aide d'appels d' AWS Cloud Map API utilisant des attributs personnalisés.

1. Connectez-vous à la AWS Cloud Map console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/).

1. Choisissez **Create namespace (Créer un espace de noms)**.

1. Pour le **nom de l'espace de noms**, spécifiez`cloudmap-tutorial`.

1. (Facultatif) Pour la **description de l'espace de noms**, spécifiez la raison pour laquelle vous souhaitez utiliser l'espace de noms.

1. Pour la **découverte d'instances**, sélectionnez **Appels d'API**.

1. Conservez le reste des valeurs par défaut et choisissez **Create namespace**.

## Étape 2 : Création d'une table DynamoDB
<a name="tutorial-customattributes-step2"></a>

Au cours de cette étape, vous allez créer une table DynamoDB. La table est utilisée pour stocker et récupérer les données de l'exemple d'application que vous allez créer dans les étapes suivantes.

Pour plus d'informations sur la création d'une DynamoDB, [reportez-vous à Étape 1 : Création d'une table dans DynamoDB dans](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) le Guide du développeur *DynamoDB et utilisez le tableau suivant pour déterminer les options* à spécifier.


| Option | Value | 
| --- | --- | 
| Nom de la table | carte des nuages | 
| Clé de partition | id | 

Conservez les valeurs par défaut pour le reste des paramètres et créez le tableau.

## Étape 3 : Création d'un service de AWS Cloud Map données et enregistrement de la table DynamoDB en tant qu'instance
<a name="tutorial-customattributes-step3"></a>

Au cours de cette étape, vous créez un AWS Cloud Map service, puis vous enregistrez la table DynamoDB créée lors de la dernière étape en tant qu'instance de service.

1. Ouvrez la AWS Cloud Map console à [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. Dans la liste des espaces de noms, sélectionnez l'espace de `cloudmap-tutorial` noms et choisissez **Afficher** les détails.

1. Dans la section **Services**, choisissez **Créer un service** et procédez comme suit.

   1. Pour **Nom du service**, entrez `data-service`.

   1. Conservez le reste des valeurs par défaut et choisissez **Create service**.

1. Dans la section **Services**, sélectionnez le `data-service` service et choisissez **Afficher les détails**.

1. Dans la section **Instances de service**, choisissez **Enregistrer une instance de service**.

1. Sur la page **Enregistrer une instance de service**, procédez comme suit.

   1. Dans **Type d'instance**, sélectionnez **Informations d'identification pour une autre ressource**.

   1. Pour l'**identifiant de l'instance de service**, spécifiez`data-instance`.

   1. Dans la section **Attributs personnalisés**, spécifiez la paire clé-valeur suivante : **clé** =`tablename`, **valeur** =. `cloudmap`

## Étape 4 : Création d'un rôle AWS Lambda d'exécution
<a name="tutorial-customattributes-step4"></a>

Au cours de cette étape, vous créez un rôle IAM que la AWS Lambda fonction de l'étape suivante utilisera. Vous pouvez nommer le rôle IAM `cloudmap-tutorial-role` et omettre la limite d'autorisations, car le rôle n'est utilisé que pour ce didacticiel, et vous pouvez le supprimer par la suite.

**Pour créer le rôle de service pour Lambda (console IAM)**

1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

1. Dans le volet de navigation de la console IAM, sélectionnez **Roles** (Rôles), puis **Create role** (Créer un rôle).

1. Pour **Trusted entity** (Entité de confiance), choisissez **Service AWS**.

1. Pour **Service ou cas d'utilisation**, choisissez **Lambda**, puis choisissez le cas d'utilisation **Lambda**.

1. Choisissez **Suivant**.

1. Recherchez et cochez la case à côté de la `PowerUserAccess` politique, puis choisissez **Suivant**.

1. Choisissez **Suivant**.

1. Pour **Nom du rôle**, spécifiez`cloudmap-tutorial-role`.

1. Passez en revue les informations du rôle, puis choisissez **Create role** (Créer un rôle).

## Étape 5 : Création de la fonction Lambda pour écrire des données
<a name="tutorial-customattributes-step5"></a>

Au cours de cette étape, vous créez une fonction Lambda créée de toutes pièces qui écrit des données dans la table DynamoDB en utilisant l' AWS Cloud Map API pour interroger le service que vous avez créé. AWS Cloud Map 

Pour plus d'informations sur la création d'une fonction Lambda, voir [Création d'une fonction Lambda avec la console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) dans le *Guide du AWS Lambda développeur* et utilisez le tableau suivant pour déterminer les options à spécifier ou à choisir.


| Option | Value | 
| --- | --- | 
| Nom de la fonction | fonction d'écriture | 
| Environnement d’exécution | Python 3.12 | 
| Architecture | x86\_64 | 
| Permissions | Utiliser un rôle existant | 
| Rôle existant | cloudmap-tutorial-role | 

Après avoir créé la fonction, mettez à jour l'exemple de code pour qu'il reflète le code Python suivant, puis déployez la fonction. Notez que vous spécifiez l'attribut `datatable` personnalisé que vous avez associé à l'instance de AWS Cloud Map service que vous avez créée pour la table DynamoDB. La fonction génère une clé qui est un nombre aléatoire compris entre 1 et 100 et l'associe à une valeur qui est transmise à la fonction lors de son appel.

```
import json
import boto3
import random

def lambda_handler(event, context):
       
    serviceclient = boto3.client('servicediscovery')
    
    response = serviceclient.discover_instances(
        NamespaceName='cloudmap-tutorial',
        ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.put_item(
        Item={ 'id': str(random.randint(1,100)), 'todo': event })
       
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

Après avoir déployé la fonction, pour éviter les erreurs de temporisation, actualisez le délai d'expiration de la fonction à 5 secondes. *Pour plus d'informations, voir [Configurer le délai d'expiration de la fonction Lambda dans le Guide](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) du AWS Lambda développeur.*

## Étape 6 : créer un service d' AWS Cloud Map application et enregistrer la fonction d'écriture Lambda en tant qu'instance
<a name="tutorial-customattributes-step6"></a>

Au cours de cette étape, vous créez un AWS Cloud Map service, puis vous enregistrez la fonction d'écriture Lambda en tant qu'instance de service.

1. Ouvrez la AWS Cloud Map console à [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. Dans le volet de navigation de gauche, choisissez **Namespaces**.

1. Dans la liste des espaces de noms, sélectionnez l'espace de `cloudmap-tutorial` noms et choisissez **Afficher** les détails.

1. Dans la section **Services**, choisissez **Créer un service** et procédez comme suit.

   1. Pour **Nom du service**, entrez `app-service`.

   1. Conservez le reste des valeurs par défaut et choisissez **Create service**.

1. Dans la section **Services**, sélectionnez le `app-service` service et choisissez **Afficher les détails**.

1. Dans la section **Instances de service**, choisissez **Enregistrer une instance de service**.

1. Sur la page **Enregistrer une instance de service**, procédez comme suit.

   1. Dans **Type d'instance**, sélectionnez **Informations d'identification pour une autre ressource**.

   1. Pour l'**identifiant de l'instance de service**, spécifiez`write-instance`.

   1. Dans la section **Attributs personnalisés**, spécifiez les paires clé-valeur suivantes.
      + **clé** =`action`, **valeur** = `write`
      + **clé** =`functionname`, **valeur** = `writefunction`

## Étape 7 : Création de la fonction Lambda pour lire les données
<a name="tutorial-customattributes-step7"></a>

Au cours de cette étape, vous allez créer une fonction Lambda créée de toutes pièces qui écrit des données dans la table DynamoDB que vous avez créée.

Pour plus d'informations sur la création d'une fonction Lambda, voir [Création d'une fonction Lambda avec la console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) dans le *Guide du AWS Lambda développeur* et utilisez le tableau suivant pour déterminer les options à spécifier ou à choisir.


| Option | Value | 
| --- | --- | 
| Nom de la fonction | fonction de lecture | 
| Environnement d’exécution | Python 3.12 | 
| Architecture | x86\_64 | 
| Permissions | Utiliser un rôle existant | 
| Rôle existant | cloudmap-tutorial-role | 

Après avoir créé la fonction, mettez à jour l'exemple de code pour qu'il reflète le code Python suivant, puis déployez la fonction. La fonction scanne le tableau et renvoie tous les éléments.

```
import json
import boto3

def lambda_handler(event, context):
    serviceclient = boto3.client('servicediscovery')

    response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.scan(Select='ALL_ATTRIBUTES')

    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

Après avoir déployé la fonction, pour éviter les erreurs de temporisation, actualisez le délai d'expiration de la fonction à 5 secondes. *Pour plus d'informations, voir [Configurer le délai d'expiration de la fonction Lambda dans le Guide](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) du AWS Lambda développeur.*

## Étape 8 : enregistrer la fonction de lecture Lambda en tant qu'instance AWS Cloud Map de service
<a name="tutorial-customattributes-step8"></a>

Au cours de cette étape, vous enregistrez la fonction de lecture Lambda en tant qu'instance de service dans le `app-service` service que vous avez créé précédemment.

1. Ouvrez la AWS Cloud Map console à [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. Dans le volet de navigation de gauche, choisissez **Namespaces**.

1. Dans la liste des espaces de noms, sélectionnez l'espace de `cloudmap-tutorial` noms et choisissez **Afficher** les détails.

1. Dans la section **Services**, sélectionnez le `app-service` service et choisissez **Afficher les détails**.

1. Dans la section **Instances de service**, choisissez **Enregistrer une instance de service**.

1. Sur la page **Enregistrer une instance de service**, procédez comme suit.

   1. Dans **Type d'instance**, sélectionnez **Informations d'identification pour une autre ressource**.

   1. Pour l'**identifiant de l'instance de service**, spécifiez`read-instance`.

   1. Dans la section **Attributs personnalisés**, spécifiez les paires clé-valeur suivantes.
      + **clé** =`action`, **valeur** = `read`
      + **clé** =`functionname`, **valeur** = `readfunction`

## Étape 9 : créer et exécuter des clients de lecture et d'écriture sur AWS CloudShell
<a name="tutorial-customattributes-step10"></a>

Vous pouvez créer et exécuter des applications clientes AWS CloudShell qui utilisent du code pour découvrir les services que vous avez configurés AWS Cloud Map et appeler ces services.

1. Ouvrez la AWS CloudShell console à [https://console.aws.amazon.com/cloudshell/](https://console.aws.amazon.com/cloudshell/)

1. Utilisez la commande suivante pour créer un fichier appelé`writefunction.py`.

   ```
   vim writeclient.py
   ```

1. Dans le `writeclient.py` fichier, passez en mode insertion en appuyant sur le `i` bouton. Ensuite, copiez et collez le code suivant. Ce code découvre la fonction Lambda qui permet d'écrire des données en recherchant l'attribut personnalisé `name=writeservice` dans le `app-service` service. Le nom de la fonction Lambda chargée d'écrire les données dans la table DynamoDB est renvoyé. Ensuite, la fonction Lambda est invoquée, en transmettant un exemple de charge utile qui est écrit dans la table sous forme de valeur.

   ```
   import boto3
   
   serviceclient = boto3.client('servicediscovery')
   
   response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'write' })
   
   functionname = response["Instances"][0]["Attributes"]["functionname"]
   
   lambdaclient = boto3.client('lambda')
   
   resp = lambdaclient.invoke(FunctionName=functionname, Payload='"This is a test data"')
   
   print(resp["Payload"].read())
   ```

1. Appuyez sur la touche d'échappement`:wq`, tapez et appuyez sur la touche Entrée pour enregistrer le fichier et quitter.

1. Utilisez la commande suivante pour exécuter le code Python.

   ```
   python3 writeclient.py
   ```

   Le résultat doit être une `200` réponse, similaire à ce qui suit.

   ```
   b'{"statusCode": 200, "body": "{\\"ResponseMetadata\\": {\\"RequestId\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Wed, 06 Mar 2024 22:46:09 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"2\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"2745614147\\"}, \\"RetryAttempts\\": 0}}"}'
   ```

1. Pour vérifier que l'écriture a réussi à l'étape précédente, créez un client de lecture.

   1. Utilisez la commande suivante pour créer un fichier appelé`readfunction.py`.

      ```
      vim readclient.py
      ```

   1. Dans le `readclient.py` fichier, appuyez sur le `i` bouton pour passer en mode insertion. Ensuite, copiez et collez le code suivant. Ce code scanne le tableau et renvoie la valeur que vous y avez écrite à l'étape précédente.

      ```
      import boto3
      
      serviceclient = boto3.client('servicediscovery')
      
      response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'read' })
      
      functionname = response["Instances"][0]["Attributes"]["functionname"]
      
      lambdaclient = boto3.client('lambda')
      
      resp = lambdaclient.invoke(FunctionName=functionname, InvocationType='RequestResponse')
      
      print(resp["Payload"].read())
      ```

   1. Appuyez sur la touche d'échappement`:wq`, tapez et appuyez sur la touche Entrée pour enregistrer le fichier et quitter.

   1. Utilisez la commande suivante pour exécuter le code Python.

      ```
      python3 readclient.py
      ```

      La sortie doit ressembler à ce qui suit, répertoriant la valeur écrite dans la table en exécutant `writefunction.py` et la clé aléatoire générée dans la fonction d'écriture Lambda.

      ```
        b'{"statusCode": 200, "body": "{\\"Items\\": [{\\"id\\": \\"45\\", \\"todo\\": \\"This is a test data\\"}], \\"Count\\": 1, \\"ScannedCount\\": 1, \\"ResponseMetadata\\": {\\"RequestId\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Thu, 25 Jul 2024 20:43:33 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"91\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"1163081893\\"}, \\"RetryAttempts\\": 0}}"}'
      ```

## Étape 10 : Nettoyer les ressources
<a name="tutorial-customattributes-step11"></a>

Une fois le didacticiel terminé, supprimez les ressources pour éviter d'encourir des frais supplémentaires. AWS Cloud Map nécessite que vous les nettoyiez dans l'ordre inverse, les instances de service d'abord, puis les services et enfin l'espace de noms. Les étapes suivantes vous guident dans le nettoyage des AWS Cloud Map ressources utilisées dans le didacticiel.

**Pour supprimer les AWS Cloud Map ressources**

1. Connectez-vous à la AWS Cloud Map console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/).

1. Dans la liste des espaces de noms, sélectionnez l'espace de `cloudmap-tutorial` noms et choisissez **Afficher** les détails.

1. Sur la page des détails de l'espace de noms, dans la liste des services, sélectionnez le `data-service` service et choisissez **Afficher les détails**.

1. Dans la section **Instances de service**, sélectionnez l'`data-instance`instance et choisissez **Désenregistrer**.

1. À l'aide du fil d'Ariane situé en haut de la page, sélectionnez **cloudmap-tutorial.com** pour revenir à la page détaillée de l'espace de noms.

1. **Sur la page des détails de l'espace de noms, dans la liste des services, sélectionnez le **service de données** et choisissez Supprimer.**

1. Répétez les étapes 3 à 6 pour le `app-service` service `write-instance` et les instances `read-instance` de service.

1. Dans le volet de navigation de gauche, choisissez **Namespaces**.

1. Sélectionnez l'espace de `cloudmap-tutorial` noms, puis choisissez **Supprimer**.

Le tableau suivant répertorie les procédures que vous pouvez suivre pour supprimer les autres ressources utilisées dans le didacticiel.


| Ressource | Étapes | 
| --- | --- | 
| Tableau DynamoDB | [Étape 6 : (Facultatif) Supprimez votre table DynamoDB pour nettoyer](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-6.html) les ressources dans le manuel du développeur Amazon DynamoDB | 
| Fonctions Lambda et rôle d'exécution IAM associé | [Faites le ménage](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#gettingstarted-cleanup) dans le *guide du AWS Lambda développeur* | 