Executar comandos na instância do Linux na execução - Amazon Elastic Compute Cloud

Executar comandos na instância do Linux na execução

Ao executar uma instância no Amazon EC2, você tem a opção de passar dados de usuário para a instância que podem ser usados para realizar tarefas de configuração comuns automatizadas e até mesmo executar scripts após a inicialização da instância. Você pode passar dois tipos de dados de usuário para o Amazon EC2: scripts de shell e diretivas de cloud-init. Você também pode passar esses dados para o assistente de inicialização como texto simples, como arquivo (isso é útil para executar instâncias usando ferramentas de linha de comando) ou como texto codificado em base64 (para chamadas à API).

Se você estiver interessado em cenários de automação mais complexos, considere usar AWS CloudFormation e AWS OpsWorks. Para obter mais informações, consulte o Guia do usuário do AWS CloudFormation e o AWS OpsWorks User Guide.

Para obter informações sobre a execução de comandos na instância do Windows durante a inicialização, consulte Execução de comandos na sua instância Windows na inicialização e Gerenciamento da configuração de instâncias Windows no Guia do usuário do Amazon EC2 para instâncias do Windows.

Nos exemplos a seguir, os comandos de Instalar um servidor web LAMP no ​Amazon Linux 2 são convertidos em um script de shell e um conjunto de diretivas cloud-init que é executado quando a instância é executada. Em cada exemplo, as seguintes tarefas são executadas pelos dados de usuário:

  • Os pacotes de distribuição de software são atualizados.

  • O servidor web necessário, php, e os pacotes mariadb são instalados.

  • O serviço httpd é iniciado e ativado por systemctl.

  • O security group ec2-user é adicionado ao grupo apache.

  • As permissões de propriedade e de arquivos apropriadas são definidas para o diretório web e os arquivos contidos nele.

  • Uma página web simples é criada para testar o servidor web e o mecanismo de PHP.

Pré-requisitos

Os seguintes exemplos supõem que sua instância tem um nome DNS público que é acessível pela Internet. Para obter mais informações, consulte Etapa 1: executar uma instância. Você também precisa configurar o security group para permitir conexões SSH (porta 22), HTTP (porta 80) e HTTPS (porta 443). Para obter mais informações sobre esses pré-requisitos, consulte Configuração com o Amazon EC2.

Além disso, essas instruções servem ao Amazon Linux 2, e os comandos e as diretivas podem não funcionar para outras distribuições do Linux. Para obter mais informações sobre outras distribuições, como suporte para cloud-init, consulte a documentação específica.

Dados de usuário e scripts de shell

Se você estiver familiarizado com scripts de shell, esta é a maneira mais fácil e completa de enviar instruções para uma instância na execução. Se você adicionar essas tarefas no momento da inicialização, será necessário mais tempo para iniciar a instância. Você deve reservar alguns minutos extras para que as tarefas sejam concluídas antes de testar se o script de usuário foi concluído com êxito.

Importante

Por padrão, os scripts de dados de usuário e as diretivas de cloud-init são executados somente durante o primeiro ciclo de inicialização quando você executar uma instância. Você pode atualizar sua configuração para garantir que seus scripts de dados de usuário e diretivas de cloud-init sejam executados sempre que você reiniciar a instância. Para obter mais informações, consulte Como eu posso executar dados do usuário sempre que reiniciar minha instância do EC2? no AWS Knowledge Center.

Os scripts de shell de dados de usuário devem ser iniciados pelos caracteres #! e pelo caminho para o intérprete que você deseja que leia o script (geralmente /bin/bash). Para ter uma ótima introdução a scripts de shell, consulte o Manual de Programação BASH no Projeto de Documentação do Linux (tldp.org).

Os scripts inseridos como dados de usuário são executados como o usuário root, então, não use o comando sudo no script. Lembre-se de que todos os arquivos que você criar serão de propriedade de root. Caso precise que usuários não raiz tenham acesso aos arquivos, modifique as permissões em conformidade com o script. Além disso, como o script não é executado interativamente, você não pode incluir os comandos que exigem feedback do usuário (como yum update sem o sinalizador -y).

O arquivo de log de saída de cloud-init (/var/log/cloud-init-output.log) captura a saída do console para facilitar a depuração de seus scripts após uma execução se a instância não se comportar da maneira desejada.

Quando um script de dados do usuário é processado, ele é copiado para /var/lib/cloud/instances/instance-id/ e executado a partir desse diretório. O script não é excluído depois de ser executado. Certifique-se de excluir os scripts de dados do usuário de /var/lib/cloud/instances/instance-id/ antes de criar uma AMI a partir da instância. Caso contrário, o script existirá nesse diretório em qualquer instância iniciada na AMI.

Dados do usuário e console

Você pode especificar os dados do usuário da instância ao executar uma instância. Se o volume raiz da instância for um volume do EBS, também é possível parar a instância e atualizar os dados de usuário.

Especificar os dados do usuário da instância na inicialização

Siga o procedimento para executar uma instância em Executar uma instância usando o assistente de execução de instância, mas, ao acessar Etapa 3: configurar detalhes da instância nesse procedimento, copie o script de shell no campo User data (Dados do usuário) e conclua o procedimento de execução.

No script de exemplo abaixo, o script cria e configura nosso servidor web.

#!/bin/bash yum update -y amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2 yum install -y httpd mariadb-server systemctl start httpd systemctl enable httpd usermod -a -G apache ec2-user chown -R ec2-user:apache /var/www chmod 2775 /var/www find /var/www -type d -exec chmod 2775 {} \; find /var/www -type f -exec chmod 0664 {} \; echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

Reserve tempo suficiente para executar a instância e execute os comandos do script. Depois, verifique para saber se o script concluiu as tarefas pretendidas.

Em nosso exemplo, em um navegador web, insira o URL do arquivo de teste PHP criado pelo script. Essa URL é o endereço DNS público da instância seguido por uma barra e o nome do arquivo.

http://my.public.dns.amazonaws.com/phpinfo.php

Você deve consultar a página de informações do PHP. Caso não seja possível visualizar a página de informações do PHP, verifique se o security group que você está usando contém uma regra para permitir tráfego HTTP (porta 80). Para obter mais informações, consulte Adicionar regras a um grupo de segurança.

(Opcional) Se o script não tiver realizado as tarefas você esperava ou se você apenas quiser verificar se o script foi concluído sem erros, examine o arquivo de log de saída de cloud-init em /var/log/cloud-init-output.log e procure mensagens de erro na saída.

Para informações adicionais de depuração, você pode criar um arquivo multiparte Mime que inclua uma seção de dados de cloud-init com a seguinte diretiva:

output : { all : '| tee -a /var/log/cloud-init-output.log' }

Essa diretiva envia a saída do comando do script para /var/log/cloud-init-output.log. Para obter mais informações sobre os formatos de dados de cloud-init e a criação de arquivos multiparte Mime, consulte Formatos de cloud-init.

Visualizar e atualizar os dados do usuário da instância

Para modificar os dados do usuário da instância

  1. Abra o console do Amazon EC2 em https://console.aws.amazon.com/ec2/.

  2. No painel de navegação, escolha Instances (Instâncias).

  3. Selecione a instância e escolha Actions, Instance State e Stop.

    Atenção

    Quando você interrompe uma instância, os dados em todos os volumes de armazenamento de instâncias são apagados. Para manter dados de volumes do armazenamento de instâncias, certifique-se de fazer backup deles em um armazenamento persistente.

  4. Quando solicitado a confirmar, escolha Yes, Stop. Pode demorar alguns minutos para que a instância pare.

  5. Com a instância ainda selecionada, escolha Actions (Ações), Instance Settings (Configurações de instância), View/Change User Data (Visualizar/alterar dados de usuário). Não é possível alterar os dados do usuário se a instância estiver em execução, mas é possível visualizá-la.

  6. Na caixa de diálogo Visualizar/alterar dados do usuário, atualize os dados do usuário e escolha Salvar.

  7. Reinicie a instância. Os novos dados do usuário ficam visíveis na instância depois que você reiniciá-la. Contudo, os dados do usuário não são executados.

Diretivas de cloud-init e dados de usuário

O pacote de cloud-init configura aspectos específicos de uma nova instância do Amazon Linux quando ela é executada. Em particular, ele configura o arquivo .ssh/authorized_keys para o usuário ec2 para que você possa se conectar com sua própria chave privada. Para obter mais informações, consulte cloud-init.

As diretivas de cloud-init podem ser passadas a uma instância em execução da mesma forma que um script é passado, embora a sintaxe seja diferente. Para obter mais informações sobre cloud-init, acesse http://cloudinit.readthedocs.org/en/latest/index.html.

Importante

Por padrão, os scripts de dados de usuário e as diretivas de cloud-init são executados somente durante o primeiro ciclo de inicialização quando você executar uma instância. Você pode atualizar sua configuração para garantir que seus scripts de dados de usuário e diretivas de cloud-init sejam executados sempre que você reiniciar a instância. Para obter mais informações, consulte Como eu posso executar dados do usuário sempre que reiniciar minha instância do EC2? no AWS Knowledge Center.

Se você adicionar essas tarefas no momento da inicialização, será necessário mais tempo para iniciar uma instância. Você deve reservar alguns minutos extras para que as tarefas sejam concluídas antes de testar se as diretivas de dados de usuário foram concluídas.

Para passar diretivas de cloud-init para uma instância com dados de usuário

  1. Siga o procedimento para executar uma instância em Executar uma instância usando o assistente de execução de instância, mas, ao acessar Etapa 3: configurar detalhes da instância nesse procedimento, insira o texto da diretiva de cloud-init no campo User data (Dados do usuário) e conclua o procedimento de execução.

    No exemplo a seguir, as diretivas criam e configuram um servidor web no Amazon Linux 2. A linha #cloud-config na parte superior é necessária para identificar os comandos como diretrizes cloud-init.

    #cloud-config repo_update: true repo_upgrade: all packages: - httpd - mariadb-server runcmd: - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ] - systemctl start httpd - sudo systemctl enable httpd - [ sh, -c, "usermod -a -G apache ec2-user" ] - [ sh, -c, "chown -R ec2-user:apache /var/www" ] - chmod 2775 /var/www - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ] - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ] - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
  2. Reserve tempo suficiente para que a instância seja executada e execute as diretivas nos dados de usuário. Depois, verifique para saber se as diretivas concluíram as tarefas pretendidas.

    Em nosso exemplo, em um navegador web, insira a URL do arquivo de teste PHP criado pelas diretivas. Essa URL é o endereço DNS público da instância seguido por uma barra e o nome do arquivo.

    http://my.public.dns.amazonaws.com/phpinfo.php

    Você deve consultar a página de informações do PHP. Caso não seja possível visualizar a página de informações do PHP, verifique se o security group que você está usando contém uma regra para permitir tráfego HTTP (porta 80). Para obter mais informações, consulte Adicionar regras a um grupo de segurança.

  3. (Opcional) Se as diretivas não tiverem realizado as tarefas que você esperava ou se você apenas quiser verificar se as diretivas foram concluídas sem erros, examine o arquivo de log de saída em /var/log/cloud-init-output.log e procure mensagens de erro na saída. Para informações adicionais de depuração, você pode adicionar a seguinte linha às diretivas:

    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    Essa diretiva orientadora envia a saída runcmd para /var/log/cloud-init-output.log.

Dados do usuário e a AWS CLI

Você pode usar AWS CLI para especificar, modificar e ver os dados do usuário para sua instância. Para obter informações sobre como visualizar os dados do usuário da sua instância usando metadados de instância, consulte Recuperar os dados do usuário da instância.

No Windows, você pode usar o AWS Tools para Windows PowerShell em vez de usar a AWS CLI. Para obter mais informações, consulte Dados do usuário e Tools para Windows PowerShell no Guia do usuário do Amazon EC2 para instâncias do Windows.

Exemplo: especificar dados do usuário na execução

Para especificar dados de usuário ao executar a instância, use o comando run-instances com o parâmetro --user-data. Com run-instances, a AWS CLI executa codificação de base64 dos dados de usuário para você.

O exemplo a seguir mostra como especificar um script como uma string na linha de comando:

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data echo user data

O exemplo a seguir mostra como especificar um script usando um arquivo de texto. Certifique-se de usar o prefixo file:// para especificar o arquivo.

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data file://my_script.txt

A seguir, temos um exemplo de arquivo de texto com um script de shell.

#!/bin/bash yum update -y service httpd start chkconfig httpd on

Exemplo: modificar os dados do usuário de uma instância interrompida

Você pode modificar os dados de usuário de uma instância interrompida usando o comando modify-instance-attribute. Com modify-instance-attribute, a AWS CLI não executa a codificação de base64 dos dados de usuário para você.

  • Em um computador Linux, use o comando base64 para codificar os dados de usuário.

    base64 my_script.txt >my_script_base64.txt
  • Em um computador Windows, use o comando certutil para codificar os dados de usuário. Para poder usar esse arquivo com a AWS CLI, você deve remover as primeiras (INICIAR CERTIFICADO) e últimas (ENCERRAR CERTIFICADO) linhas.

    certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt

Use os parâmetros --attribute e --value para usar o arquivo de texto codificado para especificar os dados de usuário. Certifique-se de usar o prefixo file:// para especificar o arquivo.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt

Exemplo: limpar os dados do usuário de uma instância interrompida

Para excluir os dados do usuário existentes, use o comando modify-instance-attribute da seguinte maneira:

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=

Exemplo: visualizar dados do usuário

Para recuperar os dados de usuário de uma instância, use o comando describe-instance-attribute. Com describe-instance-attribute, a AWS CLI não executa a decodificação de base64 dos dados de usuário para você.

aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData

Esta é uma saída de exemplo com dados de usuário com codificação base64.

{ "UserData": { "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg==" }, "InstanceId": "i-1234567890abcdef0" }
  • Em um computador Linux, use a opção --query para obter os dados de usuário codificados e o comando base64 para descodificá-los.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  • Em um computador Windows, use a opção --query para obter os dados de usuário codificados e o comando certutil para descodificá-los. Observe que a saída codificada está armazenada em um arquivo e a saída descodificada está armazenada em outro arquivo.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt certutil -decode my_output.txt my_output_decoded.txt type my_output_decoded.txt

A seguir está um exemplo de saída.

#!/bin/bash yum update -y service httpd start chkconfig httpd on