

# Solución de problemas de instancia de Linux de Amazon EC2 dañada con EC2Rescue
<a name="Linux-Server-EC2Rescue"></a>

EC2Rescue para Linux es una herramienta de código abierto fácil de utilizar que se puede ejecutar en una instancia de Linux de Amazon EC2 para diagnosticar, solucionar y corregir problemas comunes mediante su biblioteca de más de 100 *módulos*. Los módulos son archivos YAML que contienen un script de BASH o Python y los metadatos necesarios.

Entre algunos de los casos de uso generalizados de las instancias de EC2Rescue para Linux se incluyen lo siguientes:
+ Recopilación de registros de syslog y del administrador de paquetes
+ Recopilación de datos de utilización de recursos
+ Diagnóstico y corrección de los parámetros problemáticos del kernel conocidos y los problemas comunes de OpenSSH

**nota**  
El manual de procedimientos `AWSSupport-TroubleshootSSH` de Automatización de AWS Systems Manager instala EC2Rescue para Linux y, luego, utiliza la herramienta para comprobar o intentar solucionar problemas comunes que impiden una conexión a través de SSH a una instancia de Linux. Para obtener más información, consulte [AWSSupport-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html).

Si usa una instancia de Windows, consulte [Solución de problemas de una instancia de Windows de Amazon EC2 dañada con EC2Rescue](Windows-Server-EC2Rescue.md).

**Topics**
+ [Instalación de EC2Rescue](ec2rl_install.md)
+ [Ejecución de comandos de EC2Rescue](ec2rl_working.md)
+ [Desarrollar módulos EC2Rescue](ec2rl_moduledev.md)

# Instalación de EC2Rescue en una instancia de Linux de Amazon EC2
<a name="ec2rl_install"></a>

La herramienta EC2Rescue para Linux se puede instalar en una instancia de Linux Amazon EC2 que responda a los prerrequisitos siguientes.

**Requisitos previos**
+ Sistemas operativos compatibles:
  + Amazon Linux 2
  + Amazon Linux 2016.09\$1
  + SUSE Linux Enterprise Server 12\$1
  + RHEL 7\$1
  + Ubuntu 16.04\$1
+ Requisitos de software:
  + Python 2.7.9\$1 o 3.2\$1

## Instalación de EC2Rescue
<a name="ec2rl-install"></a>

El runbook de `AWSSupport-TroubleshootSSH` instala EC2Rescue para Linux y luego usa la herramienta para comprobar o intentar solucionar problemas comunes que impiden una conexión remota a un equipo Linux a través de SSH. Para obtener más información y para ejecutar esta automatización, consulte [Soporte-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html).

Si su sistema tiene la versión de Python necesaria, puede instalar la compilación estándar. De lo contrario, puede instalar la compilación incluida, la cual lleva una copia mínima de Python.

**Para instalar la compilación estándar**

1. En una instancia de Linux en ejecución, descargue la herramienta [EC2Rescue para Linux](https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz):

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz
   ```

1. (*Opcional*) Verifique la firma de EC2Rescue para el archivo de instalación de Linux. Para obtener más información, consulte [(Opcional) Verificar la firma de EC2Rescue para Linux](#ec2rl_verify).

1. Descargue el archivo hash sha256:

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz.sha256
   ```

1. Compruebe la integridad del archivo tarball:

   ```
   sha256sum -c ec2rl.tgz.sha256
   ```

1. Descomprima el archivo tarball:

   ```
   tar -xzvf ec2rl.tgz
   ```

1. Verifique la instalación enumerando el archivo de ayuda:

   ```
   cd ec2rl-<version_number>
   ./ec2rl help
   ```

**Para instalar la compilación incluida**  
Para ver un enlace a la descarga y la lista de limitaciones, consulte [EC2Rescue para Linux](https://github.com/awslabs/aws-ec2rescue-linux/blob/master/README.md) en github.

## (Opcional) Verificar la firma de EC2Rescue para Linux
<a name="ec2rl_verify"></a>

A continuación se detalla el proceso recomendado para verificar la validez del paquete de EC2Rescue para Linux para los sistemas operativos basados en Linux.

Siempre que descargue una aplicación de Internet, le recomendamos que compruebe la identidad del editor del software y verifique que la aplicación no ha sido alterada ni se ha visto corrompida desde que se publicó. Esto le protege ante una posible instalación de una versión de la aplicación que contenga un virus u otro código malintencionado.

Si después de seguir los pasos descritos en este tema determina que el software del agente de EC2Rescue para Linux ha sido modificado o está dañado, no ejecute el archivo de instalación. En lugar de hacerlo, póngase en contacto con Amazon Web Services.

Los archivos de EC2Rescue para Linux para los sistemas operativos basados en Linux se firman con GnuPG, una implementación de código abierto del estándar Pretty Good Privacy (OpenPGP) para firmas digitales seguras. GnuPG (también conocido como GPG) permite realizar la autenticación y verificar la integridad mediante el uso de una firma digital. AWS publica una clave pública y firmas que pueden utilizarse para comprobar el paquete de EC2Rescue para Linux descargado. Para obtener más información sobre PGP y GnuPG (GPG), consulte [https://www.gnupg.org/](https://www.gnupg.org/).

El primer paso consiste en establecer una relación de confianza con el editor del software. Descargue la clave pública del editor de software, compruebe que el propietario de la clave pública es quien afirma ser y, a continuación, agregue la clave pública a su llavero. Su llavero es una colección de claves públicas conocidas. Tras establecer la autenticidad de la clave pública, puede usarla para verificar la firma de la aplicación.

**Topics**
+ [Autenticar e importar la clave pública](#ec2rl_authenticate)
+ [Verificar la firma del paquete](#ec2rl_verify_signature)

### Autenticar e importar la clave pública
<a name="ec2rl_authenticate"></a>

El siguiente paso del proceso consiste en autenticar la clave pública de EC2Rescue para Linux y agregarla como una clave de confianza al llavero de GPG.

**Para autenticar e importar la clave pública de EC2Rescue para Linux**

1. En un símbolo del sistema, utilice el comando siguiente para obtener una copia de la clave de compilación pública de GPG:

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.key
   ```

1. En un símbolo del sistema, en el directorio donde haya guardado `ec2rl.key`, use el siguiente comando para importar la clave pública de EC2Rescue para Linux en su llavero:

   ```
   gpg2 --import ec2rl.key
   ```

   El comando devuelve resultados similares a los siguientes:

   ```
   gpg: /home/ec2-user/.gnupg/trustdb.gpg: trustdb created
   gpg: key 2FAE2A1C: public key "ec2autodiag@amazon.com <EC2 Rescue for Linux>" imported
   gpg: Total number processed: 1
   gpg:               imported: 1  (RSA: 1)
   ```
**sugerencia**  
Si ve un error que indica que no se encuentra el comando, instale la utilidad de GnuPG con `apt-get install gnupg2` (Linux basado en Debian) o `yum install gnupg2` (Linux basado en Red Hat).

### Verificar la firma del paquete
<a name="ec2rl_verify_signature"></a>

Después de haber instalado las herramientas de GPG, haber autenticado e importado la clave pública de EC2Rescue para Linux y haber comprobado que la clave pública de EC2Rescue para Linux es de confianza, estará listo para verificar la firma del script de instalación de EC2Rescue para Linux.

**Para verificar la firma del script de instalación de EC2Rescue para Linux**

1. En el símbolo del sistema, ejecute el siguiente comando para descargar el archivo de firma para el script de instalación:

   ```
   curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz.sig
   ```

1. Verifique la firma utilizando un símbolo del sistema para ejecutar el siguiente comando en el directorio donde haya guardado `ec2rl.tgz.sig` y el archivo de instalación de EC2Rescue para Linux. Ambos archivos deben estar presentes.

   ```
   gpg2 --verify ./ec2rl.tgz.sig
   ```

   El resultado debería tener un aspecto similar al siguiente:

   ```
   gpg: Signature made Thu 12 Jul 2018 01:57:51 AM UTC using RSA key ID 6991ED45
   gpg: Good signature from "ec2autodiag@amazon.com <EC2 Rescue for Linux>"
   gpg: WARNING: This key is not certified with a trusted signature!
   gpg:          There is no indication that the signature belongs to the owner.
   Primary key fingerprint: E528 BCC9 0DBF 5AFA 0F6C  C36A F780 4843 2FAE 2A1C
        Subkey fingerprint: 966B 0D27 85E9 AEEC 1146  7A9D 8851 1153 6991 ED45
   ```

   Si el resultado contiene la expresión `Good signature from "ec2autodiag@amazon.com <EC2 Rescue for Linux>"`, significa que la firma se ha verificado correctamente y que se puede ejecutar el script de instalación de EC2Rescue para Linux.

   Si el resultado incluye la expresión `BAD signature`, compruebe si ha realizado el procedimiento correctamente. Si sigue recibiendo esta respuesta, póngase en contacto con Amazon Web Services y no ejecute el archivo de instalación descargado anteriormente.

A continuación, se describen en detalle las advertencias que podría recibir:
+ **WARNING: This key is not certified with a trusted signature\$1 There is no indication that the signature belongs to the owner.** Esto afecta a su nivel personal de confianza, ya que no puede tener la certeza de que posee una clave pública auténtica para EC2Rescue para Linux. En un mundo ideal, visitaría una oficina de Amazon Web Services y recibiría la clave en persona. Sin embargo, lo habitual es que la descargue desde un sitio web. En este caso, el sitio web pertenece a Amazon Web Services.
+ **gpg2: no ultimately trusted keys found.** Esto significa que la clave específica no es "definitivamente fiable" para usted (o para otras personas en las que usted confía).

Para obtener más información, consulte [https://www.gnupg.org/](https://www.gnupg.org/).

# Ejecución de comandos de EC2Rescue en una instancia de Linux de Amazon EC2
<a name="ec2rl_working"></a>

EC2Rescue es una herramienta de la línea de comandos. Tras instalar EC2rescue en la instancia de Linux, puede obtener ayuda general sobre cómo utilizar la herramienta mediante la ejecución de `./ec2rl help`. Puede ver los módulos disponibles mediante la ejecución de `./ec2rl list` y puede obtener ayuda sobre un módulo específico mediante la ejecución de `./ec2rl help module_name`.

A continuación se muestran algunas tareas comunes que puede realizar para comenzar a usar esta herramienta.

**Topics**
+ [Ejecución de módulos de EC2Rescue](#ec2rl_running_module)
+ [Carga de los resultados del módulo de EC2Rescue](#ec2rl_uploading_results)
+ [Creación de copias de seguridad de una instancia de Linux de Amazon EC2](#ec2rl_creating_backups)

## Ejecución de módulos de EC2Rescue
<a name="ec2rl_running_module"></a>

**Ejecución de todos los módulos de EC2Rescue**  
Utilice el comando **./ec2rl run** sin especificar ningún otro parámetro. Algunos módulos requieren acceso raíz. Si no es usuario raíz, utilice **sudo** al ejecutar el comando.

```
./ec2rl run
```

**Ejecución de un módulo de EC2Rescue específico**  
Utilice el comando **./ec2rl run**, y para `--only-modules`, especifique el nombre del módulo que desea ejecutar. Algunos módulos requieren *argumentos* para poder usarlos.

```
./ec2rl run --only-modules=module_name --arguments
```

Por ejemplo, para ejecutar el módulo **dig** para consultar el dominio `amazon.com`, utilice el siguiente comando.

```
./ec2rl run --only-modules=dig --domain=amazon.com
```

**Visualización de los resultados de un módulo de EC2Rescue**  
Ejecute el módulo y consulte el archivo de registro en `cat /var/tmp/ec2rl/logfile_location`. Por ejemplo, el archivo de registro del módulo **dig** se encuentra en la siguiente ubicación:

```
cat /var/tmp/ec2rl/timestamp/mod_out/run/dig.log
```

## Carga de los resultados del módulo de EC2Rescue
<a name="ec2rl_uploading_results"></a>

Si Soporte ha solicitado los resultados de un módulo de EC2Rescue, puede cargar el archivo de registro mediante la herramienta de EC2Rescue. Puede cargar los resultados en una ubicación proporcionada por Soporte o en un bucket de Amazon S3 de su propiedad.

**Carga de los resultados en una ubicación proporcionada por Soporte**  
Utilice el comando **./ec2rl upload**. En `--upload-directory`, especifique la ubicación del archivo de registro. En `--support-url`, especifique la dirección URL proporcionada por Soporte.

```
./ec2rl upload --upload-directory=/var/tmp/ec2rl/logfile_location --support-url="url_provided_by_aws_support"
```

**Carga de los resultados en un bucket de Amazon S3**  
Utilice el comando **./ec2rl upload**. En `--upload-directory`, especifique la ubicación del archivo de registro. En `--presigned-url`, especifique una dirección URL prefirmada para el bucket de S3. Para obtener más información acerca de cómo generar URL prefirmadas para Amazon S3, consulte [Carga de objetos con direcciones URL prefirmadas](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html).

```
./ec2rl upload --upload-directory=/var/tmp/ec2rl/logfile_location --presigned-url="presigned_s3_url"
```

## Creación de copias de seguridad de una instancia de Linux de Amazon EC2
<a name="ec2rl_creating_backups"></a>

Puede utilizar EC2Rescue para hacer copias de seguridad de la instancia de Linux mediante la creación de una AMI o la creación de instantáneas de los volúmenes asociados.

**Para crear una AMI**  
Utilice el comando `./ec2rl run` y, en --`backup`, especifique `ami`.

```
./ec2rl run --backup=ami
```

**Creación de instantáneas de varios volúmenes de todos los volúmenes asociados**  
Utilice el comando `./ec2rl run` y, en --`backup`, especifique `allvolumes`.

```
./ec2rl run --backup=allvolumes
```

**Creación de una instantánea de un volumen asociado específico**  
Utilice el comando `./ec2rl run` y, en --`backup`, especifique el identificador del volumen del que se va a hacer la copia de seguridad.

```
./ec2rl run --backup=vol-01234567890abcdef
```

# Desarrollo de módulos de EC2Rescue para instancias de Linux de Amazon EC2
<a name="ec2rl_moduledev"></a>

Los módulos se escriben en YAML, un estándar de serialización de datos. Un archivo YAML de un módulo consta de un único documento que representa el módulo y sus atributos.

## Agregar atributos de módulo
<a name="ec2rl-adding-modules"></a>

En la tabla siguiente se muestran los atributos de módulo disponibles.


| Atributo | Descripción | 
| --- | --- | 
| name (nombre) | Nombre del módulo. El nombre debe tener 18 caracteres o menos de longitud. | 
| version | Número de versión del módulo. | 
| title | Un título breve y descriptivo para el módulo. Este valor debe tener 50 caracteres o menos de longitud. | 
| helptext |  La descripción ampliada del módulo. Cada línea debe tener 75 caracteres o menos de longitud. Si el módulo consume argumentos, requeridos y opcionales, inclúyalos en el valor de helptext. Por ejemplo: <pre>helptext: !!str |<br />  Collect output from ps for system analysis<br />  Consumes --times= for number of times to repeat<br />  Consumes --period= for time period between repetition</pre> | 
| placement | La fase en la que debe ejecutarse el módulo. Valores admitidos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
| language | El lenguaje en que está escrito el código del módulo. Valores admitidos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  El código Python debe ser compatible con Python 2.7.9\$1 y Python 3.2\$1.   | 
| remediation |  Indica si el módulo admite remedio. Los valores admitidos son `True` o `False`. El módulo tomará el valor predeterminado `False` si está ausente, lo que lo convertirá en un atributo opcional para los módulos que no admiten el remedio.  | 
| content | La totalidad del código de script. | 
| constraint | El nombre del objeto que contiene los valores de restricción. | 
| dominio | Un descriptor del modo en que el módulo se agrupa o clasifica. El conjunto de módulos incluidos usa los dominios siguientes:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| class | Un descriptor del tipo de tarea que realiza el módulo. El conjunto de módulos incluidos usa las clases siguientes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| distro | La lista de distribuciones Linux que admite este módulo. El conjunto de módulos incluidos usa las distribuciones siguientes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| obligatorio | Los argumentos requeridos que el módulo usa para las opciones de la CLI. | 
| opcional | Los argumentos opcionales que el módulo puede usar. | 
| software | Los ejecutables de software usados en el módulo. Este atributo tiene como finalidad especificar software que no está instalado de manera predeterminada. La lógica de EC2Rescue para Linux asegura que estos programas sean ejecutables y estén presentes antes de ejecutar el módulo. | 
| package | El paquete de software de origen para un ejecutable. Este atributo tiene como finalidad proporcionar detalles ampliados sobre el paquete con el software, incluida una URL para descargar u obtener más información. | 
| sudo | Indica si se requiere acceso raíz para ejecutar el módulo.  No necesita implementar las comprobaciones sudo en el script del módulo. Si el valor es verdadero, la lógica de EC2Rescue para Linux solo ejecuta el módulo cuando el usuario ejecutante tiene acceso raíz. | 
| perfimpact | Indica si el módulo puede tener un impacto significativo de desempeño en el entorno en que se ejecuta. Si el valor es verdadero y el argumento `--perfimpact=true` no está presente, el módulo se omite. | 
| parallelexclusive | Especifica un programa que requiere exclusividad mutua. Por ejemplo, todos los módulos que especifican "bpf" se ejecutan en serie. | 

## Agregar variables de entorno
<a name="ec2rl_adding_envvars"></a>

En la tabla siguiente se muestran las variables de entorno disponibles.


| Variable de entorno | Descripción | 
| --- | --- | 
|  `EC2RL_CALLPATH`  | La ruta a ec2rl.py. Esta ruta se puede usar para ubicar el directorio lib y usar los módulos de Python proporcionados. | 
|  `EC2RL_WORKDIR`  |  El directorio tmp principal de la herramienta de diagnóstico. Valor predeterminado: `/var/tmp/ec2rl`. | 
|  `EC2RL_RUNDIR`  |  El directorio donde se almacenan todos los resultados. Valor predeterminado: `/var/tmp/ec2rl/<date&timestamp>`.  | 
|  `EC2RL_GATHEREDDIR`  |  El directorio raíz donde se colocan los datos recopilados del módulo. Valor predeterminado:`/var/tmp/ec2rl/<date&timestamp>/mod_out/gathered/`.  | 
|  `EC2RL_NET_DRIVER`  |  El controlador en uso para la primera interfaz de red no virtual en orden alfabético en la instancia. Ejemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_SUDO`  |  Es verdadero si EC2Rescue para Linux se ejecuta como raíz; de lo contrario, es falso.  | 
|  `EC2RL_VIRT_TYPE`  |  El tipo de virtualización según lo proporcionan los metadatos de la instancia. Ejemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_INTERFACES`  |  Una lista numerada de interfaces en el sistema. El valor es una cadena que contiene nombres como `eth0`, `eth1`, etcétera. Se genera mediante `functions.bash` y solo está disponible para los módulos de los que se obtiene.  | 

## Usar sintaxis YAML
<a name="ec2rl_yamlsyntax"></a>

Cuando se construyen los archivos YAML de un módulo, se debe tener en cuenta lo siguiente:
+ Tres guiones (`---`) denotan el inicio explícito de un documento.
+ La etiqueta `!ec2rlcore.module.Module` dice al analizador YAML a qué constructor llamar cuando se crea el objeto del flujo de datos. Encontrará el constructor dentro del archivo `module.py`.
+ La etiqueta `!!str` indica al analizador YAML que no intente determinar el tipo de datos y que interprete el contenido como un literal de cadena.
+ El carácter `|` indica al analizador YAML que el valor es un escalar de estilo literal. En este caso, el analizador incluye todos los espacios en blanco. Esto es importante para los módulos porque se mantienen la sangría y los caracteres de nueva línea.
+ La sangría estándar de YAML son dos espacios, como se puede ver en los ejemplos siguientes. Asegúrese de que mantiene la sangría estándar (por ejemplo, cuatro espacios para Python) para el script y después sangría de dos espacios para todo el contenido en el archivo del módulo.

## Módulos de ejemplo
<a name="ec2rl_example"></a>

Ejemplo uno (`mod.d/ps.yaml`):

```
--- !ec2rlcore.module.Module
# Module document. Translates directly into an almost-complete Module object
name: !!str ps
path: !!str
version: !!str 1.0
title: !!str Collect output from ps for system analysis
helptext: !!str |
  Collect output from ps for system analysis
  Requires --times= for number of times to repeat
  Requires --period= for time period between repetition
placement: !!str run
package: 
  - !!str
language: !!str bash
content: !!str |
  #!/bin/bash
  error_trap()
  {
      printf "%0.s=" {1..80}
      echo -e "\nERROR:	"$BASH_COMMAND" exited with an error on line ${BASH_LINENO[0]}"
      exit 0
  }
  trap error_trap ERR

  # read-in shared function
  source functions.bash
  echo "I will collect ps output from this $EC2RL_DISTRO box for $times times every $period seconds."
  for i in $(seq 1 $times); do
      ps auxww
      sleep $period
  done
constraint:
  requires_ec2: !!str False
  domain: !!str performance
  class: !!str collect
  distro: !!str alami ubuntu rhel suse
  required: !!str period times
  optional: !!str
  software: !!str
  sudo: !!str False
  perfimpact: !!str False
  parallelexclusive: !!str
```