我具有以下AWS CLI命令来运行PowerShell的Invoke-WebRequest命令:

instanceId=i-0xyz # Change this.
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands='"While ($i -le 10) {Invoke-WebRequest -UseBasicParsing -Uri http://example.com; $i += 1}"')
sleep 1
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text


但是,输出被截断了: br />
如何运行aws ssm list-command-invocations命令,所以输出不会被截断?

#1 楼

根据此ssm教程,SSM发送命令输出被截断为2500个字符。要解决此问题,必须使用--output-s3-bucket-name参数将输出发送到S3存储桶。

#2 楼

这是一个帮助程序Bash脚本,它使用带有aws ssm send-command参数的--output-s3-bucket-name来运行命令,并将结果存储在S3存储桶中,然后显示到标准输出。
示例:

#/usr/bin/env bash -xe
# Script to run PowerShell script on the Windows instance, then uploads the output to S3 bucket.
instanceId=""
bucketName=""
bucketDir="Output"
[ $# -le 2 ] && { echo "Usage: 
./run_ec2_ps_cmd_s3.sh i-0xyz my-bucket-name 'While ($i -le 10) {(Invoke-WebRequest -UseBasicParsing -Uri http://example.com).Content; $i++}'
instance_id bucket_name command"; exit 1; } aws s3 ls ${bucketName} > /dev/null cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --output-s3-bucket-name "$bucketName" --output-s3-key-prefix "$bucketDir" --parameters commands="'${@:3}'") while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done outputPath=$(aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[].CommandPlugins[].OutputS3KeyPrefix" --output text) aws s3 ls s3://${bucketName}/${outputPath}/stderr.txt && aws s3 cp --quiet s3://${bucketName}/${outputPath}/stderr.txt /dev/stderr aws s3 cp --quiet s3://${bucketName}/${outputPath}/stdout.txt /dev/stdout


评论


几句话:1.为什么要先使用s3 ls?这听起来像什么都没有的api查询。 2.测试InProgress非常脆弱,ssm命令可能处于Pending状态,并且脚本将失败。 3. S3上文件的可用性可能会延迟几秒钟,执行重试循环通常有助于将内容取回

–滕西拜
18年2月21日在15:06

@Tensibai 1.确保存储桶存在,否则执行该命令毫无意义。 2.到目前为止,我只注意到InProgress,它会检查我是否还有Pendingas。3.如果SSM命令已完成,我认为我们可以假定文件已经存在。到目前为止还没有问题,尽管仍在对该脚本进行大量测试。

– Kenorb
18年2月21日在15:09

这就是我在Linux实例的运行shell脚本中观察到的内容:)

–滕西拜
18年2月21日在15:12

根据此list-command-invocations链接,Status的可能值为InProgress,Success,TimedOut,Canceled,Failed,所以据我所知,没有待决的值。

– Kenorb
18年2月21日在15:15



w,的确,我使用列表命令是因为我以倍数实例为目标,该命令的状态也为“待处理”。

–滕西拜
18年2月21日在15:23