You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过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文件系统,第二个无挂载目标。


错误原因分析

  1. 生命周期策略格式不兼容:AWS Provider v4.0及以上版本中,aws_efs_file_system资源的单块lifecycle_policy已被弃用,AWS API要求传入复数形式的生命周期策略列表,单块配置会导致API请求缺失必填字段LifecyclePolicies。
  2. 子网数据源配置错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:47