【问题标题】:Passing Alias AWS Provider to Child Module Terraform将别名 AWS Provider 传递给子模块 Terraform
【发布时间】:2022-01-20 12:57:52
【问题描述】:

我正在尝试将两个 AWS Terraform 提供程序传递给我的子模块。我希望默认保持无别名,因为我无法通过并为父模块中的所有 terraform 资源添加提供程序。

父模块------------------------------------------ 版本.tf

terraform {
  required_version = "~> 1.0"

  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "some-org"

    workspaces {
      prefix = "some-state-file"
    }
  }

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
      configuration_aliases = [ aws.domain-management ]
    }
  }
}

provider "aws" {
  access_key = var.aws_access_key_id
  secret_key = var.aws_secret_access_key
  region     = var.aws_region

  default_tags {
    tags = {
      Application = var.application_name
      Environment = var.environment
    }
  }
}

provider "aws" {
  alias      = "domain-management"
  region     = var.domain_management_aws_region
  access_key = var.domain_management_aws_access_key_id
  secret_key = var.domain_management_aws_secret_access_key
}

module.tf(调用子模块)

module "vanity-cert-test" {
  source = "some-source"

  fully_qualified_domain_name = "some-domain.com"
  alternative_names           = ["*.${var.dns_zone.name}"]
  application_name            = var.application_name
  environment                 = var.environment
  service_name                = var.service_name
  domain_managment_zone_name  = "some-domain02.com"

  providers = {
    aws.domain-management = aws.domain-management
  }
}

子模块------------------------------ ----------

versions.tf

terraform {
  required_version = "~> 1.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
      confiuration_aliases = [aws.domain-management]
    }
  }
}

provider "aws" {
  alias = domain-management
}

route53.tf

# Create validation Route53 records
resource "aws_route53_record" "vanity_route53_cert_validation" {
  # use domain management secondary aws provider
  provider = aws.domain-management

  for_each = {
    for dvo in aws_acm_certificate.vanity_certificate.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }

  zone_id         = data.aws_route53_zone.vanity_zone.zone_id
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  allow_overwrite = true
}

这种情况的用例是在一个单独的帐户中定义一个虚证书,该证书的 DNS 验证需要去该帐户。目前在运行此程序时,我收到以下错误: terraform plan -var-file=./application.tfvars

╷
│ Warning: Provider aws.domain-management is undefined
│ 
│   on services/self-service-ticket-portal-app/ssl-certificate.tf line 33, in module "vanity-cert-test":
│   33:     aws.domain-management = aws.domain-management
│ 
│ Module module.services.module.self-service-ticket-portal-app.module.vanity-cert-test does not declare a provider named aws.domain-management.
│ If you wish to specify a provider configuration for the module, add an entry for aws.domain-management in the required_providers block within the module.
╵
╷
│ Error: missing provider module.services.module.self-service-ticket-portal-app.provider["registry.terraform.io/hashicorp/aws"].domain-management

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    如果您的“父模块”是根模块,那么您不能在其中使用configuration_aliasesconfiguration_aliases 仅用于child modules

    要在模块中声明配置别名以便从父模块接收备用提供程序配置,请将 configuration_aliases 参数添加到该提供程序的 required_providers 条目。

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2020-03-03
      • 2019-05-20
      • 2023-03-23
      • 2020-12-10
      • 2017-01-04
      • 1970-01-01
      • 2023-02-05
      • 2021-03-29
      相关资源
      最近更新 更多