Передача данных о событиях из Amazon EventBridge в задачу AWS Fargate

Задача

Я хочу передать данные о событиях из Amazon EventBridge непосредственно в задачу AWS Fargate. Однако в настоящее время это не представляется возможным.

Обходной путь

В качестве обходного пути я вставил дополнительный ресурс между AWS Fargate и EventBridge. AWS Step Functions позволяет указатьContainerOverrides, в которой Environment Свойство позволяет настроить переменные среды, которые будут переданы в задачу Fargate из события EventBridge.

К сожалению, этот способ обхода без надобности увеличивает сложность и стоимость решения.

Вопрос: Есть ли способ передать данные о событиях из EventBridge непосредственно в задачу AWS Fargate (ECS), о которой я просто не знаю?

2 ответа

Чтобы передать данные из события Eventbridge в задачу ECS, например, с типом запуска FARGATE, вы можете использовать преобразование ввода. Например, предположим, что у нас есть корзина S3, настроенная на отправку всех уведомлений о событиях в мост событий, и у нас есть правило моста событий, которое выглядит следующим образом.

      {
      "detail": {
        "bucket": {
          "name": ["mybucket"]
        }
      },
      "detail-type": ["Object Created"],
      "source": ["aws.s3"]
}

Теперь предположим, что мы хотели бы передать имя корзины, ключ объекта и идентификатор версии объекта нашей задаче ecs, работающей на fargate. Вы можете создать ресурс aws_cloudwatch_event_target в terraform с входным преобразователем ниже.

      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
  }
}

Как только ваша задача 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)
    }

В настоящее время нет прямого вызова между EventBridge и Fargate. Вы можете найти список поддерживаемых целей на https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-targets.html

Обходной путь заключается в использовании посредника, который поддерживает вызов fargate (например, пошаговых функций) или отправку сообщения на вычисление (например, лямбда [ирония]) перед его отправкой вниз по потоку.

Другие вопросы по тегам