amazon-web-services - 被cloudwatch/eventbridge事件调用时如何获取ECS中的事件内容?
问题描述
我们可以设置事件规则来触发 ECS 任务,但是我看不到触发事件是否传递给正在运行的 ECS 任务以及在任务中如何获取该事件的内容。如果触发了 Lambda,我们可以从event
变量中获取它,例如在 Python 中:
def lambda_handler(event, context):
...
但是在 ECS 中,我看不到我可以如何做类似的事情。转到 cloudtrail 日志存储桶听起来不是一个好方法,因为它有大约 5 分钟的延迟才能显示新的日志/事件,这需要 ECS 等待和额外的逻辑来与 S3 对话并查找和读取日志。而当触发事件频繁时,这听起来很难处理。
解决方案
处理此问题的一种方法是在 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 "$@"
推荐阅读
- reactjs - 无法设置 React 引导表的最大高度
- c++ - 指针类型的特殊重载
- java - 如何检查所有复选框?试图检查所有复选框,测试通过,但视觉上我没有看到它们被选中
- java - liquibase.update 不执行带有 runAlways 的 Liquibase changeSet
- sql - SQL 有条件地连接表
- python - 来自 NLTK、Gensim、Scikit Learn 的 API 调用
- visual-studio - 无法安装或卸载 Visual Studio 2017
- crystal-reports - Crystal Reports - 将月份和年份参数转换为命令 WHERE 子句的开始和结束日期
- sql - 如果不包括 group by 中的列名,则无法按列排序
- python - 在 Pygame 中将开始屏幕切换到游戏