如果要将事件桥事件的数据传递给使用 FARGATE 启动类型的 ECS 任务,可以使用输入转换(Input Transformation)。例如,假设我们已经配置了一个 S3 存储桶,将所有事件通知发送到事件桥,并且我们有一个如下所示的事件桥规则。
{
"detail": {
"bucket": {
"name": ["mybucket"]
}
},
"detail-type": ["Object Created"],
"source": ["aws.s3"]
}
现在假设我们想将存储桶名称、对象键和对象版本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
}
}
当您的 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"))
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)
}
PutObject
和CompleteMultipartUpload
。如果您愿意,您可以提供一个您所设想的架构图来帮助理解。 :) - user189198