

# Escritura de una configuración JSON para un esquema de comprobaciones múltiples de Node.js
<a name="CloudWatch_Synthetics_WritingCanary_Multichecks"></a>

El esquema de comprobaciones múltiples de Node.js le permite crear canarios que lleven a cabo múltiples comprobaciones de validación en una sola ejecución de canario. Este esquema resulta útil cuando se desean probar varios puntos de conexión, validar diferentes aspectos de la aplicación o llevar a cabo una serie de comprobaciones relacionadas de forma secuencial. 

**Topics**
+ [Estructura de configuración raíz](#root-configuration-structure)
+ [Configuración global](#global-settings)
+ [Administración de datos y variables](#variables-data-management)
+ [Definiciones de pasos](#step-definitions)
+ [Tipos de comprobación](#check-types)
+ [Métodos de autenticación](#authentication-methods)
+ [Aserciones y validación](#assertions-validation)
+ [Extracción de datos](#data-extraction)

## Estructura de configuración raíz
<a name="root-configuration-structure"></a>

La configuración raíz define la estructura general del canario de esquema avanzado de la API.


**Propiedades del esquema**  

| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  globalSettings  | Objeto | No | Configuraciones predeterminadas aplicadas a todos los pasos | 
|  variables  | Objeto | No | Valores reutilizables en todos los pasos (máximo 10) | 
|  steps  | Objeto |  Sí  | Recopilación de pasos de supervisión (de 1 a 10 pasos) | 

 **Ejemplo** 

```
{
  "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"
    }
  }
}
```

 **Reglas de validación** 
+ Debe contener un paso como mínimo.
+ Se permiten 10 pasos como máximo.
+ No se permiten propiedades adicionales que no sean `globalSettings`, ` variables` y `steps`.

## Configuración global
<a name="global-settings"></a>

La configuración global proporciona configuraciones predeterminadas que se aplican a todos los pasos, a menos que se anulen por paso.

 **Propiedades de** 


**Propiedades de la configuración global**  

| Propiedad | Tipo | Predeterminado | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  stepTimeout  | entero | 30000 | 5000-300000 | Tiempo de espera predeterminado para todos los pasos (milisegundos) | 

 **Ejemplo** 

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

## Administración de datos y variables
<a name="variables-data-management"></a>

Las variables le permiten definir valores reutilizables a los que se puede hacer referencia en toda la configuración mediante la sintaxis `${variableName}`.

 **Propiedades de variables** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
| Nombres de variable | cadena | Debe coincidir con el patrón ^[a-zA-Z][a-zA-Z0-9\_]\*\$ | 
| Valores de variable | cadena | Cualquier valor de cadena | 

 **Limitaciones** 
+ Se permiten 10 variables por configuración como máximo.
+ Los nombres de variable deben comenzar por una letra.
+ Los nombres de variable solo pueden contener letras, números y guiones bajos.
+ La longitud máxima no se especifica en el esquema.

 **Ejemplo** 

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

 **Uso de la configuración** 

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

## Definiciones de pasos
<a name="step-definitions"></a>

Los pasos definen las operaciones de supervisión individuales. Cada paso está numerado del 1 al 10 y contiene un tipo específico de comprobación.

 *Propiedades comunes de los pasos* 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  stepName  | string |  Sí  | Identificador único del paso | 
|  checkerType  | cadena |  Sí  | Tipo de comprobación: HTTP, DNS, SSL,  TCP | 
|  extractors  | matriz | No | Configuración de la extracción de datos | 

 *Validación del nombre del paso* 
+ Patrón: ^[a-zA-Z][a-zA-Z0-9\_-]\*\$
+ Longitud máxima: 64 caracteres
+ Letra como carácter inicial

 *Numeración de los pasos* 
+ Los pasos se numeran como claves de cadena: “1”, “2”,..., “10”
+ Patrón: ^([1-9]\|10)\$
+ Se requiere 1 paso como mínimo.
+ Se permiten 10 pasos como máximo.

 *Ejemplo* 

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

## Tipos de comprobación
<a name="check-types"></a>

### Comprobaciones HTTP
<a name="http-types"></a>

Supervise los puntos de conexión y las API web con una validación exhaustiva de las solicitudes y las respuestas.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  url  | cadena | URL de destino (debe tener un formato de URI válido) | 
|  httpMethod  | cadena | Método HTTP: GET, POST, PUT,  PATCH, DELETE, HEAD, OPTIONS | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  timeout  | entero | 30000 | 5000-300000 | Tiempo de espera de la solicitud (milisegundos) | 
|  waitTime  | entero | 0 | 0-60 | Retraso antes de la solicitud (segundos) | 
|  headers  | objeto | - | - | Encabezados HTTP personalizados | 
|  body  | cadena | - | - | Cuerpo de la solicitud para operaciones POST y PUT | 
|  authentication  | objeto | - | - | Configuración de la autenticación | 
|  assertions  | matriz | - | - | Reglas de validación de respuestas | 

 **Ejemplo** 

```
{
  "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
    }
  ]
}
```

### Comprobaciones de DNS
<a name="dns-types"></a>

Valide la resolución de DNS y registre la información.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  domain  | cadena | Nombre del dominio que se consultará (formato de nombre de host) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  recordType  | cadena | “A” | Tipo de registro de DNS: A, CNAME, MX,  TXT, NS | 
|  nameserver  | cadena | - | Servidor de DNS específico que se consultará | 
|  timeout  | entero | 30000 | Tiempo de espera de la consulta (5000-300000 ms) | 
|  port  | entero | 53 | Puerto de servidor de DNS (1-65535) | 
|  protocol  | cadena | “UDP” | Protocolo: UDP o TCP | 
|  assertions  | matriz | - | Reglas de validación de respuestas de DNS | 

 **Ejemplo** 

```
{
  "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"
    }
  ]
}
```

### Comprobaciones de SSL
<a name="ssl-types"></a>

Supervise el estado y la configuración de los certificados SSL.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  hostname  | cadena | Nombre de host de destino (formato de nombre de host) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  port  | entero | 443 | Puerto SSL (1-65535) | 
|  timeout  | entero | 30000 | Tiempo de espera de conexión (5000-300000 ms) | 
|  sni  | booleano | TRUE | Indicación del nombre del servidor | 
|  verifyHostname  | booleano | TRUE | Verificación de nombres de host | 
|  allowSelfSigned  | valor booleano | FALSO | Aceptación de certificados autofirmados | 
|  assertions  | matriz | - | Reglas de validación de certificados | 

 **Ejemplo** 

```
{
  "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"
    }
  ]
}
```

### Comprobaciones de TCP
<a name="tcp-types"></a>

Pruebe la conectividad de los puertos TCP y la validación de respuestas.

 **Propiedades necesarias** 


| Propiedad | Tipo | Descripción | 
| --- | --- | --- | 
|  hostname  | cadena | Nombre de host de destino (formato de nombre de host) | 
|  port  | entero | Puerto de destino (1-65535) | 

 **Propiedades opcionales** 


| Propiedad | Tipo | Predeterminado | Descripción | 
| --- | --- | --- | --- | 
|  timeout  | entero | 30000 | Tiempo de espera general (5000-300000 ms) | 
|  connectionTimeout  | entero | 3 000 | Tiempo de espera de conexión (5000-300000 ms) | 
|  readTimeout  | entero | 2000 | Tiempo de espera de lectura de datos (5000-300000 ms) | 
|  sendData  | cadena | - | Datos que se enviarán después de la conexión | 
|  expectedResponse  | cadena | - | Datos de respuesta esperados | 
|  encoding  | cadena | “UTF-8” | Codificación de datos: UTF-8, ASCII, HEX | 
|  assertions  | matriz | - | Validación de respuestas y conexiones | 

 **Ejemplo** 

```
{
  "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 autenticación
<a name="authentication-methods"></a>

 **Sin autenticación** 

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

 **Autenticación básica** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "BASIC" | 
|  username  | cadena |  Sí  | Nombre de usuario para la autenticación | 
|  password  | cadena |  Sí  | Contraseña para la autenticación | 

 **Ejemplo** 

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

 **Autenticación de la clave de API** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "API\_KEY" | 
|  apiKey  | cadena |  Sí  | - | Valor de la clave de API | 
|  headerName  | cadena | No | “X-API-Key” | Nombre del encabezado para la clave de API | 

 **Ejemplo** 

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

 **Credenciales del cliente OAuth** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "OAUTH\_CLIENT\_CREDENTIALS" | 
|  tokenUrl  | cadena |  Sí  | - | URL del punto de conexión del token de OAuth | 
|  clientId  | cadena |  Sí  | - | ID de cliente de OAuth | 
|  clientSecret  | cadena |  Sí  | - | Secreto de cliente de OAuth | 
|  scope  | cadena | No | - | Ámbito de OAuth | 
|  audience  | cadena | No | - | Audiencia de OAuth | 
|  resource  | cadena | No | - | Recurso de OAuth | 
|  tokenApiAuth  | matriz | No | - | Métodos de autenticación de la API del token: BASIC\_AUTH\_HEADER, REQUEST\_BODY | 
|  tokenCacheTtl  | entero | No | 3600 | TTL de caché de token (mínimo 60 segundos) | 

 **Ejemplo** 

```
{
  "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 (Versión 4)** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "SIGV4" | 
|  service  | cadena |  Sí  | Nombre del servicio de AWS (por ejemplo, “execute-api”») | 
|  region  | cadena |  Sí  | AWS región | 
|  roleArn  | cadena |  Sí  | ARN del rol de IAM para la firma | 

 **Ejemplo** 

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

## Aserciones y validación
<a name="assertions-validation"></a>

### Aserciones HTTP
<a name="http-assertions"></a>

 **Aserciones de código de estado** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "STATUS\_CODE" | 
|  operator  | cadena |  Sí  | EQUALS, NOT\_EQUALS, GREATER\_THAN,  LESS\_THAN, IN\_RANGE | 
|  value  | entero | Condicional | Código de estado HTTP (100-599) | 
|  rangeMin  | entero | Condicional | Valor de intervalo mínimo (para IN\_RANGE) | 
|  rangeMax  | entero | Condicional | Valor de intervalo máximo (para IN\_RANGE) | 

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

 **Aserciones de tiempo de respuesta** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RESPONSE\_TIME" | 
|  operator  | cadena |  Sí  | - | LESS\_THAN, GREATER\_THAN, EQUALS | 
|  value  | número |  Sí  | - | Valor de tiempo (mínimo 0) | 
|  unit  | cadena | No | “MILLISECONDS” | Debe ser "MILLISECONDS" | 

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

 **Aserciones de encabezado** 


| Propiedad | Tipo | Obligatorio | Descripción | 
| --- | --- | --- | --- | 
|  type  | string |  Sí  | Debe ser "HEADER" | 
|  headerName  | cadena |  Sí  | Nombre del encabezado que se validará | 
|  operator  | cadena |  Sí  | EQUALS, NOT\_EQUALS, CONTAINS,  NOT\_CONTAINS, REGEX\_MATCH, EXIST | 
|  value  | Cadena o booleano | Condicional | Valor esperado (booleano para el operador EXIST) | 

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

 **Aserciones de cuerpo** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "BODY" | 
|  target  | cadena | No | “JSON” | JSON o TEXT | 
|  path  | cadena | Condicional | - | JSONPath (obligatorio para el destino JSON) | 
|  operator  | cadena |  Sí  | - | CONTAINS, NOT\_CONTAINS, EQUALS,  NOT\_EQUALS, EXISTS | 
|  value  | Cadena o booleano |  Sí  | - | Valor esperado (booleano para el operador EXISTS) | 

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

### Aserciones de DNS
<a name="dns-assertions"></a>

 **Aserciones de valor de registro** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RECORD\_VALUE" | 
|  operator  | cadena |  Sí  | - | EQUALS, NOT\_EQUALS, CONTAINS,  NOT\_CONTAINS, REGEX\_MATCH | 
|  value  | cadena |  Sí  | - | Valor de registro esperado | 

 **Aserciones de recuento de registros** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RECORD\_COUNT" | 
|  operator  | cadena |  Sí  | - | EQUALS, GREATER\_THAN, LESS\_THAN | 
|  value  | entero |  Sí  | ≥ 0 | Recuento esperado (mínimo 0) | 

 **Aserciones autoritarias** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "AUTHORITATIVE" | 
|  value  | booleano |  Sí  | - | Estado autoritario esperado | 

 **Aserciones TTL** 


| Propiedad | Tipo | Obligatorio/a | Range | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "TTL" | 
|  operator  | cadena |  Sí  | - | EQUALS, GREATER\_THAN, LESS\_THAN | 
|  value  | entero |  Sí  | ≥ 0 | TTL esperado (mínimo 0) | 

### Aserciones SSL
<a name="ssl-assertions"></a>

 **Aserciones de expiración de certificados** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\_EXPIRY" | 
|  operator  | cadena |  Sí  | - | GREATER\_THAN, LESS\_THAN | 
|  value  | entero |  Sí  | - | Valor de tiempo (mínimo 0) | 
|  unit  | cadena | No | “DAYS” | DAYS, HOURS | 

 **Aserciones de asunto de certificado** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\_SUBJECT" | 
|  field  | cadena |  Sí  | - | Campo de asunto: CN, O, OU, C, ST, L | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS, REGEX\_MATCH | 
|  value  | cadena |  Sí  | - | Valor de campo esperado | 

 **Aserciones de emisor de certificado** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CERTIFICATE\_ISSUER" | 
|  field  | cadena |  Sí  | - | Campo emisor: CN, O | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS | 
|  value  | cadena |  Sí  | - | Valor de campo esperado | 

### Aserciones TCP
<a name="tcp-assertions"></a>

 **Aserciones de éxito de conexión** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "CONNECTION\_SUCCESSFUL" | 
|  value  | booleano |  Sí  | - | Estado de conexión esperado | 

 **Aserciones de datos de respuesta** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  type  | string |  Sí  | - | Debe ser "RESPONSE\_DATA" | 
|  operator  | cadena |  Sí  | - | CONTAINS, EQUALS, NOT\_CONTAINS,  REGEX\_MATCH, STARTS\_WITH, ENDS\_WITH | 
|  value  | cadena |  Sí  | - | Datos de respuesta esperados | 
|  encoding  | cadena | No | “UTF-8” | UTF-8, ASCII, HEX | 

## Extracción de datos
<a name="data-extraction"></a>

Los extractores permiten capturar datos de las respuestas para usarlos en pasos posteriores o con fines de elaboración de informes.

 **Propiedades de extracción** 


| Propiedad | Tipo | Obligatorio/a | Predeterminado | Descripción | 
| --- | --- | --- | --- | --- | 
|  name  | string |  Sí  | - | Nombre de variable para datos extraídos | 
|  type  | cadena |  Sí  | - | Tipo de extracción: BODY | 
|  path  | cadena | No | - | JSONPath para la extracción de cuerpo | 
|  regex  | cadena | No | - | Patrón de expresión regular | 
|  regexGroup  | entero | No | 0 | Grupo de captura de expresión regular (mínimo 0) | 

 **Validación de nombre de extracción** 
+ Patrón: `^[a-zA-Z][a-zA-Z0-9_]*$`
+ Letra como carácter inicial
+ Pueden contener letras, números y guiones bajos.

**Limitación**: la sustitución no se aplica a los campos del esquema que tengan valores ENUM específicos.

 **Tipos de extracción** 

```
{
  "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}"
    }
  ]
}
```