为 Run Command 配置 Amazon CloudWatch Logs - AWS Systems Manager

为 Run Command 配置 Amazon CloudWatch Logs

使用 AWS Systems Manager 的功能 Run Command 发送命令时,可以指定要发送命令输出的位置。预设情况下,Systems Manager 仅返回命令输出的前 2.4 万个字符。如果您要查看命令输出的完整详细信息,可以指定 Amazon Simple Storage Service (Amazon S3) 存储桶。或者可以指定 Amazon CloudWatch Logs。如果指定 CloudWatch Logs,则 Run Command 会向 CloudWatch Logs 定期发送所有命令输出和错误日志。您可以近乎实时地监控输出日志,搜索特定短语、值或模式,以及基于搜索创建告警。

如果将托管节点配置为使用 AWS Identity and Access Management(IAM)托管策略 AmazonSSMManagedInstanceCoreCloudWatchAgentServerPolicy,则您的节点不需要进行额外配置即可将输出发送到 CloudWatch Logs。如果从控制台发送命令,请选择此选项;如果使用 AWS Command Line Interface (AWS CLI)、AWS Tools for Windows PowerShell 或 API 操作,则请添加 cloud-watch-output-config 部分和 CloudWatchOutputEnabled 参数。我们将在本主题的稍后内容中详细介绍 cloud-watch-output-config 部分和 CloudWatchOutputEnabled 参数。

有关将策略添加到 EC2 实例的实例配置文件的信息,请参阅配置 Systems Manager 所需的实例权限。有关将策略添加到打算用作托管式节点的本地服务器和虚拟机的服务角色的信息,请参阅在混合和多云环境中创建 Systems Manager 所需的 IAM 服务角色

如果在多个节点上使用一个自定义策略,请在每个节点上更新该策略,以允许 Systems Manager 向 CloudWatch Logs 发送输出和日志。将以下策略对象添加到您的自定义策略。有关更新 IAM policy 的更多信息,请参阅《IAM 用户指南》中的编辑 IAM policy

{ "Effect": "Allow", "Action": "logs:DescribeLogGroups", "Resource": "*" }, { "Effect":"Allow", "Action":[ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:PutLogEvents" ], "Resource":"arn:aws:logs:*:*:log-group:/aws/ssm/*" },

在发送命令时指定 CloudWatch Logs

要在您从AWS Management Console发送命令时将 CloudWatch Logs 指定为输出,请在 Output options (输出选项) 部分选择 CloudWatch Output (CloudWatch 输出)。您可以选择在您要发送命令输出的位置指定 CloudWatch Logs 组的名称。如果您未指定组名称,则 Systems Manager 会自动为您创建一个日志组。该日志组使用以下命名格式:/aws/ssm/SystemsManagerDocumentName

如果使用 AWS CLI 运行命令,请在命令中指定 cloud-watch-output-config 部分。此部分使您能够指定 CloudWatchOutputEnabled 参数,并可选择指定 CloudWatchLogGroupName 参数。下面是一个例子。

Linux & macOS
aws ssm send-command \ --instance-ids "instance ID" \ --document-name "AWS-RunShellScript" \ --parameters "commands=echo helloWorld" \ --cloud-watch-output-config "CloudWatchOutputEnabled=true,CloudWatchLogGroupName=log group name"
Windows
aws ssm send-command ^ --document-name "AWS-RunPowerShellScript" ^ --parameters commands=["echo helloWorld"] ^ --targets "Key=instanceids,Values=an instance ID” ^ --cloud-watch-output-config '{"CloudWatchLogGroupName":"log group name","CloudWatchOutputEnabled":true}'

在 CloudWatch Logs 中查看命令输出

一旦命令开始运行,Systems Manager 便会近乎实时地向 CloudWatch Logs 发送输出。CloudWatch Logs 中的输出使用以下格式:

CommandID/InstanceID/PluginID/stdout

CommandID/InstanceID/PluginID/stderr

执行的输出每 30 秒或当缓冲区超过 200KB 时(以先发生者为准)上载一次。

注意

日志流仅在输出数据可用时创建。例如,如果执行不存在错误数据,则不会创建 stderr 流。

此处是命令输出在 CloudWatch Logs 中显示时的示例。

Group - /aws/ssm/AWS-RunShellScript
Streams – 
1234-567-8910/i-abcd-efg-hijk/AWS-RunPowerShellScript/stdout
24/1234-567-8910/i-abcd-efg-hijk/AWS-RunPowerShellScript/stderr