如何创建支持多个AWS区域的提供模块?

San*_*rma 8 terraform

我们正在尝试为AWS中的以下活动创建Terraform模块,以便我们可以在需要的地方使用它们.

  1. VPC创建
  2. 子网创建
  3. 实例创建等

但是在创建这些模块时,我们必须在上面列出的所有模块中定义提供者.所以我们决定为提供者创建一个模块,以便我们可以在其他模块(VPC,Subnet等)中调用该提供者模块.

上述方法的问题在于它没有采用提供者值,并要求用户输入区域.

Terraform配置如下:

$ HOME /模块/供应商/ main.tf

provider "aws" {
  region = "${var.region}"
}
Run Code Online (Sandbox Code Playgroud)

$ HOME /模块/供应商/ variables.tf

variable "region" {}
Run Code Online (Sandbox Code Playgroud)

$ HOME /模块/ VPC/main.tf

module "provider" {
  source = "../../modules/providers"
  region = "${var.region}"
}

resource "aws_vpc" "vpc" {
  cidr_block = "${var.vpc_cidr}"
  tags = {
    "name" = "${var.environment}_McD_VPC"
  }
}
Run Code Online (Sandbox Code Playgroud)

$ HOME /模块/ VPC/variables.tf

variable "vpc_cidr" {}
variable "environment" {}
variable "region" {}
Run Code Online (Sandbox Code Playgroud)

$ HOME/main.tf

module "dev_vpc" {
  source = "modules/vpc"
  vpc_cidr = "${var.vpc_cidr}"
  environment = "${var.environment}"
  region = "${var.region}"
}
Run Code Online (Sandbox Code Playgroud)

$ HOME/variables.tf

variable "vpc_cidr" {
  default = "192.168.0.0/16"
}

variable "environment" {
  default = "dev"
}

variable "region" {
  default = "ap-south-1"
}
Run Code Online (Sandbox Code Playgroud)

然后,当terraform plan$HOME/位置运行命令时,它不采用提供者值而是要求用户输入区域.

我需要Terraform专家的帮助,我们应采取什么方法来解决以下问题:

  1. 在Terraform模块中包装提供程序
  2. 使用提供程序模块或任何其他方式处理多个区域用例.

yda*_*coR 6

我很久以前就知道不可能这样做,因为Terraform构建了一个图表,在它包含任何依赖项之前需要任何资源的提供程序,并且以前不可能强制依赖于模块.

但是,自从Terraform 0.8以来,现在可以使用以下语法设置对模块依赖:

module "network" {
  # ...
}

resource "aws_instance" "foo" {
  # ...

  depends_on = ["module.network"]
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用您的设置,请更改modules/vpc/main.tf为以下内容:

module "aws_provider" {
  source = "../../modules/providers"
  region = "${var.region}"
}

resource "aws_vpc" "vpc" {
  cidr_block = "${var.vpc_cidr}"
  tags = {
    "name" = "${var.environment}_McD_VPC"
  }
  depends_on = ["module.aws_provider"]
}
Run Code Online (Sandbox Code Playgroud)

并且terraform graph | dot -Tpng > graph.png针对它运行,看起来图形根本不会发生显式依赖关系.

这似乎可能是Terraform中图形构建阶段的一个潜在错误,可能会引发问题,但我不太了解核心代码库,以确定需要进行更改的位置.

对于我们的使用,我们在Terraform代码库中大量使用符号链接,其中一些在Terraform支持其他处理方式之前具有历史意义,但可以在此处使用.

我们只需在单个.tf文件中定义提供程序(例如environment.tf)以及您运行Terraform的每个地方所需的任何其他通用配置(即不在模块级别),然后将其符号链接到每个位置.这允许我们在必要时在可覆盖变量的单个位置定义提供者.