8 amazon-web-services aws-event-bridge
我想将事件数据从 Amazon EventBridge 直接传递到 AWS Fargate 任务中。然而,目前看来这是不可能的。
作为解决方法,我在 AWS Fargate 和 EventBridge 之间插入了额外的资源。AWS Step Functions 允许您指定ContainerOverrides,其中该Environment属性允许您配置将从 EventBridge 事件传递到 Fargate 任务的环境变量。
不幸的是,这种解决方法不必要地增加了解决方案的复杂性和成本。
问题:有没有一种方法可以将事件数据从 EventBridge 直接传递到 AWS Fargate (ECS) 任务,而我根本不知道?
要将数据从 Eventbridge 事件传递到 ECS 任务(例如使用启动类型 FARGATE),您可以使用输入转换。例如,假设我们有一个 S3 存储桶,配置为将所有事件通知发送到 eventbridge,并且我们有一个如下所示的 eventbridge 规则。
{
"detail": {
"bucket": {
"name": ["mybucket"]
}
},
"detail-type": ["Object Created"],
"source": ["aws.s3"]
}
Run Code Online (Sandbox Code Playgroud)
现在假设我们想要将存储桶名称、对象键和对象版本 ID 传递给在 fargate 上运行的 ecs 任务,您可以使用下面的输入转换器在terraform中创建aws_cloudwatch_event_target资源。
resource "aws_cloudwatch_event_target" "EventBridgeECSTaskTarget"{
target_id = "EventBridgeECSTaskTarget"
rule = aws_cloudwatch_event_rule.myeventbridgerule.name
arn = "arn:aws:ecs:us-east-1:123456789012:cluster/myecscluster"
role_arn = aws_iam_role.EventBridgeRuleInvokeECSTask.arn
ecs_target {
task_count = 1
task_definition_arn = "arn:aws:ecs:us-east-1:123456789012:task-definition/mytaskdefinition"
launch_type = "FARGATE"
network_configuration {
subnets = ["subnet-1","subnet-2","subnet-3"]
security_groups = ["sg-group-id"]
}
}
input_transformer {
input_paths = {
bucketname = "$.detail.bucket.name",
objectkey = "$.detail.object.key",
objectversionid = "$.detail.object.version-id",
}
input_template = <<EOF
{
"containerOverrides": [
{
"name": "containername",
"environment" : [
{
"name" : "S3_BUCKET_NAME",
"value" : <bucketname>
},
{
"name" : "S3_OBJECT_KEY",
"value" : <objectkey>
},
{
"name" : "S3_OBJ_VERSION_ID",
"value": <objectversionid>
}
]
}
]
}
EOF
}
}
Run Code Online (Sandbox Code Playgroud)
ECS 任务运行后,您可以轻松访问这些变量来检查对象是在哪个存储桶中创建的、对象是什么和版本,并执行 GetObject。
例如:在Go中我们可以轻松地按如下方式完成。(仅片段不添加导入和内容,但您明白了。
filename := aws.String(os.Getenv("S3_OBJECT_KEY"))
bucketname := aws.String(os.Getenv("S3_BUCKET_NAME"))
versionId := aws.String(os.Getenv("S3_OBJ_VERSION_ID"))
//You can print and verify the values in CloudWatch
//Prepare the s3 GetObjectInput
s3goi := &s3.GetObjectInput{
Bucket: bucketname,
Key: filename,
VersionId: versionId,
}
s3goo, err := s3svc.GetObject(ctx, s3goi)
if err != nil {
log.Fatalf("Error retreiving object: %v", err)
}
b, err := ioutil.ReadAll(s3goo.Body)
if err != nil {
log.Fatalf("Error reading file: %v", err)
}
Run Code Online (Sandbox Code Playgroud)
目前 EventBridge 和 Fargate 之间没有直接调用。您可以在https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-targets.html找到支持的目标列表
解决方法是使用支持调用 Fargate(如步骤函数)或在将消息发送到下游之前将消息发送到计算(如 lambda [讽刺])的中介。
| 归档时间: |
|
| 查看次数: |
7863 次 |
| 最近记录: |