Как запустить скрипт или команду на экземпляре EC2 через AWS CLI?

13

Согласно новостной статье New EC2 Run Command , интерфейс командной строки AWS должен поддерживать новую подкоманду для выполнения сценариев на удаленных экземплярах EC2.

Однако я зарегистрировался aws ec2 help, но не могу найти соответствующую команду.

Я установил awsчерез apt-get:

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

Какую подкоманду я должен искать и каков синтаксис для запуска, скажем, ipconfigв PowerShell на удаленном экземпляре EC2?

kenorb
источник
1
К вашему сведению, эта статья написана в 2015 году, поэтому я бы не назвал ее «новой» подкомандой. Я проверил хранилище исходного кода ( github.com/aws/aws-cli ) для aws-cli и не смог найти упоминаний об этом в документах, примерах, примечаниях к выпуску или кратко просматривая код , Я подал вопрос ( github.com/aws/aws-cli/issues/3126 ) и отправлю ответ, когда получу отзыв.
PrestonM

Ответы:

11

Чтобы запустить ipconfig из команды запуска AWS Systems Manager:

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

Примечание: если вы получили ошибку, рассмотрите возможность указания права --region.

Это предполагает, что у вас правильно настроены учетные данные AWS и CLI. Дополнительные сведения см. В пошаговом руководстве «Выполнение команд системного менеджера» с помощью интерфейса командной строки AWS .


Вот практический пример команды оболочки для отправки и получения вывода команды:

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
источник
3

Вот вспомогательный скрипт Bash, который используется aws ssm send-commandдля запуска команд:

#/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

Использование:

 ./run_ec2_ps_cmd.sh instance-id command

Пример:

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

Для получения более крупных выходных данных см. Как избежать усечения выходных данных при выполнении команды AWS SSM?

kenorb
источник
На самом деле лучший пример здесь. Больше голосов, пожалуйста.
Святилище
3

Да, вы можете сделать это с помощью менеджера систем AWS. Команда запуска AWS Systems Manager позволяет удаленно и безопасно запускать набор команд на EC2, а также на локальном сервере. Ниже приведены шаги высокого уровня для достижения этой цели.

Роль присоединения IAM экземпляра. Экземпляр ec2 должен иметь роль IAM с политикой AmazonSSMFullAccess. Эта роль позволяет экземпляру взаимодействовать с API-интерфейсом System Manager.

Установите агент SSM: на экземпляре EC2 должен быть установлен агент SSM. Агент SSM обрабатывает запросы команды запуска и настраивает экземпляр в соответствии с командой.

Выполнить команду: пример использования через AWS CLI:

Выполните следующую команду, чтобы получить службы, запущенные на экземпляре. Замените Instance-ID на идентификатор экземпляра ec2.

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

Более подробная информация: здесь

ExploringApple
источник
3

Вот что-то очень крутое, что я делаю с AWS SSM Send-Command!

Используя Apache Airflow, я создаю новый EC2-экземпляр, используя шаблон формирования облака (или сокращенно CFT), это просто файл JSON со всеми значениями конфигурации для моего EC2-экземпляра, который я хочу; Также обратите внимание, что в этом CFT у меня также есть команда начальной загрузки, которая копирует скрипт Python из местоположения S3 в новый экземпляр EC2, чтобы я мог выполнить его позже с помощью команды SSM Send! Я делаю это, используя Python3 и AWS SDK для Python3, называемые библиотекой Boto3. Вот часть команды для создания нового стека CFT, которая, в свою очередь, создает мой новый экземпляр EC2:

import boto3

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

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

Затем я могу получить Instance-ID нового EC2-экземпляра (необходимого для использования SSM Send-Command), используя что-то вроде этого:

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

Затем я могу получить идентификатор экземпляра текущего экземпляра EC2 сервера Airflow Worker, выполнив эту команду wget -q -O - http://169.254.169.254/latest/meta-data/instance-idчерез 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]

ТЕПЕРЬ!!!! ДЛЯ БОЛЬШОГО ФИНАЛА

Затем я могу выполнить сценарий для нового созданного мной экземпляра EC2 и отправить этому сценарию любые параметры / аргументы, которые я хочу ... включая идентификатор экземпляра сервера, который отправил команду отправки SSM, таким образом, когда мой сценарий будет выполнен работая на новом экземпляре EC2, он может отправить еще одну команду SSM Send обратно на мой сервер Airflow, чтобы сообщить, что сценарий завершен. Это на очень высоком уровне без подробностей, но это просто для демонстрации идеи :)

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'))

Не уверен, помогло ли это кому-нибудь, но это классный и интересный пример того, как что-то сделать с помощью AWS SSM Send-Command! Хотя, возможно, код запах XD

Кайл Бриденстайн
источник