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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:52:26