首页 > 解决方案 > 被cloudwatch/eventbridge事件调用时如何获取ECS中的事件内容?

问题描述

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

def lambda_handler(event, context):
...

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

标签: amazon-web-servicesamazon-ecsamazon-cloudwatch

解决方案


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

  • 一个目标将启动 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": {}
}

因此,当 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 "$@"

推荐阅读