Amazon web services 添加多个S3路径以将爬虫与terraform粘合

Amazon web services 添加多个S3路径以将爬虫与terraform粘合,amazon-web-services,amazon-s3,terraform,aws-glue,terraform-provider-aws,Amazon Web Services,Amazon S3,Terraform,Aws Glue,Terraform Provider Aws,我正在用Terraform在AWS中构建一些基础设施。我有几个S3桶创建,并希望一个胶水爬虫抓取这些桶每小时一次。我的Terraform Glue catalog db、角色和策略都构建得很好,但是当我尝试通过向爬虫程序的S3\u target{}部分添加四条S3路径来创建爬虫程序资源时,我遇到了一个故障: resource "aws_glue_crawler" "datalake_crawler" { database_name = "${var.glue_db_name}" name

我正在用Terraform在AWS中构建一些基础设施。我有几个S3桶创建,并希望一个胶水爬虫抓取这些桶每小时一次。我的Terraform Glue catalog db、角色和策略都构建得很好,但是当我尝试通过向爬虫程序的
S3\u 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)}"
  }
}
这会导致一个错误:

Error: aws_glue_crawler.datalake_crawler: s3_target.0.path must be a single value, not a list
我尝试在
s3\u目标中添加
count
语句,但失败了。我还尝试添加

"${formatlist("%s", var.data_source_path)}"
path
参数中,但这也失败了


我是否可以将多个
s3
路径添加到具有Terraform的粘合爬虫?我可以通过AWS控制台实现这一点,但这需要使用基础结构作为代码来完成。

要定位其他S3路径,您只需重复多次
S3\u目标
块,如下所示:

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}"
  }
}
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
    }
  }
}
这一点在下文中简要提及:

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

您也可以在中看到这一点:

“s3_目标”:{
类型:schema.TypeList,
可选:true,
最小项: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}" 

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

  s3_target {
    path = "${var.data_source_path_2}"
  }
}
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
    }
  }
}

我没有使用Glue,但从快速查看文档来看,似乎您可以为每个路径重复
s3\u目标
块。现在在我的手机上,所以无法测试它以得出正确的答案。向Glue爬虫资源添加三个
s3\u目标
块使我可以将我的所有四个桶添加到爬虫。我进行了复查编辑了glue docs,但没有看到任何地方让我相信我可以复制
s3\u目标
块。你能帮我看看缺少了什么吗?另外,我可以根据变量以编程方式添加这些块吗?回到框中时,请随意添加作为答案;乐意接受。