【问题标题】:Is there a way to iterate over provider?有没有办法迭代提供者?
【发布时间】:2020-02-24 03:06:51
【问题描述】:

我已经设置了两个提供程序(2 个 aws 帐户),我想在每个帐户上启动一个 ec2 实例,而无需重复代码。

我尝试使用带有 count 和 for_each 的循环,但没有运气。

variable "providers" {
  default = [
    "aws.dev",
    "aws.qa"
  ]
}

resource "aws_instance" "test" {
  for_each      = toset(var.providers)
  ami           = "ami-0dc9a8d2479a3c7d7"
  instance_type = "t2.micro"
  provider      = each.value
}

我得到了下一个错误:

错误:provider.each:没有安装合适的版本 版本要求:“(任何版本)” 安装的版本:无

我尝试了类似的代码迭代其他值,如 ami 的实例类型,它可以工作。

我不确定是否有我看不到的东西或不支持的提供程序迭代。

对此有任何想法或解决方法吗?谢谢。

【问题讨论】:

    标签: amazon-web-services configuration terraform hcl


    【解决方案1】:

    Terraform 在其他处理之前将资源与提供者相关联(因为提供者选择会影响 aws_instance 的含义,从而影响内部有效的其他内容),因此 provider 参数必须是对提供者的字面引用。此处的错误消息是因为 Terraform 认为您正在为名为“each”和 alias = "value" 的提供程序请求提供程序配置,因此它正在尝试安装该提供程序。

    在 Terraform 中表示多个环境的主要方式是为每个环境使用单独的根模块,其中包含该环境的后端和提供程序配置,然后将环境之间共享的公共元素分解为一个或多个共享模块。然后,您可以分别对每个环境应用更改,从而降低对一个环境的机会无意中影响另一个环境的风险。

    【讨论】:

    • 感谢您的解释。为每个环境分离根模块意味着“terraform apply”每次都需要在每个环境中运行,对吗?
    • 是的,terraform apply 一次只会将更改应用于一个配置。对于许多用户来说,这是一个优势,因为这意味着他们可以例如将更改应用于暂存环境而不会影响生产环境,可以轻松地将每个环境的凭据彼此完全分开,等等。
    • 而且在许多情况下也是一个巨大的劣势,例如,如果您对多个 AWS 账户进行对等互连,您将不会有 10 种不同的申请。
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2020-12-31
    • 2016-09-23
    • 1970-01-01
    • 2021-05-06
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多