首页 文章

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

提问于
浏览
8

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

  • VPC创建

  • 子网创建

  • 实例创建等

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

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

Terraform配置如下:

$ HOME / modules / providers / main.tf

provider "aws" {
  region = "${var.region}"
}

$ HOME / modules / providers / variables.tf

variable "region" {}

$ HOME / modules / 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"
  }
}

$ HOME / modules / vpc / variables.tf

variable "vpc_cidr" {}
variable "environment" {}
variable "region" {}

$ HOME / main.tf

module "dev_vpc" {
  source = "modules/vpc"
  vpc_cidr = "${var.vpc_cidr}"
  environment = "${var.environment}"
  region = "${var.region}"
}

$ HOME / variables.tf

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

variable "environment" {
  default = "dev"
}

variable "region" {
  default = "ap-south-1"
}

然后,当在 $HOME/ 位置运行 terraform plan 命令时,它不会获取提供程序值,而是要求输入区域的用户输入 .

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

  • 在Terraform模块中包装提供程序

  • 使用提供程序模块或任何其他方式处理多个区域用例 .

1 回答

  • 6

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

    但是,自Terraform 0.8以来,现在可以使用以下语法设置dependency on modules

    module "network" {
      # ...
    }
    
    resource "aws_instance" "foo" {
      # ...
    
      depends_on = ["module.network"]
    }
    

    但是,如果我通过更改 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"]
    }
    

    然后对它运行 terraform graph | dot -Tpng > graph.png 它看起来像那里没有't change at all from when the explicit dependency isn' .

    这似乎可能是Terraform中图形构建阶段的一个潜在错误,它可能应该被提升为issue但我不知道核心代码库是否足以发现需要进行更改的位置 .

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

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

相关问题