Как использовать входной трансформатор для типа запуска ECS Fargate с триггером события Terraform CloudWatch - PullRequest
1 голос
/ 11 июля 2020

Я использую terraform для создания триггера события CloudWatch с типом запуска ECS Fargate, источником которого является S3. Когда я использую поле input_transformer для передачи сегмента и ключа в задачу ECS, мое правило события приводит к неудачному вызову.

Это aws_cloudwatch_event_rule:

resource "aws_cloudwatch_event_rule" "event_rule" {
  name          = "dev-gnss-source-put-rule-tf"
  description   = "Capture S3 events on uploads bucket"
  event_pattern = <<PATTERN
{
  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "eventName": [
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": [
        "example-bucket-name"
      ]
    }
  }
}
PATTERN
}

Это aws_cloudwatch_event_target:

resource "aws_cloudwatch_event_target" "event_target" {
  target_id = "dev-gnss-upload-event-target-tf"
  arn       = "example-cluster-arn"
  rule      = aws_cloudwatch_event_rule.event_rule.name
  role_arn  = aws_iam_role.uploads_events.arn
  ecs_target {
    launch_type = "FARGATE"
    task_count  = 1 # Launch one container / event
    task_definition_arn = "example-task-definition-arn"
    network_configuration {
      subnets         = ["example-subnet"]
      security_groups = []
    }
  }

  input_transformer {
    input_paths = {
      s3_bucket = "$.detail.requestParameters.bucketName"
      s3_key    = "$.detail.requestParameters.key"
    }

    input_template = <<TEMPLATE
{
  "containerOverrides": [
    {
      "name": "myproject-task",
      "environment": [
        { "name": "S3_BUCKET", "value": <s3_bucket> },
        { "name": "S3_KEY", "value": <s3_key> }
      ]
    }
  ]
}
TEMPLATE
  }
}

Если я удалю раздел input_transformer, он будет работать нормально, но мне нужно передать ведро s3 и ключ для обработки конкретного файла.

Мое обоснование для этого состоит в том, чтобы устранить необходимость в промежуточной лямбде, и я руководствовался этим сообщением на Medium: https://medium.com/@bowbaq / trigger-an-ecs-job-when-an-s3-upload-completetes -3559c44c37d1

Любые советы приветствуются.

1 Ответ

1 голос
/ 11 июля 2020

После нескольких часов беготни по кругу я нашел ответ!

Итак, первым делом нужно проверить, в чем причина неудачного вызова. Вы можете сделать это, проверив журналы CloudTrail, перейдя в Cloud Trail> История событий> Искать по Event name и набрав RunTask в поле поиска. Вы должны увидеть серию событий из источника событий ecs.amazonaws.com. Найдите тот, который связан с вашим Неудачным вызовом, с которым вы столкнулись.

Когда вы нажимаете на событие, вы можете увидеть в разделе Event record errorMessage. В моем случае это было следующее:

   "errorCode": "InvalidParameterException",
   "errorMessage": "Override for container named myproject-task is not a container in the TaskDefinition.",

У вас может быть иначе. Для меня это было потому, что мое имя containerOverride было неправильным. Это поле относится к: The name of the container that receives the override. This parameter is required if any override is specified. ref: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerOverride.html

Исправление этого поля устранило мою проблему.

...