Передача данных о событиях из 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 (например, пошаговых функций) или отправку сообщения на вычисление (например, лямбда [ирония]) перед его отправкой вниз по потоку.