

# Escrever uma configuração JSON para o esquema de múltiplas verificações do Node.js
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

O esquema de múltiplas verificações do Node.js permite criar canários que realizam múltiplas verificações de validação em uma única execução de canário. Esse esquema é útil quando você deseja testar vários endpoints, validar diferentes aspectos da aplicação ou realizar uma série de verificações relacionadas em sequência. 

**Topics**
+ [Estrutura da configuração primária](#root-configuration-structure)
+ [Configurações globais](#global-settings)
+ [Gerenciamento de variáveis e dados](#variables-data-management)
+ [Definições de etapas](#step-definitions)
+ [Tipos de verificação](#check-types)
+ [Métodos de autenticação](#authentication-methods)
+ [Asserções e validação](#assertions-validation)
+ [Extração de dados](#data-extraction)

## Estrutura da configuração primária
<a name="root-configuration-structure"></a>

A configuração primária define a estrutura geral do canário do esquema de API avançado.


**Propriedades do esquema**  

| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  globalSettings  | Objeto | Não | Configurações padrão aplicadas a todas as etapas | 
|  variables  | Objeto | Não | Valores reutilizáveis em todas as etapas (máx. 10) | 
|  steps  | Objeto |  Sim  | Conjunto de etapas de monitoramento (1 a 10 etapas) | 

 **Exemplo** 

```
{
  "globalSettings": {
    "stepTimeout": 30000,
    "userAgent": "CloudWatch-Synthetics-Advanced/1.0"
  },
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiVersion": "v1"
  },
  "steps": {
    "1": {
      "stepName": "healthCheck",
      "checkerType": "HTTP",
      "url": "${baseUrl}/health",
      "httpMethod": "GET"
    }
  }
}
```

 **Regras de validação** 
+ Deve conter pelo menos uma etapa
+ Máximo permitido de 10 etapas
+ Não são permitidas outras propriedades além de `globalSettings`, ` variables` e `steps`

## Configurações globais
<a name="global-settings"></a>

As definições globais fornecem configurações padrão que se aplicam a todas as etapas, a menos que sejam substituídas no nível da etapa.

 **Propriedades** 


**Propriedades das configurações globais**  

| Propriedade | Tipo | Padrão | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | integer | 30000 | 5.000 a 300.000 | Tempo limite padrão para todas as etapas (milissegundos) | 

 **Exemplo** 

```
{
  "globalSettings": {
    "stepTimeout": 60000,
            
  }
}
```

## Gerenciamento de variáveis e dados
<a name="variables-data-management"></a>

As variáveis permitem definir valores reutilizáveis que podem ser referenciados em toda a configuração usando a sintaxe `${variableName}`.

 **Propriedades variáveis** 


| Propriedade | Tipo | Descrição | 
| --- | --- | --- | 
| Nomes das variáveis | string | Deve corresponder ao padrão: . ^[a-zA-Z][a-zA-Z0-9\_]\*$ | 
| Valores das variáveis | string | Qualquer valor de string | 

 **Limitações** 
+ Máximo de 10 variáveis por configuração
+ Os nomes das variáveis devem começar com uma letra
+ Os nomes das variáveis podem apenas conter letras, números e sublinhados
+ Tamanho máximo não especificado no esquema

 **Exemplo** 

```
{
  "variables": {
    "baseUrl": "https://api.example.com",
    "apiKey": "${AWS_SECRET:my-api-key}",
    "timeout": "30000",
    "userEmail": "test@example.com"
  }
}
```

 **Uso da configuração** 

```
{
  "steps": {
    "1": {
      "url": "${baseUrl}/users",
      "timeout": "${timeout}",
      "headers": {
        "Authorization": "Bearer ${apiKey}"
      }
    }
  }
}
```

## Definições de etapas
<a name="step-definitions"></a>

As etapas definem operações de monitoramento individuais. Cada etapa é numerada de 1 a 10 e contém um tipo específico de verificação.

 *Propriedades das etapas comuns* 


| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  stepName  | string |  Sim  | Identificador exclusivo da etapa | 
|  checkerType  | string |  Sim  | Tipo de verificação: HTTP, DNS, SSL,  TCP | 
|  extractors  | array | Não | Configuração de extração de dados | 

 *Validação de nome de etapa* 
+ Padrão: ^[a-zA-Z][a-zA-Z0-9\_-]\*$
+ Tamanho máximo: 64 caracteres
+ Deve começar com uma letra

 *Numeração das etapas* 
+ As etapas são numeradas como chaves de string: “1”, “2”,..., “10”
+ Padrão: ^([1-9]\|10)$
+ Mínimo obrigatório de 1 etapa
+ Máximo permitido de 10 etapas

 *Exemplo* 

```
{
  "steps": {
    "1": {
      "stepName": "loginAPI",
      "checkerType": "HTTP",
      "url": "https://api.example.com/login",
      "httpMethod": "POST"
    },
    "2": {
      "stepName": "dnsCheck",
      "checkerType": "DNS",
      "domain": "example.com"
    }
  }
}
```

## Tipos de verificação
<a name="check-types"></a>

### Verificações HTTP
<a name="http-types"></a>

Monitore endpoints e APIs Web com validação abrangente de solicitações e respostas.

 **Propriedades necessárias** 


| Propriedade | Tipo | Descrição | 
| --- | --- | --- | 
|  url  | string | URL de destino (deve ser um formato de URI válido) | 
|  httpMethod  | string | Método HTTP: GET, POST, PUT,  PATCH, DELETE, HEAD, OPTIONS | 

 **Propriedades opcionais** 


| Propriedade | Tipo | Padrão | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  timeout  | integer | 30000 | 5.000 a 300.000 | Tempo limite (milissegundos) | 
|  waitTime  | integer | 0 | 0-60 | Demora antes da solicitação (segundos) | 
|  headers  | objeto | - | - | Cabeçalhos HTTP personalizados | 
|  body  | string | - | - | Corpo da solicitação para operações POST/PUT | 
|  authentication  | objeto | - | - | Configuração da autenticação | 
|  assertions  | array | - | - | Regras de validação de resposta | 

 **Exemplo** 

```
{
  "stepName": "createUser",
  "checkerType": "HTTP",
  "url": "https://api.example.com/users",
  "httpMethod": "POST",
  "timeout": 15000,
  "headers": {
    "Content-Type": "application/json",
    "X-API-Version": "v1"
  },
  "body": "{\"name\":\"John Doe\",\"email\":\"john@example.com\"}",
  "authentication": {
    "type": "API_KEY",
    "apiKey": "${AWS_SECRET:api-credentials}",
    "headerName": "X-API-Key"
  },
  "assertions": [
    {
      "type": "STATUS_CODE",
      "operator": "EQUALS",
      "value": 201
    }
  ]
}
```

### Verificações do DNS
<a name="dns-types"></a>

Valide a resolução do DNS e registre as informações.

 **Propriedades necessárias** 


| Propriedade | Tipo | Descrição | 
| --- | --- | --- | 
|  domain  | string | Nome de domínio a ser consultado (formato de nome de host) | 

 **Propriedades opcionais** 


| Propriedade | Tipo | Padrão | Descrição | 
| --- | --- | --- | --- | 
|  recordType  | string | “A” | Tipo de registro do DNS: A, CNAME, MX,  TXT, NS | 
|  nameserver  | string | - | Servidor do DNS específico a ser consultado | 
|  timeout  | integer | 30000 | Tempo limite de consulta (5.000 a 300.000 ms) | 
|  port  | integer | 53 | Porta do servidor DNS (1 a 65535) | 
|  protocol  | string | “UDP” | Protocolo: UDP ou TCP | 
|  assertions  | array | - | Regras de validação de resposta do DNS | 

 **Exemplo** 

```
{
  "stepName": "dnsResolution",
  "checkerType": "DNS",
  "domain": "example.com",
  "recordType": "A",
  "nameserver": "8.8.8.8",
  "timeout": 10000,
  "assertions": [
    {
      "type": "RECORD_VALUE",
      "operator": "CONTAINS",
      "value": "192.168"
    }
  ]
}
```

### Verificações SSL
<a name="ssl-types"></a>

Monitore a integridade e a configuração dos certificados SSL.

 **Propriedades necessárias** 


| Propriedade | Tipo | Descrição | 
| --- | --- | --- | 
|  hostname  | string | Nome do host de destino (formato do nome do host) | 

 **Propriedades opcionais** 


| Propriedade | Tipo | Padrão | Descrição | 
| --- | --- | --- | --- | 
|  port  | integer | 443 | Porta SSL (1 a 65.535) | 
|  timeout  | integer | 30000 | Tempo limite de conexão (5.000 a 300.000 ms) | 
|  sni  | booliano | TRUE | Indicação de nome do servidor | 
|  verifyHostname  | booliano | TRUE | Verificação de nome do servidor | 
|  allowSelfSigned  | booleano | FALSE | Aceitar certificados autoassinados | 
|  assertions  | array | - | Regras de validação de certificados | 

 **Exemplo** 

```
{
  "stepName": "sslCertCheck",
  "checkerType": "SSL",
  "hostname": "secure.example.com",
  "port": 443,
  "sni": true,
  "verifyHostname": true,
  "assertions": [
    {
      "type": "CERTIFICATE_EXPIRY",
      "operator": "GREATER_THAN",
      "value": 30,
      "unit": "DAYS"
    }
  ]
}
```

### Verificações TCP
<a name="tcp-types"></a>

Teste a conectividade e a validação de resposta da porta TCP.

 **Propriedades necessárias** 


| Propriedade | Tipo | Descrição | 
| --- | --- | --- | 
|  hostname  | string | Nome do host de destino (formato do nome do host) | 
|  port  | integer | Porta de destino (1 a 65.535) | 

 **Propriedades opcionais** 


| Propriedade | Tipo | Padrão | Descrição | 
| --- | --- | --- | --- | 
|  timeout  | integer | 30000 | Tempo limite em geral (5.000 a 300.000 ms) | 
|  connectionTimeout  | integer | 3000 | Tempo limite de conexão (5.000 a 300.000 ms) | 
|  readTimeout  | integer | 2000 | Tempo limite de leitura de dados (5.000 a 300.000 ms) | 
|  sendData  | string | - | Dados a serem enviados após a conexão | 
|  expectedResponse  | string | - | Dados de resposta esperados | 
|  encoding  | string | “UTF-8” | Codificação de dados: UTF-8, ASCII, HEX | 
|  assertions  | array | - | validação de conexão e resposta | 

 **Exemplo** 

```
{
  "stepName": "databaseConnection",
  "checkerType": "TCP",
  "hostname": "db.example.com",
  "port": 3306,
  "connectionTimeout": 5000,
  "sendData": "SELECT 1",
  "expectedResponse": "1",
  "assertions": [
    {
      "type": "CONNECTION_SUCCESSFUL",
      "value": true
    }
  ]
}
```

## Métodos de autenticação
<a name="authentication-methods"></a>

 **Sem autenticação** 

```
{
  "type": "NONE"
}
```

 **Autenticação básica** 


| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  type  | string |  Sim  | Deve ser "BASIC" | 
|  username  | string |  Sim  | Nome de usuário para autenticação | 
|  password  | string |  Sim  | Senha para autenticação | 

 **Exemplo** 

```
{
  "type": "BASIC",
  "username": "admin",
  "password": "${AWS_SECRET:basic-auth:password}"
}
```

 **Autenticação de chave de API** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "API\_KEY" | 
|  apiKey  | string |  Sim  | - | Valor da chave de API | 
|  headerName  | string | Não | “X-API-Key” | Nome de cabeçalho para chave de API | 

 **Exemplo** 

```
{
  "type": "API_KEY",
  "apiKey": "${AWS_SECRET:api-credentials}",
  "headerName": "Authorization"
}
```

 **Credenciais de cliente OAuth** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "OAUTH\_CLIENT\_CREDENTIALS" | 
|  tokenUrl  | string |  Sim  | - | URL do endpoint do token OAuth | 
|  clientId  | string |  Sim  | - | ID do cliente OAuth | 
|  clientSecret  | string |  Sim  | - | Segredo do cliente OAuth | 
|  scope  | string | Não | - | Escopo do OAuth | 
|  audience  | string | Não | - | Público do OAuth | 
|  resource  | string | Não | - | Recurso do OAuth | 
|  tokenApiAuth  | array | Não | - | Métodos de autenticação de API de token: BASIC\_AUTH\_HEADER, REQUEST\_BODY | 
|  tokenCacheTtl  | integer | Não | 3600 | TTL do cache de tokens (mínimo de 60 segundos) | 

 **Exemplo** 

```
{
  "type": "OAUTH_CLIENT_CREDENTIALS",
  "tokenUrl": "https://auth.example.com/oauth/token",
  "clientId": "${AWS_SECRET:oauth-creds:client_id}",
  "clientSecret": "${AWS_SECRET:oauth-creds:client_secret}",
  "scope": "read write",
  "tokenCacheTtl": 7200
}
```

 **AWS Signature (versão 4)** 


| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  type  | string |  Sim  | Deve ser "SIGV4" | 
|  service  | string |  Sim  | Nome do serviço da AWS (por exemplo, “execute-api”) | 
|  region  | string |  Sim  | AWS region | 
|  roleArn  | string |  Sim  | ARN do perfil do IAM para assinatura | 

 **Exemplo** 

```
{
  "type": "SIGV4",
  "service": "execute-api",
  "region": "us-east-1",
  "roleArn": "arn:aws:iam::123456789012:role/SyntheticsRole"
}
```

## Asserções e validação
<a name="assertions-validation"></a>

### Asserções HTTP
<a name="http-assertions"></a>

 **Asserções de código de status** 


| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  type  | string |  Sim  | Deve ser "STATUS\_CODE" | 
|  operator  | string |  Sim  | EQUALS, NOT\_EQUALS, GREATER\_THAN,  LESS\_THAN, IN\_RANGE | 
|  value  | integer | Condicional | Código de status HTTP (100 a 599) | 
|  rangeMin  | integer | Condicional | Valor mínimo do intervalo (para IN\_RANGE) | 
|  rangeMax  | integer | Condicional | Valor máximo do intervalo (para IN\_RANGE) | 

```
{
  "type": "STATUS_CODE",
  "operator": "EQUALS",
  "value": 200
}
```

 **Asserções de tempo de resposta** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "RESPONSE\_TIME" | 
|  operator  | string |  Sim  | - | LESS\_THAN, GREATER\_THAN, EQUALS | 
|  value  | número |  Sim  | - | Valor de tempo (mínimo 0) | 
|  unit  | string | Não | "MILLISSEGUNDOS" | Deve ser "MILLISECONDS" | 

```
{
  "type": "RESPONSE_TIME",
  "operator": "LESS_THAN",
  "value": 500,
  "unit": "MILLISECONDS"
}
```

 **Asserções de cabeçalho** 


| Propriedade | Tipo | Obrigatório | Descrição | 
| --- | --- | --- | --- | 
|  type  | string |  Sim  | Deve ser "HEADER" | 
|  headerName  | string |  Sim  | Nome do cabeçalho a ser validado | 
|  operator  | string |  Sim  | EQUALS, NOT\_EQUALS, CONTAINS,  NOT\_CONTAINS, REGEX\_MATCH, EXIST | 
|  value  | String/booleano | Condicional | Valor esperado (booleano para o operador EXIST) | 

```
{
  "type": "HEADER",
  "headerName": "Content-Type",
  "operator": "CONTAINS",
  "value": "application/json"
}
```

 **Asserções de corpo** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "BODY" | 
|  target  | string | Não | “JSON” | JSON ou TEXT | 
|  path  | string | Condicional | - | JSONPath (obrigatório para destino JSON) | 
|  operator  | string |  Sim  | - | CONTAINS, NOT\_CONTAINS, EQUALS,  NOT\_EQUALS, EXISTS | 
|  value  | String/booleano |  Sim  | - | Valor esperado (booleano para o operador EXISTS) | 

```
{
  "type": "BODY",
  "target": "JSON",
  "path": "$.users[0].name",
  "operator": "EQUALS",
  "value": "John Doe"
}
```

### Asserções DNS
<a name="dns-assertions"></a>

 **Registrar asserções de valor** 


| Propriedade | Tipo | Obrigatório | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "RECORD\_VALUE" | 
|  operator  | string |  Sim  | - | EQUALS, NOT\_EQUALS, CONTAINS,  NOT\_CONTAINS, REGEX\_MATCH | 
|  value  | string |  Sim  | - | Valor do registro esperado | 

 **Asserções de contagem de registros** 


| Propriedade | Tipo | Obrigatório | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "RECORD\_COUNT" | 
|  operator  | string |  Sim  | - | EQUALS, GREATER\_THAN, LESS\_THAN | 
|  value  | integer |  Sim  | ≥ 0 | Contagem esperada (mínimo 0) | 

 **Asserções autoritativas** 


| Propriedade | Tipo | Obrigatório | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "AUTHORITATIVE" | 
|  value  | booleano |  Sim  | - | Status autoritativo esperado | 

 **Asserções TTL** 


| Propriedade | Tipo | Obrigatório | Intervalo | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "TTL" | 
|  operator  | string |  Sim  | - | EQUALS, GREATER\_THAN, LESS\_THAN | 
|  value  | integer |  Sim  | ≥ 0 | TTL esperada (mínimo 0) | 

### Asserções SSL
<a name="ssl-assertions"></a>

 **Asserções de expiração do certificado** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "CERTIFICATE\_EXPIRY" | 
|  operator  | string |  Sim  | - | GREATER\_THAN, LESS\_THAN | 
|  value  | integer |  Sim  | - | Valor de tempo (mínimo 0) | 
|  unit  | string | Não | “DIAS” | DAYS, HOURS | 

 **Asserções de assunto do certificado** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "CERTIFICATE\_SUBJECT" | 
|  field  | string |  Sim  | - | Campo de assunto: CN, O, OU, C, ST, L | 
|  operator  | string |  Sim  | - | CONTAINS, EQUALS, REGEX\_MATCH | 
|  value  | string |  Sim  | - | Valores de campo esperados | 

 **Asserções de emissor de certificado** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "CERTIFICATE\_ISSUER" | 
|  field  | string |  Sim  | - | Campo do emissor: CN, O | 
|  operator  | string |  Sim  | - | CONTAINS, EQUALS | 
|  value  | string |  Sim  | - | Valores de campo esperados | 

### Asserções TCP
<a name="tcp-assertions"></a>

 **Asserções de sucesso de conexão** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "CONNECTION\_SUCCESSFUL" | 
|  value  | booleano |  Sim  | - | Status de conexão esperado | 

 **Asserções de dados de resposta** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sim  | - | Deve ser "RESPONSE\_DATA" | 
|  operator  | string |  Sim  | - | CONTAINS, EQUALS, NOT\_CONTAINS,  REGEX\_MATCH, STARTS\_WITH, ENDS\_WITH | 
|  value  | string |  Sim  | - | Dados de resposta esperados | 
|  encoding  | string | Não | “UTF-8” | UTF-8, ASCII, HEX | 

## Extração de dados
<a name="data-extraction"></a>

Os extratores permitem que você capture dados das respostas para uso em etapas subsequentes ou para relatórios.

 **Propriedades de extração** 


| Propriedade | Tipo | Obrigatório | Padrão | Descrição | 
| --- | --- | --- | --- | --- | 
|  name  | string |  Sim  | - | Nome da variável para dados extraídos | 
|  type  | string |  Sim  | - | Tipo de extração: BODY | 
|  path  | string | Não | - | JSONPath para extração de corpo | 
|  regex  | string | Não | - | Padrão de expressão regular | 
|  regexGroup  | integer | Não | 0 | Grupo de captura de expressão regular (mínimo 0) | 

 **Validação de nome de extração** 
+ Número do padrão: `^[a-zA-Z][a-zA-Z0-9_]*$`
+ Deve começar com uma letra
+ Podem conter apenas letras, números e sublinhados

**Limitação**: a substituição não se aplica aos campos do esquema com valores ENUM específicos

 **Tipos de extração** 

```
{
  "name": "userId",
  "type": "BODY",
  "path": "$.user.id"
}
```

```
{
  "stepName": "loginAndExtract",
  "checkerType": "HTTP",
  "url": "https://api.example.com/login",
  "httpMethod": "POST",
  "body": "{\"username\":\"test\",\"password\":\"pass\"}",
  "extractors": [
    {
      "name": "textVariable",
      "type": "BODY",
      "path": "$.myvalue"
    }
  ]
},
{
  "stepName": "substituteVariable",
  "checkerType": "HTTP",
  "url": "https://api.example.com/get/${textVariable}",
  "httpMethod": "GET",
  "assertions": [
    {
    "type": "BODY",
    "target": "JSON",
    "path": "$.users[0].name",
    "operator": "EQUALS",
    "value": "${textVariable}"
    }
  ]
}
```