Bagaimana menjalankan skrip atau perintah pada EC2 misalnya melalui AWS CLI?

12

Menurut artikel berita New Run Perintah EC2 , AWS CLI harus mendukung sub-perintah baru untuk mengeksekusi skrip pada instance EC2 jarak jauh.

Namun saya sudah check-in aws ec2 help, tetapi saya tidak dapat menemukan perintah yang relevan.

Saya telah menginstal awsmelalui apt-get:

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

Sub-perintah mana yang harus saya cari dan apa sintaks yang harus dijalankan, katakanlah ipconfigdi PowerShell pada instance EC2 jarak jauh?

kenorb
sumber
1
FYI artikel itu dari tahun 2015 jadi saya tidak akan menyebutnya sub-perintah "baru". Saya memeriksa repositori kode sumber ( github.com/aws/aws-cli ) untuk aws-cli, dan saya tidak dapat menemukan menyebutkannya di dokumen, contoh, catatan rilis, atau melalui melihat kode secara singkat. . Saya mengajukan masalah ( github.com/aws/aws-cli/issues/3126 ) dan akan mengirimkan jawaban ketika saya mendapat umpan balik.
PrestonM

Jawaban:

10

Untuk menjalankan ipconfig dari AWS Systems Manager Run Command:

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

Catatan: Jika Anda memiliki kesalahan, pertimbangkan untuk menentukan yang benar --region.

Ini mengasumsikan Anda memiliki kredensial AWS dan CLI Anda dikonfigurasi dengan benar. Lihat Manajer Sistem Menjalankan Perintah Berjalan Menggunakan AWS CLI untuk informasi lebih lanjut.


Berikut ini adalah contoh perintah shell praktis untuk mengirim dan mendapatkan output perintah:

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
sumber
3

Berikut ini adalah skrip Bash pembantu yang digunakan aws ssm send-commanduntuk menjalankan perintah:

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

Pemakaian:

 ./run_ec2_ps_cmd.sh instance-id command

Contoh:

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

Untuk menjalankan keluaran yang lebih besar, lihat: Bagaimana cara menghindari keluaran yang terpotong saat menjalankan perintah AWS SSM?

kenorb
sumber
Sebenarnya contoh terbaik di sini. Tolong, lebih banyak upvotes.
Sanctus
3

Ya, Anda dapat melakukan ini dengan manajer AWS Systems. AWS Systems Manager Run Command memungkinkan Anda menjalankan perintah dari jarak jauh dan aman di EC2 dan juga server di lokasi. Di bawah ini adalah langkah-langkah tingkat tinggi untuk mencapai ini.

Lampirkan peran IAM Instance: Instance EC2 harus memiliki peran IAM dengan kebijakan AmazonSSMFullAccess. Peran ini memungkinkan instance untuk berkomunikasi dengan API System Manager.

Instal SSM Agent: Contoh EC2 harus memiliki agen SSM diinstal di dalamnya. Agen SSM memproses perintah jalankan meminta & mengkonfigurasi instance sesuai perintah.

Jalankan perintah: Contoh penggunaan melalui AWS CLI:

Jalankan perintah berikut untuk mengambil layanan yang berjalan pada instance. Ganti Instance-ID dengan id contoh 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

Informasi lebih rinci: di sini

MenjelajahiApple
sumber
3

Ini adalah sesuatu yang sangat keren yang saya lakukan dengan AWS SSM Send-Command!

Menggunakan Apache Airflow, saya membuat EC2-Instance baru menggunakan Cloud Formation Template (atau singkatnya CFT) yang hanya berupa file JSON dengan semua nilai konfigurasi untuk EC2-Instance yang saya inginkan; juga perhatikan bahwa dalam CFT ini saya juga memiliki perintah bootstrap yang menyalin skrip Python dari lokasi S3 ke EC2-Instance baru sehingga saya dapat menjalankannya nanti menggunakan SSM Send-Command! Saya melakukan ini menggunakan Python3 dan AWS SDK untuk Python3 disebut perpustakaan Boto3. Inilah bagian dari perintah untuk membuat CFT Stack baru yang pada gilirannya menciptakan EC2-Instance baru saya:

import boto3

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

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

Kemudian saya bisa mendapatkan Instance-ID EC2-Instance baru (diperlukan untuk menggunakan SSM Send-Command) menggunakan sesuatu seperti ini:

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

Kemudian saya bisa mendapatkan Instance-ID dari EC2-Instance server Airflow Worker saat ini dengan menjalankan perintah ini wget -q -O - http://169.254.169.254/latest/meta-data/instance-idmelalui 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]

SEKARANG!!!! UNTUK FINAL GRAND

Saya kemudian dapat menjalankan skrip pada EC2-Instance baru yang saya buat dan mengirimkan skrip itu parameter / argumen apa pun yang saya inginkan ... termasuk Instance-ID dari server yang mengirim SSM Send-Command sehingga saat skrip saya selesai berjalan pada EC2-Instance baru, ia dapat mengirim SSM Send-Command kembali ke server Airflow saya untuk memberi tahu bahwa skrip telah selesai. Ini pada tingkat yang sangat tinggi tanpa detail tetapi hanya untuk menunjukkan ide :)

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

Tidak yakin apakah ini membantu siapa pun tetapi ini adalah contoh keren dan MENYENANGKAN melakukan sesuatu dengan AWS SSM Send-Command! Meskipun, mungkin kode bau xD

Kyle Bridenstine
sumber