我正在用Terraform构建一些基础架构。我创建了几个S3存储桶,并希望胶水爬网每小时爬一次。我的Terraform Glue目录DB,角色和策略都可以构建正常,但是当我尝试通过在CRAWLER的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)}"
}
}
这会导致错误:
Error: aws_glue_crawler.datalake_crawler: s3_target.0.path must be a single value, not a list
我尝试在s3_target
中添加count
语句,但这会失败。我也尝试添加
"${formatlist("%s", var.data_source_path)}"
在path
参数中,但这也失败了。
我可以在带有Terraform的胶水轨道上添加多个s3
路径吗?我可以通过AWS控制台实现这一目标,但这需要使用基础结构作为代码完成。
要针对其他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(可选)列表嵌套了亚马逊S3目标参数。请参阅下面。
您还可以在资源架构的源代码中看到这一点:
"s3_target": {
Type: schema.TypeList,
Optional: true,
MinItems: 1,
不幸的是,前0.12,您无法直接在Terraform上构建此此此操作,以在动态路径列表上循环循环,并且需要静态指定它们。
Terraform 0.12将引入HCl2,该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
}
}
}