Amazon web services cloudwatch/eventbridge事件调用ECS时,如何获取事件内容?

Amazon web services cloudwatch/eventbridge事件调用ECS时,如何获取事件内容?,amazon-web-services,amazon-ecs,amazon-cloudwatch,Amazon Web Services,Amazon Ecs,Amazon Cloudwatch,我们可以设置事件规则来触发ECS任务,但我不知道触发事件是否传递给正在运行的ECS任务,也不知道任务中如何获取此事件的内容。如果触发了Lambda,我们可以从事件变量获取它,例如,在Python中: def lambda_handler(event, context): ... 但在ECS中,我看不出我可以做类似的事情。转到cloudtrail日志存储桶听起来不是一个好方法,因为新日志/事件的显示大约有5分钟的延迟,这需要ECS等待,并且需要额外的逻辑来与S3对话并查找和读取日志。当触发事件频

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

def lambda_handler(event, context):
...

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

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

  • 一个目标将启动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任务启动时,它将能够从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 "$@"

经过进一步的研究,我最终找到了另一个解决方案,即使用S3调用Lambda,然后在Lambda中我使用ECS SDK(boto3,我使用Python)运行我的ECS任务。这样我就可以轻松地将事件内容传递给ECS,几乎是实时的


但我仍然相信@adii,因为他的解决方案也能起作用。

您好,您能否详细说明“轻松将事件内容传递给ECS”-这是否指传递给“RunTask”以更改任务值的“覆盖”。环境变量?是的,在ecs.run_任务中(overrides={'containerOverrides':[{'environment':[..related:在S3上载完成时触发ecs作业,示例为发送事件内容