Terraform技术问题:如何将数据或本地值传入.tfvars变量
问题分析与解决方案
首先明确:terraform.dev.tfvars是用来给输入变量赋值的配置文件,而data.aws_ssm_parameter.s3_ap_params.value或local.s3_ap_arn是Terraform运行时生成的计算值/输出值,两者是输入和输出的关系,不能直接把后者写到tfvars里。下面给你几种正确的处理方式:
1. 直接在Terraform配置中使用该值
如果是要在当前配置的其他资源里用到这个S3访问点ARN,直接引用local.s3_ap_arn或者data.aws_ssm_parameter.s3_ap_params.value即可,完全不需要修改tfvars。
示例:
# 比如你有一个S3 bucket策略需要用到这个ARN resource "aws_s3_bucket_policy" "example" { bucket = aws_s3_bucket.example.id policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = "*" Action = "s3:GetObject" Resource = "${local.s3_ap_arn}/*" } ] }) }
2. 作为模块输入传递给其他模块
如果这个ARN是要传给另一个Terraform模块的输入变量,在调用模块时直接传参即可,不用写tfvars。
示例:
module "logging_module" { source = "./modules/logging" # 直接把本地计算值传给模块的输入变量 s3_access_arn = local.s3_ap_arn }
3. 生成包含该值的tfvars文件(如果确实需要)
如果一定要把这个值导出到一个tfvars文件供后续使用,可以用local_file资源来生成:
resource "local_file" "generated_tfvars" { filename = "./terraform.generated.dev.tfvars" content = <<EOF s3_access_arn = "${local.s3_ap_arn}" EOF }
运行terraform apply后,会在当前目录生成terraform.generated.dev.tfvars文件,里面就包含了正确赋值的s3_access_arn变量。
额外优化提示
你的代码里有个重复的data "aws_ssm_parameter" "s3_ap_params",其实没必要——因为你已经通过resource "aws_ssm_parameter" "s3_ap_params"创建了参数,直接用aws_ssm_parameter.s3_ap_params.value就能拿到值,不需要再用data数据源去读取,这样可以简化代码:
# 移除重复的data块,直接用resource的输出 locals { s3_ap_arn = aws_ssm_parameter.s3_ap_params.value }
内容的提问来源于stack exchange,提问作者Sayon
相关产品推荐
相关产品推荐

