

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á.

# Saiba como usar a descoberta AWS Cloud Map de serviços com atributos personalizados
<a name="tutorial-microservices"></a>

O tutorial a seguir demonstra como você pode usar a descoberta AWS Cloud Map de serviços com atributos personalizados que podem ser descobertos usando a AWS Cloud Map API. O tutorial orienta você na criação e execução de aplicativos cliente usando AWS CloudShell o. Os aplicativos usam duas funções Lambda para gravar dados em uma tabela do DynamoDB e depois ler a tabela. As funções Lambda e a tabela do DynamoDB são registradas como instâncias de serviço. AWS Cloud Map O código nos aplicativos cliente e nas funções do Lambda usa atributos AWS Cloud Map personalizados para descobrir os recursos necessários para realizar o trabalho.

Para obter uma versão AWS CLI baseada deste tutorial, consulte[Saiba como usar a descoberta AWS Cloud Map de serviços com atributos personalizados usando o AWS CLI](tutorial-microservices-cli.md).

**Importante**  
Você criará AWS recursos durante o workshop, o que acarretará um custo em sua AWS conta. É recomendável limpar os recursos assim que terminar o workshop para minimizar o custo.

## Pré-requisitos
<a name="tutorial-customattributes-prerequisites"></a>

Antes de começar, conclua as etapas em [Configurado para usar AWS Cloud Map](setting-up-cloud-map.md).

## Etapa 1: criar um AWS Cloud Map namespace
<a name="tutorial-customattributes-step1"></a>

Nesta etapa, você cria um AWS Cloud Map namespace. Um namespace é uma construção usada para agrupar serviços para um aplicativo. Ao criar o namespace, você especifica como os recursos serão descobertos. Os recursos criados no namespace criado nesta etapa poderão ser descobertos com chamadas de AWS Cloud Map API usando atributos personalizados.

1. Faça login no Console de gerenciamento da AWS e abra o AWS Cloud Map console em [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/).

1. Escolha **Create namespace (Criar namespace)**.

1. Para **Nome do namespace, especifique**. `cloudmap-tutorial`

1. (Opcional) Para a **descrição do namespace**, especifique uma descrição para o que você pretende usar o namespace.

1. Em **Descoberta de instâncias**, selecione **Chamadas de API**.

1. Deixe o resto dos valores padrão e escolha **Criar namespace**.

## Etapa 2: criar uma tabela do DynamoDB
<a name="tutorial-customattributes-step2"></a>

Nesta etapa, você cria uma tabela do DynamoDB. A tabela é usada para armazenar e recuperar dados para o aplicativo de amostra que você criará nas etapas a seguir.

Para obter informações sobre como criar um DynamoDB, [consulte Etapa 1: Criar uma tabela no DynamoDB no DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html) *Developer Guide e use a tabela a seguir para determinar* quais opções especificar.


| Opção | Valor | 
| --- | --- | 
| Nome da tabela | mapa da nuvem | 
| Chave de partição | id | 

Mantenha os valores padrão para o restante das configurações e crie a tabela.

## Etapa 3: criar um serviço de AWS Cloud Map dados e registrar a tabela do DynamoDB como uma instância
<a name="tutorial-customattributes-step3"></a>

Nessa etapa, você cria um AWS Cloud Map serviço e depois registra a tabela do DynamoDB criada na última etapa como uma instância de serviço.

1. Abra o AWS Cloud Map console em [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. **Na lista de namespaces, selecione o `cloudmap-tutorial` namespace e escolha Exibir detalhes.**

1. Na seção **Serviços**, escolha **Criar serviço** e faça o seguinte.

   1. Em **Nome do serviço**, digite `data-service`.

   1. Deixe o resto dos valores padrão e escolha **Criar serviço**.

1. Na seção **Serviços**, selecione o `data-service` serviço e escolha **Exibir detalhes**.

1. Na seção **Instâncias de serviço**, escolha **Registrar instância de serviço**.

1. Na página **Registrar instância do serviço**, faça o seguinte.

   1. Em **Tipo de instância**, selecione **Informações de identificação para outro recurso**.

   1. Para **ID da instância de serviço**, especifique`data-instance`.

   1. Na seção **Atributos personalizados**, especifique o seguinte par de **valores-chave: chave** =`tablename`, **valor** =. `cloudmap`

## Etapa 4: criar uma função AWS Lambda de execução
<a name="tutorial-customattributes-step4"></a>

Nesta etapa, você cria uma função do IAM que a AWS Lambda função na próxima etapa usa. Você pode nomear a função do IAM `cloudmap-tutorial-role` e omitir o limite de permissões porque a função é usada somente neste tutorial, e você pode excluí-la posteriormente.

**Para criar a função de serviço para o Lambda (console do IAM)**

1. Faça login no Console de gerenciamento da AWS e abra o console do IAM em [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. No painel de navegação do console do IAM, escolha **Perfis** e, em seguida, **Criar perfil**.

1. Em **Tipo de entidade confiável**, escolha **AWS service (Serviço da AWS)**.

1. Para **Serviço ou caso de uso**, escolha **Lambda** e, em seguida, escolha o caso de uso do **Lambda**.

1. Escolha **Próximo**.

1. Pesquise e selecione a caixa ao lado da `PowerUserAccess` política e escolha **Avançar**.

1. Escolha **Próximo**.

1. Em **Nome da função**, especifique`cloudmap-tutorial-role`.

1. Reveja a função e escolha **Criar função**.

## Etapa 5: criar a função Lambda para gravar dados
<a name="tutorial-customattributes-step5"></a>

Nesta etapa, você cria uma função Lambda criada do zero que grava dados na tabela do DynamoDB usando a API para consultar o AWS Cloud Map serviço que você criou. AWS Cloud Map 

Para obter informações sobre como criar uma função Lambda, consulte [Criar uma função Lambda com o console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) no *Guia do AWS Lambda desenvolvedor* e use a tabela a seguir para determinar quais opções especificar ou escolher.


| Opção | Valor | 
| --- | --- | 
| Nome da função | função de gravação | 
| Runtime | Python 3.12 | 
| Arquitetura | x86\_64 | 
| Permissões | Use uma função existente | 
| Função existente | cloudmap-tutorial-role | 

Depois de criar a função, atualize o código de exemplo para refletir o código Python a seguir e, em seguida, implante a função. Observe que você está especificando o atributo `datatable` personalizado associado à instância de AWS Cloud Map serviço criada para a tabela do DynamoDB. A função gera uma chave que é um número aleatório entre 1 e 100 e a associa a um valor que é passado para a função quando ela é chamada.

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

Depois de implantar a função, para evitar erros de tempo limite, atualize o tempo limite da função para 5 segundos. Para obter mais informações, consulte [Configurar tempo limite da função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) no *Guia do desenvolvedor do AWS Lambda *.

## Etapa 6: criar um serviço de AWS Cloud Map aplicativo e registrar a função de gravação do Lambda como uma instância
<a name="tutorial-customattributes-step6"></a>

Nesta etapa, você cria um AWS Cloud Map serviço e depois registra a função de gravação do Lambda como uma instância de serviço.

1. Abra o AWS Cloud Map console em [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. No painel de navegação à esquerda, escolha **Namespaces**.

1. **Na lista de namespaces, selecione o `cloudmap-tutorial` namespace e escolha Exibir detalhes.**

1. Na seção **Serviços**, escolha **Criar serviço** e faça o seguinte.

   1. Em **Nome do serviço**, digite `app-service`.

   1. Deixe o resto dos valores padrão e escolha **Criar serviço**.

1. Na seção **Serviços**, selecione o `app-service` serviço e escolha **Exibir detalhes**.

1. Na seção **Instâncias de serviço**, escolha **Registrar instância de serviço**.

1. Na página **Registrar instância do serviço**, faça o seguinte.

   1. Em **Tipo de instância**, selecione **Informações de identificação para outro recurso**.

   1. Para **ID da instância de serviço**, especifique`write-instance`.

   1. Na seção **Atributos personalizados**, especifique os seguintes pares de valores-chave.
      + **chave** =`action`, **valor** = `write`
      + **chave** =`functionname`, **valor** = `writefunction`

## Etapa 7: criar a função Lambda para ler dados
<a name="tutorial-customattributes-step7"></a>

Nesta etapa, você cria uma função Lambda criada do zero que grava dados na tabela do DynamoDB que você criou.

Para obter informações sobre como criar uma função Lambda, consulte [Criar uma função Lambda com o console](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function) no *Guia do AWS Lambda desenvolvedor* e use a tabela a seguir para determinar quais opções especificar ou escolher.


| Opção | Valor | 
| --- | --- | 
| Nome da função | função de leitura | 
| Runtime | Python 3.12 | 
| Arquitetura | x86\_64 | 
| Permissões | Use uma função existente | 
| Função existente | cloudmap-tutorial-role | 

Depois de criar a função, atualize o código de exemplo para refletir o código Python a seguir e, em seguida, implante a função. A função escaneia a tabela e retorna todos os itens.

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

Depois de implantar a função, para evitar erros de tempo limite, atualize o tempo limite da função para 5 segundos. Para obter mais informações, consulte [Configurar tempo limite da função do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html) no *Guia do desenvolvedor do AWS Lambda *.

## Etapa 8: registrar a função de leitura do Lambda como uma AWS Cloud Map instância de serviço
<a name="tutorial-customattributes-step8"></a>

Nesta etapa, você registra a função de leitura do Lambda como uma instância de serviço no `app-service` serviço que você criou anteriormente.

1. Abra o AWS Cloud Map console em [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)

1. No painel de navegação à esquerda, escolha **Namespaces**.

1. **Na lista de namespaces, selecione o `cloudmap-tutorial` namespace e escolha Exibir detalhes.**

1. Na seção **Serviços**, selecione o `app-service` serviço e escolha **Exibir detalhes**.

1. Na seção **Instâncias de serviço**, escolha **Registrar instância de serviço**.

1. Na página **Registrar instância do serviço**, faça o seguinte.

   1. Em **Tipo de instância**, selecione **Informações de identificação para outro recurso**.

   1. Para **ID da instância de serviço**, especifique`read-instance`.

   1. Na seção **Atributos personalizados**, especifique os seguintes pares de valores-chave.
      + **chave** =`action`, **valor** = `read`
      + **chave** =`functionname`, **valor** = `readfunction`

## Etapa 9: criar e executar clientes de leitura e gravação no AWS CloudShell
<a name="tutorial-customattributes-step10"></a>

Você pode criar e executar aplicativos cliente AWS CloudShell que usam código para descobrir os serviços nos quais você configurou AWS Cloud Map e fazer chamadas para esses serviços.

1. Abra o AWS CloudShell console em [https://console.aws.amazon.com/cloudshell/](https://console.aws.amazon.com/cloudshell/)

1. Use o comando a seguir para criar um arquivo chamado`writefunction.py`.

   ```
   vim writeclient.py
   ```

1. No `writeclient.py` arquivo, entre no modo de inserção pressionando o `i` botão. Em seguida, copie e cole o código a seguir. Esse código descobre a função Lambda para gravar dados pesquisando o `name=writeservice` atributo personalizado no `app-service` serviço. O nome da função Lambda responsável por gravar dados na tabela do DynamoDB é retornado. Em seguida, a função Lambda é invocada, passando uma amostra de carga útil que é gravada na tabela como um 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. Pressione a tecla escape`:wq`, digite e pressione a tecla enter para salvar o arquivo e sair.

1. Use o comando a seguir para executar o código Python.

   ```
   python3 writeclient.py
   ```

   A saída deve ser uma `200` resposta, semelhante à seguinte.

   ```
   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 verificar se a gravação foi bem-sucedida na etapa anterior, crie um cliente de leitura.

   1. Use o comando a seguir para criar um arquivo chamado`readfunction.py`.

      ```
      vim readclient.py
      ```

   1. No `readclient.py` arquivo, pressione o `i` botão para entrar no modo de inserção. Em seguida, copie e cole o código a seguir. Esse código escaneia a tabela e retornará o valor que você gravou na tabela na etapa 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. Pressione a tecla escape`:wq`, digite e pressione a tecla enter para salvar o arquivo e sair.

   1. Use o comando a seguir para executar o código Python.

      ```
      python3 readclient.py
      ```

      A saída deve ser semelhante à seguinte, listando o valor gravado na tabela pela execução `writefunction.py` e a chave aleatória gerada na função de gravação do 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}}"}'
      ```

## Etapa 10: limpar os recursos
<a name="tutorial-customattributes-step11"></a>

Depois de concluir o tutorial, exclua os recursos para evitar cobranças adicionais. AWS Cloud Map exige que você as limpe na ordem inversa, primeiro as instâncias do serviço, depois os serviços e, finalmente, o namespace. As etapas a seguir orientam você na limpeza dos AWS Cloud Map recursos usados no tutorial.

**Para excluir os AWS Cloud Map recursos**

1. Faça login no Console de gerenciamento da AWS e abra o AWS Cloud Map console em [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/).

1. **Na lista de namespaces, selecione o `cloudmap-tutorial` namespace e escolha Exibir detalhes.**

1. Na página de detalhes do namespace, na lista de serviços, selecione o `data-service` serviço e escolha **Exibir detalhes**.

1. Na seção **Instâncias de serviço**, selecione a `data-instance` instância e escolha **Cancelar registro**.

1. Usando o breadcrumb na parte superior da página, selecione **cloudmap-tutorial.com** para voltar à página de detalhes do namespace.

1. **Na página de detalhes do namespace, na lista de serviços, selecione o **serviço de serviços de dados** e escolha Excluir.**

1. Repita as etapas de 3 a 6 para o `app-service` serviço `write-instance` e as instâncias `read-instance` de serviço.

1. No painel de navegação à esquerda, escolha **Namespaces**.

1. **Selecione o `cloudmap-tutorial` namespace e escolha Excluir.**

A tabela a seguir lista os procedimentos que você pode seguir para excluir os outros recursos usados no tutorial.


| Recurso | Etapas | 
| --- | --- | 
| Tabela DynamoDB | [Etapa 6: (Opcional) Exclua sua tabela do DynamoDB para limpar](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-6.html) os recursos no Amazon DynamoDB Developer Guide | 
| Funções Lambda e função de execução do IAM associada | [Limpe](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#gettingstarted-cleanup) no *Guia do AWS Lambda desenvolvedor* | 