使用Terraform将多个S3路径添加到胶履带

Ste*_*ven 2 amazon-s3 amazon-web-services terraform aws-glue terraform-provider-aws

我正在使用Terraform在AWS中构建一些基础架构。我创建了几个S3存储桶,并希望Glue搜寻器每小时对这些存储桶进行一次爬网。我的Terraform Glue目录数据库,角色和策略都构建良好,但是当我尝试通过向爬网程序的s3_target{}一部分添加四个S3路径来创建爬网程序资源时,出现了故障:

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)}"
  }
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

Error: aws_glue_crawler.datalake_crawler: s3_target.0.path must be a single value, not a list
Run Code Online (Sandbox Code Playgroud)

我尝试在中添加一条count语句,s3_target但这失败。我也尝试添加

"${formatlist("%s", var.data_source_path)}"
Run Code Online (Sandbox Code Playgroud)

path争论中,但这也失败了。

我可以s3使用Terraform向Glue履带添加多个路径吗?我可以通过AWS控制台实现这一点,但这需要使用基础架构作为代码来完成。

yda*_*coR 6

要定位其他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}"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是简要提到的aws_glue_crawler资源文件在那里

s3_target(可选)列出嵌套的Amazon S3目标参数。见下文。

您还可以在资源模式源代码中看到这一点:

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}"
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)