cloudwatch/eventbridge事件调用时如何获取ECS中的事件内容?

Z.W*_*Wei 6 amazon-web-services amazon-ecs amazon-cloudwatch

我们可以设置事件规则来触发ECS任务,但我没有看到触发事件是否传递给正在运行的ECS任务以及任务中如何获取该事件的内容。如果 Lambda 被触发,我们可以从event变量中获取它,例如在 Python 中:

def lambda_handler(event, context):
...
Run Code Online (Sandbox Code Playgroud)

但在 ECS 中我不知道如何做类似的事情。转到 cloudtrail 日志存储桶听起来不是一个好方法,因为新日志/事件的显示大约有 5 分钟的延迟,这需要 ECS 等待并需要额外的逻辑来与 S3 通信并查找和读取日志。当触发事件频繁时,这听起来很难处理。

Adi*_*iii 6

处理此问题的一种方法是在云监视规则中设置两个目标。

  • 一个目标将启动ECS任务
  • 一个目标将同一事件推送至 SQS

所以 SQS 将包含类似的信息

{
  "version": "0",
  "id": "89d1a02d-5ec7-412e-82f5-13505f849b41",
  "detail-type": "Scheduled Event",
  "source": "aws.events",
  "account": "123456789012",
  "time": "2016-12-30T18:44:49Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:events:us-east-1:123456789012:rule/SampleRule"
  ],
  "detail": {}
}
Run Code Online (Sandbox Code Playgroud)

因此,当ECS TASK启动时,它将能够从SQS读取事件。 在此输入图像描述

例如在 Docker 入口点

#!/bin/sh
echo "Starting container"
echo "Process SQS event"
node process_schdule_event.sj


#or if you need process at run time
schdule_event=$(aws sqs receive-message --queue-url https://sqs.us-west-2.amazonaws.com/123456789/demo --attribute-names All --message-attribute-names All --max-number-of-messages 1)
echo "Schdule Event: ${schdule_event}"


# one process done, start the main process of the container
exec "$@"
Run Code Online (Sandbox Code Playgroud)