Como executar um script ou comando na instância do EC2 via AWS CLI?

12

De acordo com o artigo de notícias Novo comando de execução do EC2 , a AWS CLI deve oferecer suporte a um novo subcomando para executar scripts em instâncias remotas do EC2.

No entanto, fiz o check-in aws ec2 help, mas não consigo encontrar o comando relevante.

Eu instalei awsvia apt-get:

$ aws --version
aws-cli/1.14.32 Python/3.5.4 Linux/4.12.7-64 botocore/1.8.36

Qual subcomando devo procurar e qual é a sintaxe a ser executada, digamos ipconfigno PowerShell na instância remota do EC2?

kenorb
fonte
1
Para sua informação, esse artigo é de 2015, portanto não o chamaria de "novo" subcomando. Fiz o check-out do repositório de código-fonte ( github.com/aws/aws-cli ) para o aws-cli e não encontrei nenhuma menção a ele nos documentos, exemplos, notas de versão ou através de uma breve olhada no código . Arquivei um problema ( github.com/aws/aws-cli/issues/3126 ) e enviarei uma resposta quando receber feedback.
PrestonM

Respostas:

10

Para executar o ipconfig no comando Executar do AWS Systems Manager:

$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --instance-ids "<your instance id>" --parameters commands=ipconfig

Nota: Se você encontrou o erro, considere especificar o correto --region.

Isso pressupõe que você tenha suas credenciais e CLI da AWS configuradas corretamente. Consulte o passo a passo do comando Executar do Gerenciador de Sistemas usando a CLI da AWS para obter mais informações.


Aqui está o exemplo prático do comando shell de envio e obtenção da saída do comando:

cmdid=$(aws ssm send-command --instance-ids "i-ch3ng3th1s" --document-name "AWS-RunPowerShellScript" --parameters commands=ipconfig --query "Command.CommandId" --output text)
aws ssm list-command-invocations --command-id "$cmdid" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text
swysocki
fonte
3

Aqui está um script Bash auxiliar que usa aws ssm send-commandpara executar os comandos:

#/usr/bin/env bash -x
# Script to run PowerShell script on the Windows instance.
instanceId="$1"
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands="'${@:2}'")
[ $? -ne 0 ] && { echo "Usage: $0 instance_id command"; exit 1; }
while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

Uso:

 ./run_ec2_ps_cmd.sh instance-id command

Exemplo:

$ ./run_ec2_ps_cmd.sh i-xyz hostname
ip-xyz

Para executar saídas maiores, consulte: Como evitar que a saída seja truncada ao executar o comando AWS SSM?

kenorb
fonte
Na verdade, o melhor exemplo aqui. Mais votos positivos, por favor.
Sanctus
3

Sim, você pode fazer isso com o gerente de sistemas da AWS. O comando Executar do AWS Systems Manager permite executar remotamente e com segurança um conjunto de comandos no EC2 e no servidor local. Abaixo estão as etapas de alto nível para conseguir isso.

Anexar função do IAM da instância: a instância ec2 deve ter uma função do IAM com a política AmazonSSMFullAccess. Essa função permite que a instância se comunique com a API do Systems Manager.

Instalar agente SSM: A instância do EC2 deve ter o agente SSM instalado nela. O Agente SSM processa os pedidos de comando de execução e configura a instância conforme o comando.

Comando Execute: Exemplo de uso via AWS CLI:

Execute o seguinte comando para recuperar os serviços em execução na instância. Substitua Instance-ID pelo ec2 instance id.

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

Informações mais detalhadas: aqui

ExploringApple
fonte
3

Aqui está algo super legal que eu faço com o AWS SSM Send-Command!

Usando o Apache Airflow, crio uma Instância EC2 totalmente nova, usando um Modelo de formação em nuvem (ou CFT), que é apenas um arquivo JSON com todos os valores de configuração para minha Instância EC2 que eu quero; observe também que nesta CFT também tenho um comando de autoinicialização que copia um script Python de um local S3 para a nova instância do EC2, para que eu possa executá-lo posteriormente usando um comando de envio do SSM! Eu faço isso usando Python3 e o AWS SDK para Python3 chamado biblioteca Boto3. Aqui está parte do comando para criar a nova pilha CFT que, por sua vez, cria minha nova instância EC2:

import boto3

cft = boto3.client("cloudformation", "us-east-1")

response = cft.create_stack(
    StackName='foobarStackName',
    TemplateBody=json.dumps(json_data))

Em seguida, posso obter o ID da instância da nova instância do EC2 (necessária para usar o comando de envio do SSM) usando algo como isto:

response = cft.describe_stacks(
    StackName='foobarStackName',
)

Em seguida, posso obter o ID da instância da Instância EC2 do servidor do Airflow Worker atual executando este comando wget -q -O - http://169.254.169.254/latest/meta-data/instance-idatravés do Python:

output = subprocess.Popen(['wget', '-q', '-O', '-', 'http://169.254.169.254/latest/meta-data/instance-id'],
                          stdout=subprocess.PIPE)

# Do some weird stuff to get the value (I'm a Java developer so excuse my bad Python skilz)
instanceId = output.communicate()    
instanceId = str(instanceId).split("'")[1]

AGORA!!!! PARA A GRANDE FINAL

Posso executar um script na nova Instância EC2 que eu criei e enviar esse script para quaisquer parâmetros / argumentos que eu quiser ... incluindo o ID da instância do servidor que enviou o Comando de Envio do SSM para que seja executado assim que meu script for concluído executando na nova instância do EC2, ele pode enviar outro comando de envio do SSM de volta ao meu servidor Airflow para informar que o script foi concluído. Este é um nível muito alto, sem detalhes, mas é apenas para demonstrar uma ideia :)

subprocess.run(shlex.split('sudo aws ssm send-command --document-name "AWS-RunShellScript" --parameters commands=["sudo python3 /home/ec2-user/ec2_file_sensor.py ' + filepath + ' ' + batchIdValue + ' ' + source + ' ' + fileType + ' ' + airflowWorkerInstanceId + '"] --instance-ids ' + ec2ResourceInstanceId + ' --region us-east-1'))

Não tenho certeza se isso ajudou alguém, mas é um exemplo interessante e divertido de fazer algo com o AWS SSM Send-Command! Embora, provavelmente, um cheiro de código xD

Kyle Bridenstine
fonte