无法通过Terraform为单个EFS挂载多子网目标及报错排查
问题解决:Terraform EFS 创建报错及多文件系统问题
报错信息
Error: putting EFS file system (fs-0c479ab4b699829d1) lifecycle configuration: InvalidParameter: 1 validation error(s) found.
│ - missing required field, PutLifecycleConfigurationInput.LifecyclePolicies.
同时执行过程中意外创建了2个EFS文件系统,第二个无挂载目标。
错误原因分析
- 生命周期策略格式不兼容:AWS Provider v4.0及以上版本中,
aws_efs_file_system资源的单块lifecycle_policy已被弃用,AWS API要求传入复数形式的生命周期策略列表,单块配置会导致API请求缺失必填字段LifecyclePolicies。 - 子网数据源配置错误:
data.aws_subnets.private设置了count = length(data.aws_availability_zones.azs.names),会创建与可用区数量相同的数据源实例,每个实例都会返回所有匹配的私有子网,后续挂载目标的count计算逻辑混乱,甚至触发非预期的资源重复创建。
修正后的代码
1. 修正EFS文件系统资源(修复生命周期策略)
resource "aws_efs_file_system" "efs" { creation_token = var.efs_token performance_mode = var.efs_performance_mode encrypted = true # 使用复数形式的lifecycle_policies块,适配AWS Provider v4.x+ lifecycle_policies { transition_to_ia = "AFTER_30_DAYS" } tags = local.mandatory_tags }
2. 修正子网数据源(移除多余count)
data "aws_subnets" "private" { filter { name = "tag:Name" values = ["${local.name_prefix}-vpc-private*"] } filter { name = "vpc-id" values = [data.aws_vpc.this.id] } }
3. 修正挂载目标资源(正确计算子网数量)
resource "aws_efs_mount_target" "efs_mount" { count = length(data.aws_subnets.private.ids) depends_on = [aws_efs_file_system.efs] file_system_id = aws_efs_file_system.efs.id subnet_id = data.aws_subnets.private.ids[count.index] }
额外说明
- 执行修正代码前,先手动清理之前错误创建的无挂载目标EFS文件系统,避免资源冲突。
- 建议在
versions.tf中明确指定AWS Provider版本,确保兼容性:
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
内容的提问来源于stack exchange,提问作者ASingh
相关产品推荐
相关产品推荐

