根据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


我应该查找哪个子命令以及要运行的语法是什么,假设在远程EC2实例上的PowerShell中使用ipconfig

评论

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

#1 楼

要从AWS Systems Manager运行命令运行ipconfig,请执行以下操作:

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


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

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


此处是发送和获取命令输出的实用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


评论


您是否也可以同时将文件复制到实例?

– red888
20年6月20日在22:10

#2 楼

这是一个使用aws ssm send-command运行命令的辅助Bash脚本:

#/usr/bin/env bash -x
# Script to run PowerShell script on the Windows instance.
instanceId=""
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands="'${@:2}'")
[ $? -ne 0 ] && { echo "Usage: 
 ./run_ec2_ps_cmd.sh instance-id command
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 i-xyz hostname
ip-xyz


示例:

q4312078q

要执行更大的输出,请参阅:如何避免在运行AWS SSM命令时将输出截断?

评论


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

– Sanctus
20-2-18在18:02

#3 楼

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

附加实例IAM角色:
ec2实例必须具有IAM角色,并具有策略AmazonSSMFullAccess。此角色使实例能够与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


更多详细信息:此处

#4 楼

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

使用Apache Airflow,我使用CloudFormation Template(简称CFT)创建了一个全新的EC2-Instance,这只是一个JSON文件,我想要的EC2-Instance的所有配置值;还请注意,在此CFT中,我还具有一个bootstrap命令,该命令将Python脚本从S3位置复制到新的EC2-Instance,以便以后可以使用SSM Send-Command执行该脚本!我使用Python3和称为Boto3库的适用于Python3的AWS开发工具包进行此操作。这是用于创建新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-ID -Instance(需要使用SSM Send-Command),方法如下:

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


然后我可以获取当前Airflow Worker服务器EC2-Instance的Instance-ID通过Python运行以下命令wget -q -O - http://169.254.169.254/latest/meta-data/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上执行脚本,并将该脚本发送给我想要的任何参数/参数...包括发送该ID的服务器的Instance-ID。 SSM Send-Command,这样,当我的脚本在新的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

#5 楼

如果您需要执行多个命令(例如正在调查问题),则可以启动会话:
aws ssm start-session --target i-0123456789abcdef0

您将需要安装会话管理器插件。