Terraform添加多个aws_s3_bucket_object及相关问题求助
Terraform S3 实战问题解决
问题1:Prod目录对象未上传到S3桶
按以下步骤排查解决:
- 检查Prod目录内容:确认
C:\Users\SHETTSX18\Desktop\Terraform\S3_bucket\statefiles\Prod目录下存在需要上传的文件。如果目录为空,fileset函数会返回空集合,Terraform不会创建任何S3对象。 - 验证路径格式:Windows路径可尝试改用正斜杠(Terraform跨平台支持),将
"C:\\Users\\SHETTSX18\\Desktop\\Terraform\\S3_bucket\\statefiles\\Prod"替换为"C:/Users/SHETTSX18/Desktop/Terraform/S3_bucket/statefiles/Prod",避免转义字符引发的路径识别问题。 - 查看Terraform计划:执行
terraform plan命令,观察针对s3_object_Prod的输出。如果显示0 to add, 0 to change, 0 to destroy,说明fileset未匹配到任何文件,需检查路径或目录内容。 - 确认目录权限:确保运行Terraform的用户对Prod目录拥有读取权限,能正常访问目录内的文件。
问题2:合并文件夹变量并简化资源定义
将两个单独的字符串变量合并为一个映射(map)或列表(list)类型变量,同时合并重复的S3对象资源定义,减少代码冗余:
修改变量文件
使用映射类型变量(适用于本地目录名与S3文件夹名不同的场景):
variable "folder_mappings" { type = map(string) default = { "DevQa" = "DevQa" # 键:本地目录名,值:S3目标文件夹名 "Prod" = "Prod" } }
如果本地目录名与S3文件夹名完全一致,也可使用列表类型变量:
variable "folder_names" { type = list(string) default = ["DevQa", "Prod"] }
合并S3对象资源定义
替换原来的两个aws_s3_bucket_object资源,使用单个资源结合flatten函数遍历所有文件夹和文件:
对应映射类型变量的写法
resource "aws_s3_bucket_object" "state_files" { bucket = aws_s3_bucket.abt_tfstate.id for_each = flatten([ for local_folder, s3_folder in var.folder_mappings : [ for file in fileset("C:/Users/SHETTSX18/Desktop/Terraform/S3_bucket/statefiles/${local_folder}", "*") : { key = "${s3_folder}/${file}" source_path = "C:/Users/SHETTSX18/Desktop/Terraform/S3_bucket/statefiles/${local_folder}/${file}" } ] ]) key = each.value.key source = each.value.source_path }
对应列表类型变量的写法
resource "aws_s3_bucket_object" "state_files" { bucket = aws_s3_bucket.abt_tfstate.id for_each = flatten([ for folder in var.folder_names : [ for file in fileset("C:/Users/SHETTSX18/Desktop/Terraform/S3_bucket/statefiles/${folder}", "*") : { key = "${folder}/${file}" source_path = "C:/Users/SHETTSX18/Desktop/Terraform/S3_bucket/statefiles/${folder}/${file}" } ] ]) key = each.value.key source = each.value.source_path }
说明
flatten函数的作用是将嵌套的列表结构转换为一维列表,确保for_each能正确遍历每个需要上传的文件对象,实现批量创建S3对象的效果。
内容的提问来源于stack exchange,提问作者sumanth shetty
相关产品推荐
相关产品推荐

