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 }
说明
- 数据源
aws_efs_file_system仅用于读取已有资源的信息,不会创建或修改资源,避免了手动指定id的问题。 - 副本EFS的标签、策略等资源需要单独配置,因为跨区域复制默认不会同步这些附属配置。
- 确保
provider = aws.oh指向的是副本所在区域(us-east-2)的AWS提供商配置。
内容的提问来源于stack exchange,提问作者Troy
相关产品推荐
相关产品推荐

