如何避免运行AWS SSM命令时输出被截断

60次阅读
没有评论

问题描述

在运行AWS CLI命令时,使用了PowerShell的Invoke-WebRequest命令。然而,输出结果被截断了。用户想知道如何运行aws ssm list-command-invocations命令,以避免输出被截断。

解决方案

请注意以下操作注意版本差异及修改前做好备份。
根据AWS SSM教程,SSM send-command的输出结果被截断在2500个字符。为了解决这个问题,你可以使用--output-s3-bucket-name参数将输出结果发送到S3存储桶中。
以下是解决方案的步骤:
1. 确保你已经创建了一个S3存储桶。
2. 使用aws ssm send-command命令,并指定--output-s3-bucket-name参数来将输出结果发送到S3存储桶中。
3. 使用aws ssm list-command-invocations命令来获取输出结果。
下面是一个示例脚本,使用aws ssm send-command命令和--output-s3-bucket-name参数来运行命令,并将结果存储在S3存储桶中,然后将结果显示在标准输出中:

#!/usr/bin/env bash
# 运行PowerShell脚本并将输出结果上传到S3存储桶
instanceId="$1"
bucketName="$2"
bucketDir="Output"
[ $# -le 2 ] && { echo "Usage: $0 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

使用示例:

./run_ec2_ps_cmd_s3.sh i-0xyz my-bucket-name 'While ($i -le 10) {(Invoke-WebRequest -UseBasicParsing -Uri http://example.com).Content; $i++}'

请注意,上述脚本中的aws s3 ls ${bucketName} > /dev/null命令用于确保存储桶存在。如果存储桶不存在,则没有必要执行后续的命令。
此外,aws ssm list-command-invocations命令用于检查SSM命令的状态。只有当SSM命令的状态不再是”InProgress”时,才会继续执行后续的命令。

正文完