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

Terraform同模块内引用EFS副本ID配置资源报错求助

EFS复制后无法引用副本文件系统ID配置资源的解决方法

问题说明

创建EFS文件系统并配置跨区域复制后,想要用aws_efs_replication_configuration.efs.destination[0].file_system_id获取副本文件系统ID,用来配置副本的标签、文件系统策略、VPC关联等资源。但在同一Terraform脚本中定义aws_efs_file_system.efs-dr时,手动设置id字段为该副本ID,执行terraform apply时触发错误:

Error: Invalid or unknown key
│
│   with aws_efs_file_system.efs-dr,
│   on efstemplate.tf line 59, in resource "aws_efs_file_system" "efs-dr":
│   59:   id = aws_efs_replication_configuration.efs.destination[0].file_system_id

错误原因

aws_efs_file_system资源的id是只读属性,由AWS自动生成分配,Terraform不允许用户手动指定这个字段。直接赋值会被判定为非法配置,因此报错。

解决方案

不需要通过重新定义aws_efs_file_system资源来管理副本,改用**数据源aws_efs_file_system**获取副本的信息,再基于这个数据源配置标签、策略等附属资源。

修改后的代码示例

resource "aws_efs_file_system" "efs" {
  encrypted = true
  tags = {
    Name        = "efs"
    Team        = "infra"
    Environment = "mod"
    Business    = "enterprise"
  }
}

resource "aws_efs_replication_configuration" "efs" {
  source_file_system_id = aws_efs_file_system.efs.id
  destination {
    region = "us-east-2"
  }
}

# 用数据源获取副本EFS文件系统信息
data "aws_efs_file_system" "efs_dr" {
  file_system_id = aws_efs_replication_configuration.efs.destination[0].file_system_id
  provider       = aws.oh
  depends_on     = [aws_efs_replication_configuration.efs]
}

# 配置副本的标签(副本默认不会同步源的标签,需手动设置)
resource "aws_efs_tags" "efs_dr" {
  file_system_id = data.aws_efs_file_system.efs_dr.id
  provider       = aws.oh

  tags = {
    Name        = "efs-dr"
    Team        = "infra"
    Environment = "mod"
    Business    = "enterprise"
  }
}

# 示例:配置副本的文件系统策略
resource "aws_efs_file_system_policy" "efs_dr" {
  file_system_id = data.aws_efs_file_system.efs_dr.id
  provider       = aws.oh

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          AWS = "*"
        }
        Action = "elasticfilesystem:ClientMount"
        Resource = data.aws_efs_file_system.efs_dr.arn
        Condition = {
          StringEquals = {
            "aws:PrincipalTag/Team" = "infra"
          }
        }
      }
    ]
  })
}

output "destination_file_system_id" {
  value = aws_efs_replication_configuration.efs.destination[0].file_system_id
}

说明

  1. 数据源aws_efs_file_system仅用于读取已有资源的信息,不会创建或修改资源,避免了手动指定id的问题。
  2. 副本EFS的标签、策略等资源需要单独配置,因为跨区域复制默认不会同步这些附属配置。
  3. 确保provider = aws.oh指向的是副本所在区域(us-east-2)的AWS提供商配置。

内容的提问来源于stack exchange,提问作者Troy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:29:56