将事件数据从 Amazon EventBridge 传递到 AWS Fargate 任务

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) 任务,而我根本不知道?

Aak*_*ash 6

要将数据从 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)


blr*_*blr 2

目前 EventBridge 和 Fargate 之间没有直接调用。您可以在https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-targets.html找到支持的目标列表

解决方法是使用支持调用 Fargate(如步骤函数)或在将消息发送到下游之前将消息发送到计算(如 lambda [讽刺])的中介。