

# Solucionar problemas de instâncias danificadas do Amazon EC2 no Linux usando o EC2Rescue
<a name="Linux-Server-EC2Rescue"></a>

O EC2Rescue para Linux é uma ferramenta de código aberto fácil de usar que pode ser executada em uma instância do Amazon EC2 no Linux para diagnosticar e corrigir problemas comuns usando sua biblioteca de mais de cem *módulos*. Os módulos são arquivos YAML que contêm um script BASH ou Python e os metadados necessários.

Alguns casos de uso generalizados para instâncias do EC2Rescue para Linux incluem:
+ Como coletar logs do syslog e do gerenciador de pacotes
+ Como coletar dados de utilização de recursos
+ Diagnosticar e corrigir parâmetros problemáticos conhecidos do kernel e problemas comuns do OpenSSH

**nota**  
O runbook `AWSSupport-TroubleshootSSH` do AWS Systems Manager Automation instala o EC2Rescue para Linux e, em seguida, usa a ferramenta para verificar ou tentar corrigir problemas comuns que impedem uma conexão SSH a uma instância do Linux. Para obter mais informações, consulte [AWSSupport-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html).

Se você estiver usando uma instância do Windows, consulte [Solucionar problemas de uma instância Amazon EC2 Windows danificada usando o EC2Rescue](Windows-Server-EC2Rescue.md).

**Topics**
+ [Instalar o EC2Rescue](ec2rl_install.md)
+ [Executar comandos do EC2Rescue](ec2rl_working.md)
+ [Desenvolver módulos do EC2Rescue](ec2rl_moduledev.md)

# Instalar o EC2Rescue para uma instância do Amazon EC2 no Linux
<a name="ec2rl_install"></a>

A ferramenta EC2Rescue para Linux pode ser instalada em uma instância Linux do Amazon EC2 que atenda aos seguintes pré-requisitos.

**Pré-requisitos**
+ Sistemas operacionais com suporte:
  + 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 ou 3.2\$1

## Instalar o EC2Rescue
<a name="ec2rl-install"></a>

O runbook `AWSSupport-TroubleshootSSH` instala oEC2Rescue para Linux e, em seguida, usa a ferramenta para verificar ou tentar corrigir problemas comuns que impedem uma conexão remota a uma máquina Linux via SSH. Para obter mais informações e para executar essa automação, consulte [Suporte-TroubleshootSSH](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshootssh.html).

Se o seu sistema tem a versão necessária do Python, você pode instalar a compilação padrão. Caso contrário, você pode instalar a compilação do pacote, incluindo uma cópia mínima do Python.

**Para instalar a compilação padrão**

1. Em uma instância Linux de trabalho, faça download da ferramenta [EC2Rescue para Linux](https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz):

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

1. (*Opcional*) Verifique a assinatura do arquivo de instalação do EC2Rescue para Linux. Para obter mais informações, consulte [(Opcional) Verifique a assinatura de EC2Rescue para Linux](#ec2rl_verify).

1. Faça download do arquivo hash sha256:

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

1. Verifique a integridade do tarball:

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

1. Desembale o tarball:

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

1. Verifique instalação listando o arquivo de ajuda:

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

**Para instalar a compilação do pacote**  
Para obter um link para download e uma lista de limitações, consulte [EC2Rescue para Linux](https://github.com/awslabs/aws-ec2rescue-linux/blob/master/README.md) no GitHub.

## (Opcional) Verifique a assinatura de EC2Rescue para Linux
<a name="ec2rl_verify"></a>

Veja a seguir o processo recomendado para verificação da validade do pacote do EC2Rescue para Linux para sistemas operacionais Linux.

Sempre que baixar um aplicativo da Internet, recomendamos que você autentique a identidade do fornecedor do software e verifique se o aplicativo não foi alterado ou corrompido desde que foi publicado. Isso protege você contra a instalação de uma versão do aplicativo que contenha um vírus ou outro código mal-intencionado.

Se depois de executar as etapas neste tópico, você determinar que o software do EC2Rescue para Linux está alterado ou corrompido, não execute o arquivo de instalação. Em vez disso, entre em contato com o Amazon Web Services.

Os arquivos do EC2Rescue para Linux para os sistemas operacionais baseados em Linux são assinados usando o GnuPG, uma implementação de código aberto do padrão OpenPGP (Pretty Good Privacy) para assinaturas digitais seguras. O GnuPG (também conhecido como GPG) fornece autenticação e verificação de integridade por meio de uma assinatura digital. A AWS publica uma chave pública e assinaturas que você pode usar para verificar o pacote EC2Rescue para Linux que foi obtido por download. Para obter mais informações sobre o PGP e o GnuPG (GPG), consulte [https://www.gnupg.org/](https://www.gnupg.org/).

A primeira etapa é estabelecer confiança com o fornecedor do software. Faça download da chave pública do fornecedor do software, verifique se o proprietário da chave pública é quem afirma ser e, em seguida, adicione a chave pública ao seu keyring. O keyring é um conjunto de chaves públicas conhecidas. Após estabelecer a autenticidade da chave pública, você pode usá-la para verificar a assinatura do aplicativo.

**Topics**
+ [Autenticar e importar a chave pública](#ec2rl_authenticate)
+ [Verificar a assinatura do pacote](#ec2rl_verify_signature)

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

A próxima etapa do processo é autenticar a chave pública do EC2Rescue para Linux e adicioná-la como uma chave confiável ao seu keyring do GPG.

**Para autenticar e importar a chave pública do EC2Rescue para Linux**

1. Em um prompt de comando, use o seguinte comando para obter uma cópia de nossa chave de compilação de público GPG:

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

1. Em um prompt de comando no diretório onde você salvou `ec2rl.key`, use o comando a seguir para importar a chave pública do EC2Rescue para Linux para seu keyring:

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

   O comando retorna resultados semelhantes a:

   ```
   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)
   ```
**dica**  
Se você vir um erro informando que o comando não pôde ser encontrado, instale o utilitário GnuPG com `apt-get install gnupg2` (Linux baseado em Debian) ou `yum install gnupg2` (Linux baseado em Red Hat).

### Verificar a assinatura do pacote
<a name="ec2rl_verify_signature"></a>

Depois de instalar as ferramentas do GPG, autenticar e importar a chave pública do EC2Rescue para Linux e verificar se a chave pública do EC2Rescue para Linux é confiável, você estará pronto para verificar a assinatura do script de instalação do EC2Rescue para Linux.

**Para verificar o script de instalação da assinatura do EC2Rescue para Linux**

1. Em um prompt de comando, execute o comando a seguir para baixar o arquivo de assinatura para o script de instalação:

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

1. Verifique a assinatura executando o comando a seguir em um prompt no diretório onde você salvou o `ec2rl.tgz.sig` e o arquivo de instalação EC2Rescue para Linux. Ambos os arquivos devem estar presentes.

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

   A saída deve parecer com algo semelhante ao seguinte:

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

   Se a saída contém a frase `Good signature from "ec2autodiag@amazon.com <EC2 Rescue for Linux>"`, isso significa que a assinatura foi confirmada com êxito e você pode dar continuidade à execução do script de instalação do EC2Rescue para Linux.

   Se a saída inclui a frase `BAD signature`, verifique se você executou o procedimento corretamente. Se você continuar a receber essa resposta, entre em contato com o Amazon Web Services e não execute o arquivo de instalação que baixou anteriormente.

Veja a seguir os detalhes sobre as advertências que talvez sejam exibidas:
+ **WARNING: This key is not certified with a trusted signature\$1 There is no indication that the signature belongs to the owner.** Isso se refere ao seu nível pessoal de confiança de que você tem uma chave pública autêntica para o EC2Rescue para Linux. A situação ideal seria você visitar um escritório do Amazon Web Services e receber uma chave em pessoa. No entanto, é mais frequente você baixá-la de um site. Nesse caso, o site é um Amazon Web Services.
+ **gpg2: no ultimately trusted keys found.** Isso significa que a chave específica não é "essencialmente confiável" (por você ou por outras pessoas que você confia).

Para obter mais informações, consulte [https://www.gnupg.org/](https://www.gnupg.org/).

# Executar comandos do EC2Rescue em uma instância do Amazon EC2 no Linux
<a name="ec2rl_working"></a>

O EC2Rescue é uma ferramenta de linha de comandos. Depois de instalar o EC2Rescue em sua instância do Linux, você pode obter ajuda geral sobre como usar a ferramenta executando `./ec2rl help`. Você pode visualizar os módulos disponíveis executando `./ec2rl list` e obter ajuda sobre um módulo específico executando `./ec2rl help module_name`.

Veja a seguir as tarefas comuns que você pode realizar para começar a usar essa ferramenta.

**Topics**
+ [Executar módulos do EC2Rescue](#ec2rl_running_module)
+ [Fazer upload dos resultados do módulo do EC2Rescue](#ec2rl_uploading_results)
+ [Criar backups de uma instância do Amazon EC2 no Linux](#ec2rl_creating_backups)

## Executar módulos do EC2Rescue
<a name="ec2rl_running_module"></a>

**Para executar todos os módulos do EC2Rescue**  
Use o comando **./ec2rl run** sem especificar nenhum parâmetro adicional. Alguns módulos exigem o acesso raiz. Se você não for um usuário-raiz, use **sudo** ao executar o comando.

```
./ec2rl run
```

**Para executar um módulo específico do EC2Rescue**  
Use o comando **./ec2rl run**, e para `--only-modules`, especifique o nome do módulo a ser executado. Alguns módulos exigem *argumentos* para usá-los.

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

Por exemplo, para executar o módulo **dig** para consultar o domínio `amazon.com`, use o comando a seguir.

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

**Para exibir os resultados de um módulo do EC2Rescue**  
Execute o módulo e, em seguida, exiba o arquivo de log em `cat /var/tmp/ec2rl/logfile_location`. Por exemplo, o arquivo de log do módulo **dig** pode ser encontrado no seguinte local:

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

## Fazer upload dos resultados do módulo do EC2Rescue
<a name="ec2rl_uploading_results"></a>

Se o Suporte tiver solicitado os resultados de um módulo do EC2Rescue, você pode fazer o upload do arquivo de log usando a ferramenta do EC2Rescue. Você pode fazer o upload dos resultados em um local fornecido pelo Suporte ou em um bucket do Amazon S3 que você possui.

**Para fazer o upload dos resultados em um local fornecido pelo Suporte**  
Use o comando **./ec2rl upload**. Para `--upload-directory`, especifique o local do arquivo de log. Para `--support-url`, especifique o URL fornecido pelo Suporte.

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

**Para fazer o upload dos resultados em um bucket do Amazon S3**  
Use o comando **./ec2rl upload**. Para `--upload-directory`, especifique o local do arquivo de log. Para `--presigned-url`, especifique um URL pré-assinado para o bucket do S3. Para obter mais informações sobre como gerar pre-signed URLs para o Amazon S3, consulte [Fazer upload de objetos usando pre-signed URLs](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html).

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

## Criar backups de uma instância do Amazon EC2 no Linux
<a name="ec2rl_creating_backups"></a>

Você pode usar o EC2Rescue para fazer backup da sua instância do Linux criando uma AMI ou criando snapshots dos volumes anexados.

**Criar uma AMI**  
Use o comando `./ec2rl run`, e para --`backup`, especifique `ami`.

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

**Para criar snapshots multivolume de todos os volumes anexados**  
Use o comando `./ec2rl run`, e para --`backup`, especifique `allvolumes`.

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

**Para criar um snapshot de um volume anexado específico**  
Use o comando `./ec2rl run`, e para --`backup`, especifique o ID do volume para backup.

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

# Desenvolver módulos do EC2Rescue para instâncias do Amazon EC2 no Linux
<a name="ec2rl_moduledev"></a>

Os módulos são gravados em YAML, um padrão de serialização de dados. O arquivo YAML de um módulo consiste em um único documento, representando o módulo e seus atributos.

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

A tabela a seguir lista os atributos de módulo disponíveis.


| Atributo | Descrição | 
| --- | --- | 
| name | O nome do módulo. O nome precisa ter 18 caracteres ou menos. | 
| versão | O número da versão do módulo. | 
| title | Um título curto e descritivo para o módulo. Esse valor precisa ter 50 caracteres ou menos. | 
| helptext |  A descrição estendida do módulo. Cada linha precisa ter 75 caracteres ou menos. Se o módulo utilizar argumentos, obrigatórios ou opcionais, inclua-os no valor helptext. Por exemplo: <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> | 
| posicionamento | O estágio no qual o módulo deve ser executado. Valores com suporte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
| linguagem | A linguagem em que o código do módulo está escrito. Valores com suporte: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  O código Python deve ser compatível com o Python 2.7.9\$1 e o Python 3.2\$1.   | 
| correção |  Indica se o módulo dá suporte a correão. Os valores compatíveis são `True` ou `False`. Os padrões do módulo de `False` se estiver ausente, tornando-o um atributo opcional para esses módulos que não dão suporte a correção.  | 
| conteúdo | A totalidade do código do script. | 
| restrição | O nome do objeto que contém os valores de limite. | 
| domínio | Um descritor de como o módulo é agrupado ou classificado. O conjunto de módulos incluídos usa os seguintes domínios:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| classe | Um descritor do tipo da tarefa executada pelo módulo. O conjunto de módulos incluídos usa as seguintes classes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| distro | A lista de distribuições Linux às quais esse módulo oferece suporte. O conjunto de módulos usa as seguintes distribuições: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| obrigatório | Os argumentos necessários que o módulo está consumindo das opções de CLI. | 
| opcional | Os argumentos opcionais que o módulo pode usar. | 
| software | Os executáveis de software usados no módulo. Esse atributo deve especificar o software que não é instalado por padrão. A lógica do EC2Rescue para Linux garante que esses programas estejam presentes e executáveis antes de executar o módulo. | 
| pacote | O pacote de software de origem para um executável. Esse atributo deve fornecer detalhes estendidos sobre o pacote com o software, incluindo uma URL para fazer download ou obter mais informações. | 
| sudo | Indica se o acesso raiz é necessário para executar o módulo.  Não é necessário implementar verificações sudo no script do módulo. Se o valor for verdadeiro, a lógica do EC2Rescue para Linux só executará o módulo quando o usuário que estiver executando tiver acesso raiz. | 
| perfimpact | Indica se o módulo pode ter impacto significativo no desempenho no ambiente no qual ele está sendo execução. Se o valor for verdadeiro e o argumento `--perfimpact=true` não estiver presente, o módulo será ignorado. | 
| parallelexclusive | Especifica um programa que exija exclusividade mútua. Por exemplo, todos os módulos que especificam "bpf" executados de maneira serial. | 

## Adicionar variáveis de ambiente
<a name="ec2rl_adding_envvars"></a>

A tabela a seguir lista as variáveis de ambiente disponíveis.


| Variável de ambiente | Descrição | 
| --- | --- | 
|  `EC2RL_CALLPATH`  | O caminho para ec2rl.py. Esse caminho pode ser usado para encontrar o diretório lib e utilizar os módulos Python do fornecedor. | 
|  `EC2RL_WORKDIR`  |  O diretório tmp principal para a ferramenta de diagnóstico. Valor padrão: `/var/tmp/ec2rl`. | 
|  `EC2RL_RUNDIR`  |  O diretório no qual a saída é armazenada. Valor padrão: `/var/tmp/ec2rl/<date&timestamp>`.  | 
|  `EC2RL_GATHEREDDIR`  |  O diretório raiz para colocar os dados de módulo reunidos. Valor padrão:`/var/tmp/ec2rl/<date&timestamp>/mod_out/gathered/`.  | 
|  `EC2RL_NET_DRIVER`  |  O driver em uso na primeira interface de rede não virtual, ordenada alfabeticamente, na instância. Exemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_SUDO`  |  Verdadeiro se EC2Rescue para Linux estiver em execução como raiz; caso contrário, falso.  | 
|  `EC2RL_VIRT_TYPE`  |  O tipo de virtualização conforme fornecido pelos metadados da instância. Exemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_INTERFACES`  |  Uma lista enumerada de interfaces no sistema. O valor é uma string que contém nomes, como `eth0``eth1`, etc. É gerada pelo `functions.bash` e está disponível somente para os módulos que a originaram.  | 

## Usar sintaxe de YAML
<a name="ec2rl_yamlsyntax"></a>

Os seguintes itens devem ser observados ao construir os arquivos YAML do módulo:
+ O hífen triplo (`---`) denota o início explícito de um documento.
+ A tag `!ec2rlcore.module.Module` indica para o analisador YAML qual construtor chamar ao criar o objeto do fluxo de dados. Você pode localizar o construtor no arquivo `module.py`.
+ A tag `!!str` diz para o analisador YAML não tentar determinar o tipo de dados e, em vez disso, interpretar o conteúdo como um literal de string.
+ O caractere pipe (`|`) informa ao analisador YAML que o valor é um escalar de estilo literal. Nesse caso, o analisador inclui todos os espaços em branco. É importante para os módulos porque o recuo e os caracteres de nova linha são mantidos.
+ O recuo padrão YAML é dois espaços, que podem ser vistos nos exemplos a seguir. Certifique-se de manter o recuo padrão (por exemplo, quatro espaços para Python) para o script e, em seguida, defina o recuo de dois espaços para todo o conteúdo no arquivo do módulo.

## Exemplos de módulos
<a name="ec2rl_example"></a>

Exemplo 1 (`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
```