

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Aprenda a utilizar la detección AWS Cloud Map de servicios con atributos personalizados
<a name="tutorial-microservices"></a>

El siguiente tutorial muestra cómo utilizar la detección de AWS Cloud Map servicios con atributos personalizados que se pueden detectar mediante la AWS Cloud Map API. El tutorial explica cómo crear y ejecutar aplicaciones cliente mediante AWS CloudShell. Las aplicaciones utilizan dos funciones de Lambda para escribir datos en una tabla de DynamoDB y, a continuación, leerlos de la tabla. Las funciones de Lambda y la tabla de DynamoDB se registran como instancias de servicio. AWS Cloud Map El código de las aplicaciones cliente y las funciones Lambda utiliza atributos AWS Cloud Map personalizados para descubrir los recursos necesarios para realizar el trabajo.

Para obtener una versión AWS CLI basada de este tutorial, consulte[Aprenda a utilizar la detección AWS Cloud Map de servicios con atributos personalizados mediante el AWS CLI](tutorial-microservices-cli.md).

**importante**  
Creará AWS recursos durante el taller, lo que tendrá un coste en su AWS cuenta. Se recomienda limpiar los recursos tan pronto como termine el taller para minimizar el costo.

## Requisitos previos
<a name="tutorial-customattributes-prerequisites"></a>

Antes de comenzar, complete los pasos de [Configurado para usar AWS Cloud Map](setting-up-cloud-map.md).

## Paso 1: Crea un AWS Cloud Map espacio de nombres
<a name="tutorial-customattributes-step1"></a>

En este paso, crearás un AWS Cloud Map espacio de nombres. Un espacio de nombres es una construcción que se utiliza para agrupar los servicios de una aplicación. Al crear el espacio de nombres, se especifica cómo se podrán detectar los recursos. Los recursos creados en el espacio de nombres creado en este paso se podrán detectar mediante llamadas a la API mediante atributos personalizados. AWS Cloud Map 

1. Inicie sesión en Consola de administración de AWS y abra la consola en AWS Cloud Map . [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. Elija **Crear espacio de nombres**.

1. Para el **nombre del espacio de nombres, especifique**. `cloudmap-tutorial`

1. (Opcional) En la **descripción del espacio de nombres**, especifique una descripción del uso que desee darle al espacio de nombres.

1. **Para la **detección de instancias, selecciona Llamadas** a la API.**

1. Deje el resto de los valores predeterminados y elija **Crear espacio de nombres**.

## Paso 2: Crear una tabla de DynamoDB
<a name="tutorial-customattributes-step2"></a>

En este paso, creará una tabla de DynamoDB. La tabla se utiliza para almacenar y recuperar datos para la aplicación de ejemplo que se creará en los pasos siguientes.

Para obtener información sobre cómo crear un DynamoDB, [consulte el paso 1: Crear una tabla en DynamoDB en](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) la Guía para desarrolladores de DynamoDB y *utilice la siguiente tabla para determinar qué opciones* especificar.


| Opción | Valor | 
| --- | --- | 
| Nombre de la tabla | mapa de nubes | 
| Clave de partición | id | 

Mantenga los valores predeterminados para el resto de la configuración y cree la tabla.

## Paso 3: Crear un servicio de AWS Cloud Map datos y registrar la tabla de DynamoDB como instancia
<a name="tutorial-customattributes-step3"></a>

En este paso, se crea un AWS Cloud Map servicio y, a continuación, se registra la tabla de DynamoDB creada en el último paso como instancia de servicio.

1. Abra la consola en AWS Cloud Map [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. **En la lista de espacios de nombres, seleccione el espacio de `cloudmap-tutorial` nombres y elija Ver detalles.**

1. En la sección **Servicios**, selecciona **Crear servicio** y haz lo siguiente.

   1. En **Nombre del servicio**, escriba `data-service`.

   1. Deje el resto de los valores predeterminados y elija **Crear servicio**.

1. En la sección **Servicios**, selecciona el `data-service` servicio y elige **Ver detalles**.

1. En la sección **Instancias de servicio**, selecciona **Registrar instancia de servicio**.

1. En la página **Registrar una instancia de servicio**, haga lo siguiente.

   1. En **Tipo de instancia**, seleccione **Información de identificación para otro recurso**.

   1. En **ID de instancia de servicio**, especifique`data-instance`.

   1. En la sección **Atributos personalizados**, especifique el siguiente par clave-valor: **clave** =`tablename`, **valor** =. `cloudmap`

## Paso 4: Crear un AWS Lambda rol de ejecución
<a name="tutorial-customattributes-step4"></a>

En este paso, se crea un rol de IAM que utilizará la AWS Lambda función del paso siguiente. Puede asignar un nombre a la función de IAM `cloudmap-tutorial-role` y omitir el límite de los permisos, ya que la función solo se utiliza en este tutorial y, posteriormente, puede eliminarla.

**Para crear el rol de servicio para Lambda (consola de IAM)**

1. Inicie sesión en la consola de IAM Consola de administración de AWS y ábrala en. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)

1. En el panel de navegación de la consola de IAM, seleccione **Roles** y, a continuación, elija **Crear rol**.

1. En **Tipo de entidad de confianza**, elija **Servicio de AWS**.

1. Para **Servicio o caso de uso**, elija **Lambda** y, a continuación, elija el caso de uso de **Lambda**.

1. Elija **Siguiente**.

1. **Busque y seleccione la casilla situada junto a la `PowerUserAccess` política y, a continuación, seleccione Siguiente.**

1. Elija **Siguiente**.

1. En **Nombre del rol**, especifique`cloudmap-tutorial-role`.

1. Revise el rol y, a continuación, elija **Crear rol**.

## Paso 5: Crear la función Lambda para escribir datos
<a name="tutorial-customattributes-step5"></a>

En este paso, creará una función Lambda creada desde cero que escriba datos en la tabla de DynamoDB mediante la AWS Cloud Map API para consultar el servicio que ha creado. AWS Cloud Map 

Para obtener información sobre la creación de una función Lambda, consulte [Crear una función Lambda con la consola en la](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) *Guía para AWS Lambda desarrolladores* y utilice la siguiente tabla para determinar qué opciones especificar o elegir.


| Opción | Valor | 
| --- | --- | 
| Nombre de la función | función de escritura | 
| Tiempo de ejecución | Python 3.12 | 
| Arquitectura | x86\_64 | 
| Permisos | Usa un rol existente | 
| Rol existente | cloudmap-tutorial-role | 

Tras crear la función, actualice el código de ejemplo para que refleje el siguiente código de Python y, a continuación, implemente la función. Tenga en cuenta que está especificando el atributo `datatable` personalizado que ha asociado a la instancia de AWS Cloud Map servicio que ha creado para la tabla de DynamoDB. La función genera una clave que es un número aleatorio entre 1 y 100 y la asocia a un valor que se pasa a la función cuando se llama a ella.

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

Tras implementar la función, para evitar errores de tiempo de espera, actualice el tiempo de espera de la función a 5 segundos. Para más información, consulte [Configure Lambda function timeout](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) en la *AWS Lambda Developer Guide*.

## Paso 6: Crear un servicio de AWS Cloud Map aplicaciones y registrar la función de escritura de Lambda como instancia
<a name="tutorial-customattributes-step6"></a>

En este paso, se crea un AWS Cloud Map servicio y, a continuación, se registra la función de escritura de Lambda como instancia de servicio.

1. Abra la AWS Cloud Map consola en [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. En el panel de navegación de la izquierda, selecciona **Namespaces**.

1. **En la lista de espacios de nombres, seleccione el espacio de `cloudmap-tutorial` nombres y elija Ver detalles.**

1. En la sección **Servicios**, selecciona **Crear servicio** y haz lo siguiente.

   1. En **Nombre del servicio**, escriba `app-service`.

   1. Deje el resto de los valores predeterminados y elija **Crear servicio**.

1. En la sección **Servicios**, selecciona el `app-service` servicio y elige **Ver detalles**.

1. En la sección **Instancias de servicio**, selecciona **Registrar instancia de servicio**.

1. En la página **Registrar una instancia de servicio**, haga lo siguiente.

   1. En **Tipo de instancia**, seleccione **Información de identificación para otro recurso**.

   1. En **ID de instancia de servicio**, especifique`write-instance`.

   1. En la sección **Atributos personalizados**, especifique los siguientes pares clave-valor.
      + **clave** **=`action`, valor =** `write`
      + **clave** =`functionname`, **valor** = `writefunction`

## Paso 7: Crear la función Lambda para leer los datos
<a name="tutorial-customattributes-step7"></a>

En este paso, creará una función Lambda creada desde cero que escriba datos en la tabla de DynamoDB que ha creado.

Para obtener información sobre la creación de una función Lambda, consulte [Crear una función Lambda con la consola en la](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) *Guía para AWS Lambda desarrolladores* y utilice la siguiente tabla para determinar qué opciones especificar o elegir.


| Opción | Valor | 
| --- | --- | 
| Nombre de la función | función de lectura | 
| Tiempo de ejecución | Python 3.12 | 
| Arquitectura | x86\_64 | 
| Permisos | Usa un rol existente | 
| Rol existente | cloudmap-tutorial-role | 

Tras crear la función, actualice el código de ejemplo para que refleje el siguiente código de Python y, a continuación, implemente la función. La función escanea la tabla y devuelve todos los elementos.

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

Después de implementar la función, para evitar errores de tiempo de espera, actualice el tiempo de espera de la función a 5 segundos. Para más información, consulte [Configure Lambda function timeout](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) en la *AWS Lambda Developer Guide*.

## Paso 8: Registrar la función de lectura Lambda como una AWS Cloud Map instancia de servicio
<a name="tutorial-customattributes-step8"></a>

En este paso, registrará la función de lectura Lambda como una instancia de servicio en el `app-service` servicio que creó anteriormente.

1. Abra la AWS Cloud Map consola en [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. En el panel de navegación de la izquierda, selecciona **Namespaces**.

1. **En la lista de espacios de nombres, seleccione el espacio de `cloudmap-tutorial` nombres y elija Ver detalles.**

1. **En la sección **Servicios**, selecciona el `app-service` servicio y elige Ver detalles.**

1. En la sección **Instancias de servicio**, selecciona **Registrar instancia de servicio**.

1. En la página **Registrar una instancia de servicio**, haga lo siguiente.

   1. En **Tipo de instancia**, seleccione **Información de identificación para otro recurso**.

   1. En **ID de instancia de servicio**, especifique`read-instance`.

   1. En la sección **Atributos personalizados**, especifique los siguientes pares clave-valor.
      + **clave** **=`action`, valor =** `read`
      + **clave** =`functionname`, **valor** = `readfunction`

## Paso 9: Crear y ejecutar clientes de lectura y escritura en AWS CloudShell
<a name="tutorial-customattributes-step10"></a>

Puede crear y ejecutar aplicaciones cliente AWS CloudShell que utilicen código para descubrir los servicios que ha configurado AWS Cloud Map y realizar llamadas a estos servicios.

1. Abra la AWS CloudShell consola en [https://console.aws.amazon.com/cloudshell/](https://console.aws.amazon.com/cloudshell/)

1. Utilice el siguiente comando para crear un archivo llamado`writefunction.py`.

   ```
   vim writeclient.py
   ```

1. En el `writeclient.py` archivo, entre en el modo de inserción pulsando el `i` botón. Luego, copia y pega el siguiente código. Este código descubre la función Lambda para escribir datos buscando el atributo personalizado `name=writeservice` en el `app-service` servicio. Se devuelve el nombre de la función Lambda responsable de escribir los datos en la tabla de DynamoDB. A continuación, se invoca la función Lambda y se pasa una carga útil de muestra que se escribe en la tabla como un valor.

   ```
   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. Pulse la tecla escape`:wq`, escriba y pulse la tecla enter para guardar el archivo y salir.

1. Usa el siguiente comando para ejecutar el código de Python.

   ```
   python3 writeclient.py
   ```

   El resultado debe ser una `200` respuesta similar a la siguiente.

   ```
   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. Para comprobar que la escritura se realizó correctamente en el paso anterior, cree un cliente de lectura.

   1. Use el siguiente comando para crear un archivo llamado`readfunction.py`.

      ```
      vim readclient.py
      ```

   1. En el `readclient.py` archivo, pulse el `i` botón para entrar en el modo de inserción. A continuación, copia y pega el siguiente código. Este código escanea la tabla y devolverá el valor que escribiste en la tabla en el paso anterior.

      ```
      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. Pulse la tecla escape`:wq`, escriba y pulse la tecla enter para guardar el archivo y salir.

   1. Usa el siguiente comando para ejecutar el código de Python.

      ```
      python3 readclient.py
      ```

      El resultado debe tener un aspecto similar al siguiente, con una lista del valor escrito en la tabla mediante la ejecución `writefunction.py` y la clave aleatoria generada en la función de escritura de 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}}"}'
      ```

## Paso 10: Limpiar los recursos
<a name="tutorial-customattributes-step11"></a>

Una vez que haya completado el tutorial, elimine los recursos para evitar incurrir en cargos adicionales. AWS Cloud Map requiere que los limpie en orden inverso, primero las instancias de servicio, después los servicios y, por último, el espacio de nombres. En los siguientes pasos, se explica cómo limpiar los AWS Cloud Map recursos utilizados en el tutorial.

**Para eliminar los AWS Cloud Map recursos**

1. Inicie sesión en Consola de administración de AWS y abra la AWS Cloud Map consola en [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/).

1. **En la lista de espacios de nombres, seleccione el espacio de `cloudmap-tutorial` nombres y elija Ver detalles.**

1. **En la página de detalles del espacio de nombres, en la lista de servicios, seleccione el `data-service` servicio y elija Ver detalles.**

1. **En la sección **Instancias de servicio**, seleccione la `data-instance` instancia y elija Anular registro.**

1. Con la ruta de navegación situada en la parte superior de la página, selecciona **cloudmap-tutorial.com** para volver a la página de detalles del espacio de nombres.

1. ****En la página de detalles del espacio de nombres, en la lista de servicios, selecciona el servicio de datos y selecciona Eliminar.****

1. Repita los pasos 3 a 6 para el `app-service` servicio y las `write-instance` instancias de servicio. `read-instance`

1. En el panel de navegación de la izquierda, selecciona **Namespaces**.

1. **Seleccione el espacio de `cloudmap-tutorial` nombres y elija Eliminar.**

En la siguiente tabla se enumeran los procedimientos que puede seguir para eliminar los demás recursos utilizados en el tutorial.


| Recurso | Steps | 
| --- | --- | 
| Tabla de DynamoDB | [Paso 6: (opcional) Elimine la tabla de DynamoDB para limpiar los recursos de la Guía para desarrolladores](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-6.html) de Amazon DynamoDB | 
| Funciones Lambda y función de ejecución de IAM asociada | [Limpie en la](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#gettingstarted-cleanup) *guía para desarrolladores AWS Lambda * | 