【问题标题】:Passing multiple provider aliases to a module in terraform 0.12.13将多个提供程序别名传递给 terraform 0.12.13 中的模块
【发布时间】:2020-03-03 03:09:58
【问题描述】:

我正在构建需要与两个不同的 AWS 账户对话的代码,文档说这应该可以工作。这在 0.11.14

下工作

主要是在我的 providers.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..

【问题讨论】:

  • "aws-other-ca-central-1" 是您所尝试内容的准确副本,还是只是您发表评论时的编辑错误?正确的语法是aws.other-ca-central-1(带有句点而不是破折号),在 Terraform 0.12 中,您不需要引用这些引用,尽管 Terraform 0.12 会接受它,以与 0.11 兼容。跨度>
  • 转录错字。
  • 他们可能在没有记录的情况下进行了重大更改。 Terraform 文档在某些地方存在不准确之处,尤其是在很长一段时间内的 terraform taint 部分。

标签: terraform


【解决方案1】:

我也遇到了同样的问题,只是为了承担一个角色。因此,就我而言,我提供了要使用的角色 arn。在模块目录中,例如 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"
}

我承认这是一种技术解决方法,所以它可能看起来很难看,但它对我有用!

希望对你有帮助!

【讨论】:

    【解决方案2】:

    这是我如何处理问题的示例

    #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 列表传递到模块中。此时您必须指定要使用的模块提供程序,除非您使用的是默认提供程序。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-03-29
        • 2022-01-20
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        • 2021-09-28
        • 1970-01-01
        • 2021-01-03
        相关资源
        最近更新 更多