Як запустити скрипт або команду на екземплярі EC2 через AWS CLI?


13

Згідно з новиною статті EC Run Run Command , AWS CLI повинен підтримувати нову підкоманду для виконання скриптів на віддалених екземплярах 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?


1
FYI ця стаття з 2015 року, тому я б не називав її "новою" підкомандою. Я перевірив сховище вихідного коду ( github.com/aws/aws-cli ) для aws -cli, і не міг знайти жодної згадки про нього в документах, прикладах, нотатках випуску або коротко переглянувши код . Я подав проблему ( github.com/aws/aws-cli/isissue/3126 ) і надішлю відповідь, коли отримаю відгук.
PrestonM

Відповіді:


11

Щоб запустити ipconfig з команди AWS Systems Manager Run Command:

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

Примітка. Якщо ви отримали помилку, подумайте, як вказати право --region.

Це передбачає, що у вас є правильні налаштування облікових даних AWS та CLI. Докладнішу інформацію див. У розділі Система диспетчера запуску командної інструкції з використанням AWS CLI для отримання додаткової інформації.


Ось практичний приклад команди оболонки для надсилання та отримання команди:

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

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?


Насправді найкращий приклад тут. Більше інформації, будь ласка.
Санктус

3

Так, це можна зробити за допомогою менеджера AWS Systems. AWS Systems Manager Run Command дозволяє віддалено і надійно запускати набір команд на EC2, а також на локальному сервері. Нижче наведено кроки на високому рівні для досягнення цього.

Приєднати роль інстанції IAM: Екземпляр ec2 повинен мати роль IAM з політикою AmazonSSMFullAccess. Ця роль дозволяє екземпляру спілкуватися з API менеджера систем.

Встановити агент SSM: Екземпляр EC2 повинен мати на ньому встановлений агент SSM. Агент SSM обробляє команду запускати запити та налаштовує екземпляр відповідно до команди.

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

Виконайте наступну команду для отримання служб, що працюють на екземплярі. Замініть ідентифікатор інстанції на ідентифікатор екземпляра 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

Більш детальна інформація: тут


3

Ось щось надзвичайно круто, що я роблю з AWS SSM Send-Command!

Використовуючи Apache Airflow, я створюю абсолютно новий EC2-екземпляр за допомогою шаблону формування хмари (або коротко CFT), що є лише файлом JSON з усіма значеннями конфігурації для мого EC2-інстанції, який я хочу; також зауважте, що в цьому CFT у мене також є команда завантаження, яка копіює скрипт Python з місця розташування S3 до нового EC2-інстанції, щоб я міг виконати його пізніше, використовуючи SSM Send-Command! Я роблю це за допомогою 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))

Тоді я можу отримати ідентифікатор інстанції нового 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 Send-Command так, коли мій сценарій виконаний працює на новому EC2-інстанції, він може відправити ще один SSM Send-Command назад на мій сервер 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.