Добавление нескольких путей S3 для склеивания краулера с терраформом

Я создаю некоторую инфраструктуру в AWS с помощью Terraform. У меня создано несколько корзин S3, и я хочу, чтобы краулер Glue сканировал эти корзины один раз в час. Моя база данных каталога Terraform Glue, роль и политика все строятся нормально, но когда я пытаюсь создать ресурс искателя, добавляя четыре пути S3 к s3_target{} части искателя, я получаю ошибку:

resource "aws_glue_crawler" "datalake_crawler" {
  database_name = "${var.glue_db_name}"
  name          = "${var.crawler_name}"
  role          = "${aws_iam_role.glue.id}" 

  s3_target {
#    count = "${length(var.data_source_path)}"
    path = "${var.data_source_path}"#"${formatlist("%s", var.data_source_path)}"
  }
}

Это вызывает ошибку:

Error: aws_glue_crawler.datalake_crawler: s3_target.0.path must be a single value, not a list

Я попытался добавить оператор count в s3_target, но это не удалось. Я также пробовал добавить

"${formatlist("%s", var.data_source_path)}"

в аргументе path, но это тоже не удается.

Могу ли я добавить несколько s3 путей к Glue Crawler с Terraform? Я могу сделать это через консоль AWS, но это нужно сделать, используя инфраструктуру как код.


person Steven    schedule 18.02.2019    source источник
comment
Я не использовал клей, но, взглянув на документацию, кажется, что вы можете просто повторить блок s3_target для каждого пути. Прямо сейчас на моем телефоне, поэтому не могу проверить его, чтобы дать правильный ответ.   -  person ydaetskcoR    schedule 19.02.2019
comment
Добавление еще трех блоков s3_target к ресурсу поискового робота glue позволило мне добавить все четыре моих сегмента в поисковый робот. Я просмотрел документацию по клею, но не увидел ничего, что заставило меня поверить, что я могу воспроизвести s3_target блоки. Вы можете помочь мне увидеть, чего не хватало? Кроме того, могу ли я добавлять эти блоки программно на основе переменной? Не стесняйтесь добавлять в качестве ответа, когда вернетесь к коробке; рад принять.   -  person Steven    schedule 19.02.2019


Ответы (1)


Чтобы настроить таргетинг на дополнительные пути S3, вы можете просто повторить блок s3_target несколько раз следующим образом:

resource "aws_glue_crawler" "datalake_crawler" {
  database_name = "${var.glue_db_name}"
  name          = "${var.crawler_name}"
  role          = "${aws_iam_role.glue.id}" 

  s3_target {
    path = "${var.data_source_path_1}"
  }

  s3_target {
    path = "${var.data_source_path_2}"
  }
}

Это кратко упоминается в aws_glue_crawler ресурсных документах, где говорит:

s3_target (Необязательно) Список вложенных целевых аргументов Amazon S3. См. ниже.

Вы также можете увидеть это на странице :

        "s3_target": {
            Type:     schema.TypeList,
            Optional: true,
            MinItems: 1,

К сожалению, до версии 0.12 вы не могли создать это программно непосредственно в Terraform, чтобы перебирать список динамических путей и указывать их статически.

Terraform 0.12 представит HCL2, который лучше поддерживает циклы (кроме использования count), включая динамические блоки, которые позволят вам сделать что-то вроде этого:

resource "aws_glue_crawler" "datalake_crawler" {
  database_name = var.glue_db_name
  name          = var.crawler_name
  role          = aws_iam_role.glue.id 

  dynamic "s3_target" {
    for_each = var.data_source_paths

    content {
      path = s3_target
    }
  }
}
person ydaetskcoR    schedule 19.02.2019