添加多个 S3 路径以使用 terraform 粘合爬虫

Posted

技术标签:

【中文标题】添加多个 S3 路径以使用 terraform 粘合爬虫【英文标题】:Adding multiple S3 paths to glue crawler with terraform 【发布时间】:2019-07-12 04:00:19 【问题描述】:

我正在使用 Terraform 在 AWS 中构建一些基础设施。我创建了几个 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

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

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

path 参数中,但这也失败了。

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

【问题讨论】:

我没有使用过 Glue,但从快速查看文档看来,您可以为每个路径重复 s3_target 块。现在在我的手机上,因此无法对其进行测试以使其成为正确答案。 将三个s3_target 块添加到胶水爬虫资源允许我将所有四个存储桶添加到爬虫。我已经查看了胶水文档,但没有发现任何地方让我相信我可以复制 s3_target 块。你能帮我看看丢失了什么吗?另外,我可以根据变量以编程方式添加这些块吗?当您回到盒子时,请随意添加作为答案;很高兴接受。 【参考方案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 resource docs 中简要提到过says:

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

你也可以在source code for the resource's schema看到这个:

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

不幸的是,在 0.12 之前,您不能直接在 Terraform 中以编程方式构建它来循环动态路径列表,并且需要静态指定它们。

Terraform 0.12 将引入 HCL2,它可以更好地支持循环(除了使用 count),包括 dynamic blocks,这将允许您执行以下操作:

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 路径以使用 terraform 粘合爬虫的主要内容,如果未能解决你的问题,请参考以下文章

从 terraform 上传 AWS S3 中的多个文件

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?

如何创建通用 cosmos db terraform 模块以添加多个地理位置

[S3使用Terraform进行跨区域复制

Terraform ELB S3 权限问题

在 Terraform 中创建 S3 存储桶通知时出错