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

时间:2017-05-02 07:56:01

标签: terraform

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

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

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

    Terraform配置如下:

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

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

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

    variable "region" {}
    

    $ 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"
      }
    }
    

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

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

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

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

1 个答案:

答案 0 :(得分: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,看起来图表根本没有明显依赖的时候就没有变化。

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

对于我们的使用,我们在Terraform代码库中使用符号链接 ,其中一些是Terraform支持其他工作方式之前的历史,但可以在这里工作。

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