在Terraform 0.12.13中将多个提供程序别名传递给模块

时间:2019-11-06 15:23:42

标签: terraform

我正在构建需要与两个不同的AWS帐户进行通信的代码,文档说这应该起作用。这在0.11.14下工作

主要是在我的provider.tf文件中:

provider "aws" {
  alias = "ca-central-1"
  region = "ca-central-1"
  profile = var.aws_profile
}

provider "aws" {
   alias = "other-ca-central-1"
   region = "ca-central-1"
   profile = var.aws_other_profile
}

(这些变量在我的凭据文件中设置了正确的配置文件。)

在根目录中,在调用模块的代码中,

module "obfuscated" {
  source = "./modules/obfuscated"
  providers = {
    aws.main = "aws.ca-central-1"
    aws.other = "aws.other-ca-central-1"
  }
  #other stuff
}

在./modules/obfuscated/main.tf中,我有

provider "aws" {
  alias = "main"
}
provider "aws" {
  alias = "other"
}

文档中所说的是一个占位符,只能为空或具有别名。没有它,它会抱怨提供者不存在。 但是有了它,它抱怨我没有指定与文档冲突的区域。

文档肯定不会错,不,那不可能。.帮助我obi-wan-overflow ..

3 个答案:

答案 0 :(得分:0)

我也遇到了同样的问题,只是扮演了一个角色。因此,就我而言,我提供了要使用的角色。在模块目录中,例如 my_module ,我在提供程序中有一个tf文件。在块提供程序内部,我有这个:

variable "role_arn" {}

provider "aws" {
  alias   = "first"
  region  = "eu-west-1"
  version = "2.24.0"

  assume_role {
    role_arn = "${var.role_arn}"
  }
}

例如,在my_module目录中的tf文件中,使用提供程序来创建EC2实例,

resource "aws_instance" "my_instance" {
  [...]
  provider = "aws.first"
}

在我项目的根目录中,我有这个:

module "using_my_module" {
  source = "modules/my_module"

  role_arn = "arn:aws:iam::123456789012:role/role_to_assume"
}

我承认这是一种技术性解决方法,因此它看上去可能很难看,但对我有用!

我希望它能对您有所帮助!

答案 1 :(得分:0)

以下是我如何处理此问题的示例

#af-south-1
data aws_vpcs af-south-1 {
    provider = aws.af-south-1
}

module af-south-1 {
    source = "./modules/flow_log"
    providers = {
        aws = aws.af-south-1
    }
    iam_role_arn = aws_iam_role.vpc_flow_log.arn
    log_destination = aws_s3_bucket.vpc_flow_log.arn
    log_destination_type = "s3"
    traffic_type = "REJECT"
    aws_vpc_ids = data.aws_vpcs.af-south-1.ids
    depends_on = [ aws_s3_bucket.vpc_flow_log ]
}

#ap-east-1
data aws_vpcs ap-east-1 {
    provider = aws.ap-east-1
}

module ap-east-1 {
    source = "./modules/flow_log"
    providers = {
        aws = aws.ap-east-1
    }
    iam_role_arn = aws_iam_role.vpc_flow_log.arn
    log_destination = aws_s3_bucket.vpc_flow_log.arn
    log_destination_type = "s3"
    traffic_type = "REJECT"
    depends_on = [ aws_s3_bucket.vpc_flow_log ]
    aws_vpc_ids = data.aws_vpcs.ap-east-1.ids
}

#ap-northeast-1
data aws_vpcs ap-northeast-1 {
    provider = aws.ap-northeast-1
}
....

在此示例中,我为每个提供者区域创建一个数据源aws_vpcs。然后,我将每个区域的ID列表传递到模块中。此时,除非使用默认提供程序,否则必须指定要使用的模块的提供程序。

答案 2 :(得分:0)

主要问题可能是您试图将提供者值作为字符串传递,而不是对实际提供者的引用。 "aws.<alias>" vs aws.<alias>

我可能错了,但我认为您需要在模块 required_providers 块中包含 terraform

terraform {
    required_providers {
        aws = {
            source  = "hashicorp/aws"
            version = ">= 2.7.0"
        }
    }
}

然后您可以使用一个空的 provider 或一个带有 alias 的将提供程序声明为要在模块 providers 配置中传递的必需项。