如何将 Cloudwatch 输出添加到 EC2 上的 runShellScript 文档?

How to add Cloudwatch output to runShellScript document on an EC2?

我在 EC2 上有一个 python 脚本,它需要每天 运行 ,而无需任何人手动启动它。我当前的设置使用预定的 Lambda 函数将 SSM 文档作为命令发送到 EC2。 SSM 文档包含一个简短的 "runShellScript" 命令到 运行 python 脚本。 (有关 SSM 文档和缩写的 lambda 函数,请参见下文)。这个过程工作正常。

问题是我需要将日志流式传输到 CloudWatch。我知道 CloudWatch 可以检索位于 EC2 上的日志文件;但是我希望 Cloudwatch 直接从 stdout(标准输出)捕获日志,而不是获取日志文件。

当我通过 AWS "Run Command" 部分手动 运行 SSM 文档时 UI,它会将它漂亮地发送到 Cloudwatch,因为我直接将 CloudWatch 配置为 运行 命令启动。但是我没有看到任何地方可以将 Cloudwatch 配置为文档的一部分。

如何调整我的 SSM 文档(或此过程的任何部分)以将日志流式传输到 CloudWatch?

如果有帮助,我愿意更改文档中的 schemaVersions。我已经查看了 SSM 参数文档,但在那里找不到答案。

这是 Lambda 函数的相关部分:

def lambda_handler(event, context):

    # Execute the script
    ssm = boto3.client('ssm', region_name=region)
    ssm_response = ssm.send_command(InstanceIds=instances, DocumentName='CustomRunScript', Comment='Starting init script from lambda prod')
    print('SSM response is: ', ssm_response)

这是我的 SSM 文档:

{
  "schemaVersion": "1.2",
  "description": "Custom Run Script",
  "parameters": {},
  "runtimeConfig": {
    "aws:runShellScript": {
      "properties": [
        {
          "id": "0.aws:runShellScript",
          "runCommand": [
            "/usr/bin/python3 /home/app/init.py"
          ]
        }
      ]
    }
  }
}

我想你正在寻找 CloudWatchOutputConfig

def lambda_handler(event, context):
    # Execute the script
    ssm = boto3.client('ssm', region_name=region)
    ssm_response = ssm.send_command(
        InstanceIds=instances,
        DocumentName='CustomRunScript',
        Comment='Starting init script from lambda prod',
        CloudWatchOutputConfig={
            'CloudWatchLogGroupName': 'some-group-name',
            'CloudWatchOutputEnabled': True,
        },
    )
    print('SSM response is: ', ssm_response)

When you send a command by using Run Command, you can specify where you want to send the command output. By default, Systems Manager returns only the first 2,500 characters of the command output. If you want to view the full details of the command output, you can specify an Amazon Simple Storage Service (Amazon S3) bucket. Or you can specify Amazon CloudWatch Logs. If you specify CloudWatch Logs, Run Command periodically sends all command output and error logs to CloudWatch Logs. You can monitor output logs in near real-time, search for specific phrases, values, or patterns, and create alarms based on the search.

请注意,您需要为 Lambda 提供适当的 IAM 权限才能访问日志组。这些权限在下面的参考中列出。

参见 Configuring Amazon CloudWatch Logs for Run Command