Terraform批量传文件至GCP Bucket报错:for_each参数类型不匹配
解决Terraform GCS批量上传的for_each错误并实现目录结构需求
错误原因
for_each 参数要求是map类型或字符串集合(set of strings),而你当前传入的是tuple类型,因此触发错误。我们需要将本地文件路径列表转换为符合要求的map结构,同时实现目标目录结构。
解决方案步骤
1. 定义本地变量,遍历所有metric及对应文件
通过fileset函数获取所有metric名称,再遍历每个metric下dags目录的所有文件,构建包含本地路径和Bucket目标路径的map:
locals { # 获取metrics目录下的所有metric名称(a_metric、b_metric等) metric_names = fileset("metrics", "*") # 构建每个文件的本地路径与Bucket目标路径映射,转换为map(key为Bucket路径,确保唯一性) metrics_files_map = { for file_entry in flatten([ for metric in local.metric_names : [ for file_path in fileset("metrics/${metric}/dags", "**") : { local_path = "metrics/${metric}/dags/${file_path}" bucket_path = "dags/${metric}/${file_path}" } ] ]) : file_entry.bucket_path => file_entry } }
2. 批量创建GCS Bucket对象
使用google_storage_bucket_object资源,通过for_each遍历上述map,实现批量上传:
resource "google_storage_bucket_object" "metric_dags" { for_each = local.metrics_files_map # Bucket中目标路径,对应dags/metric_name/xxx name = each.value.bucket_path # 本地文件路径 source = each.value.local_path # 替换为你的GCS Bucket名称 bucket = "your-target-bucket-name" # 可选:添加文件元数据(如缓存控制、内容类型) # cache_control = "public, max-age=3600" # content_type = "text/plain" }
效果验证
- 本地
metrics/a_metric/dags/shared/file会被上传到gs://your-bucket/dags/a_metric/shared/file - 本地
metrics/b_metric/dags/file会被上传到gs://your-bucket/dags/b_metric/file - 完全匹配你期望的Bucket目录结构
内容的提问来源于stack exchange,提问作者lubi_nascimento
相关产品推荐
相关产品推荐

