如何通过AWS CLI在EC2实例上运行脚本或命令?


13

根据New EC2 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在远程EC2实例上的PowerShell中


1
仅供参考,该文章来自2015年,因此我不会将其称为“新”子命令。我签出了aws-cli 的源代码存储库(github.com/aws/aws-cli),但在文档,示例,发行说明中或通过简短地查看代码都找不到任何提及。我提出了一个问题(github.com/aws/aws-cli/issues/3126),当我收到反馈时将提交答案。
PrestonM

Answers:


11

要从AWS Systems Manager运行命令运行ipconfig:

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

注意:如果出现错误,请考虑指定right --region

假设您已正确配置了AWS凭证和CLI。有关更多信息,请参阅《使用AWS CLI的Systems Manager运行命令演练》


这是发送和获取命令输出的实际shell命令示例:

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

这是一个aws ssm send-command用于运行命令的帮助程序Bash脚本:

#/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命令时将输出截断?


实际上是最好的例子。请更多投票。
Sanctus

3

是的,您可以使用AWS系统管理器执行此操作。AWS Systems Manager运行命令允许您在EC2以及本地服务器上远程安全地运行命令集。以下是实现此目的的高级步骤。

附加实例IAM角色:ec2实例必须具有带有策略AmazonSSMFullAccess的IAM角色。该角色使实例能够与Systems Manager API通信。

安装SSM代理:EC2实例上必须安装了SSM代理。SSM代理处理运行命令,并根据命令配置实例。

执行命令:通过AWS CLI的示例用法:

执行以下命令以检索在实例上运行的服务。将实例ID替换为ec2实例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

更详细的信息:这里


3

这是我使用AWS SSM Send-Command做的超级酷的事情!

使用Apache Airflow,我使用云形成模板(简称CFT)创建了一个全新的EC2-Instance,这只是一个JSON文件,其中包含我想要的EC2-Instance的所有配置值。还请注意,在此CFT中,我还有一个引导程序命令,该命令将Python脚本从S3位置复制到新的EC2-Instance,以便稍后可以使用SSM Send-Command执行它。我使用Python3和称为Boto3库的适用于Python3的AWS开发工具包执行此操作。这是用于创建新的CFT堆栈的命令的一部分,而该CFT堆栈又创建了我的新EC2-Instance:

import boto3

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

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

然后,我可以使用以下方法获取新EC2-Instance的Instance-ID(使用SSM Send-Command必需):

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

然后,我可以wget -q -O - http://169.254.169.254/latest/meta-data/instance-id通过Python 运行以下命令来获取当前Airflow Worker服务器的EC2-Instance的实例ID :

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-Instance上执行脚本,然后将该脚本发送给我所需的任何参数/参数...包括发送SSM Send-Command的服务器的Instance-ID,以便在完成脚本后使用该方法在新的EC2-Instance上运行,它可以将另一个SSM Send-Command发送回我的A​​irflow服务器,以告知脚本已完成。这是一个非常高的层次,没有细节,但这只是演示一个想法:)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.