Làm cách nào để chạy tập lệnh hoặc lệnh trên phiên bản EC2 thông qua AWS CLI?


12

Theo bài viết mới về Lệnh chạy EC2 , AWS CLI nên hỗ trợ một lệnh phụ mới để thực thi các tập lệnh trên các trường hợp EC2 từ xa.

Tuy nhiên tôi đã đăng ký aws ec2 help, nhưng tôi không thể tìm thấy lệnh có liên quan.

Tôi đã cài đặt awsqua apt-get:

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

Tôi nên tìm lệnh phụ nào và cú pháp nào để chạy, giả sử ipconfigtrong PowerShell trên phiên bản EC2 từ xa?


1
FYI bài báo đó là từ năm 2015 vì vậy tôi sẽ không gọi nó là một lệnh phụ "mới". Tôi đã kiểm tra kho lưu trữ mã nguồn ( github.com/aws/aws-cli ) cho aws-cli và tôi không thể tìm thấy bất kỳ đề cập nào về nó trong các tài liệu, ví dụ, ghi chú phát hành hoặc xem qua mã ngắn gọn . Tôi đã gửi một vấn đề ( github.com/aws/aws-cli/issues/3126 ) và sẽ gửi câu trả lời khi tôi nhận được phản hồi.
PrestonM

Câu trả lời:


10

Để chạy ipconfig từ Lệnh Chạy Trình quản lý Hệ thống AWS:

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

Lưu ý: Nếu bạn gặp lỗi, hãy xem xét chỉ định đúng --region.

Điều này giả định rằng bạn có thông tin AWS và CLI được cấu hình đúng. Xem Trình quản lý hệ thống Chạy lệnh Walkential bằng AWS CLI để biết thêm thông tin.


Dưới đây là ví dụ lệnh shell thực tế của việc gửi và nhận đầu ra lệnh:

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

Đây là một kịch bản trợ giúp Bash sử dụng aws ssm send-commandđể chạy các lệnh:

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

Sử dụng:

 ./run_ec2_ps_cmd.sh instance-id command

Thí dụ:

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

Để thực hiện các đầu ra lớn hơn, hãy xem: Làm thế nào để tránh đầu ra bị cắt ngắn khi chạy lệnh AWS SSM?


Thực tế ví dụ tốt nhất ở đây. Nhiều upvote, xin vui lòng.
Sanctus

3

Có, bạn có thể làm điều này với người quản lý AWS Systems. Lệnh chạy Trình quản lý hệ thống AWS cho phép bạn chạy bộ lệnh từ xa và an toàn trên EC2 cũng như máy chủ tại chỗ. Dưới đây là các bước cấp cao để đạt được điều này.

Đính kèm vai trò IAM của Instance: Ví dụ ec2 phải có vai trò IAM với chính sách AmazonSSMFullAccess. Vai trò này cho phép cá thể giao tiếp với API của Trình quản lý hệ thống.

Cài đặt SSM Agent: Phiên bản EC2 phải có tác nhân SSM được cài đặt trên nó. Tác nhân SSM xử lý các yêu cầu lệnh chạy & cấu hình thể hiện theo lệnh.

Lệnh thực thi: Sử dụng ví dụ qua AWS CLI:

Thực hiện lệnh sau để lấy các dịch vụ đang chạy trên thể hiện. Thay thế Instance-ID bằng id id2.

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

Thông tin chi tiết: tại đây


3

Đây là một điều tuyệt vời tôi làm với AWS SSM Send-Command!

Sử dụng Apache Airflow Tôi tạo một EC2-Instance hoàn toàn mới bằng cách sử dụng Mẫu hình thành đám mây (gọi tắt là CFT), đó chỉ là một tệp JSON với tất cả các giá trị cấu hình cho EC2-Instance mà tôi muốn; cũng lưu ý rằng trong CFT này tôi cũng có lệnh bootstrap sao chép tập lệnh Python từ vị trí S3 sang EC2-Instance mới để tôi có thể thực thi lệnh này sau khi sử dụng Lệnh gửi SSM! Tôi làm điều này bằng Python3 và AWS SDK cho Python3 được gọi là thư viện Boto3. Đây là một phần của lệnh tạo CFT Stack mới, lần lượt tạo ra EC2-Instance mới của tôi:

import boto3

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

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

Sau đó, tôi có thể nhận được Instance-ID của EC2-Instance mới (bắt buộc phải sử dụng Lệnh gửi SSM) bằng cách sử dụng cái gì đó như sau:

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

Sau đó, tôi có thể nhận được Instance-ID của EC2-Instance của máy chủ Airflow hiện tại bằng cách chạy lệnh này wget -q -O - http://169.254.169.254/latest/meta-data/instance-idthông qua 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]

HIỆN NAY!!!! CHO CUỐI CÙNG GRAND

Sau đó, tôi có thể thực thi một tập lệnh trên EC2-Instance mới mà tôi đã tạo và gửi tập lệnh đó bất kỳ tham số / đối số nào tôi muốn ... bao gồm cả Instance-ID của máy chủ đã gửi Lệnh gửi SSM theo cách đó khi tập lệnh của tôi được thực hiện chạy trên EC2-Instance mới, nó có thể gửi một Lệnh gửi SSM khác trở lại máy chủ Airflow của tôi để thông báo rằng tập lệnh đã kết thúc. Đây là một mức độ rất cao mà không có chi tiết nhưng nó chỉ để thể hiện một ý tưởng :)

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

Không chắc điều này có giúp được ai không, nhưng đây là một ví dụ thú vị và vui vẻ khi làm điều gì đó với Lệnh gửi của AWS SSM! Mặc dù, có lẽ là một mã mùi xD

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.