【问题标题】:Terraform pass variables to a child moduleTerraform 将变量传递给子模块
【发布时间】:2018-09-07 04:28:34
【问题描述】:

我正在尝试使用以下语法将变量从 root module 传递给 child module

ma​​in.tf:

provider "aws" {
  version = "~> 1.11"
  access_key = "${var.aws_access_key}"
  secret_key = "${var.aws_secret_key}"
  region     = "${var.aws_region}"
}

module "iam" {
  account_id = "${var.account_id}"
  source = "./modules/iam"
}

 * account_id value is stored on variables.tf in the root folder

/modules/iam/iam.tf

resource "aws_iam_policy_attachment" "myName" {
    name       = "myName"
    policy_arn = "arn:aws:iam::${var.account_id}:policy/myName" <-- doesnt work
    groups     = []
    users      = []
    roles      = []
}

当我尝试在模块内访问 account_id 时,会引发错误。

【问题讨论】:

    标签: terraform


    【解决方案1】:

    您需要在模块级别本身声明模块使用的任何变量:

    variable "account_id" {
    }
    
    resource "aws_iam_policy_attachment" "myName" {
        name       = "myName"
        policy_arn = "arn:aws:iam::${var.account_id}:policy/myName"
        groups     = []
        users      = []
        roles      = []
    }
    

    【讨论】:

    • 正确,但最好遵循 OP 已经使用的方法:一个专用 variables.tf 文件,其中包含所有变量及其默认值。
    • 澄清一下,这里声明变量是继承父模块同名变量的值?
    • @ErikMaldonado 除非在较新的版本中发生了一些变化(我有一段时间没有参与 TF),不会。请注意,在 OP 中,使用模块时正在传入变量。如果没有这个额外的声明,它本身就不起作用。同样,如果不按照 OP 传递它,则只会使用在变量的模块版本中声明的默认值,否则我认为它会引发错误。
    【解决方案2】:

    James 是正确的,但他的语法只适用于字符串变量。对于其他人,您必须指定“空白默认值”:

    variable "passed_list_var" {
        default = []
    }
    
    variable "passed_map_var" {
        default = {}
    }
    

    【讨论】:

    • 只想添加评论以感谢ondrej-bardon,因为这帮助我解决了困扰我几天的问题。
    猜你喜欢
    • 2023-03-23
    • 2019-05-20
    • 2020-12-10
    • 1970-01-01
    • 2020-10-13
    • 2022-01-20
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多