【问题标题】:Terraform: how to support different providersTerraform:如何支持不同的提供者
【发布时间】:2019-01-30 10:49:40
【问题描述】:

我在名为 myproject 的目录中有一组 terraform 代码:​​

\myproject\ec2.tf
\myproject\provider.tf
\myproject\s3.tf
      ....

provider.tf 显示:

provider "aws" {
  region  = "us-west-1"
  profile = "default"
}

所以,如果我在 myproject 文件夹中应用 terraform,则会在我的帐户下的 us-west-1 中启动一组 aws 资源。

现在我想介绍一个 AWS Glue 资源,它仅在不同的区域 us-west-2 中可用。那么我该如何布局glue.tf 文件呢?

目前我将其存储在 myproject 下的子目录中,并在该子目录中运行 terraform apply 即

\myproject\glue\glue.tf
\myproject\glue\another_provider.tf

another_provider.tf 是:

provider "aws" {
  region  = "us-west-2"
  profile = "default"
}

是不是只能在不同区域存储文件启动资源?有更好的方法吗?

如果没有更好的办法,那么我还需要在glue子文件夹中再有一个后端文件,另外,myproject目录下的一些公共变量不能共享。

--------- 更新: 我点击了 Phuong Nguyen 发布的链接,

provider "aws" {
  region  = "us-west-1"
  profile = "default"
}

provider "aws" {
  alias  = "oregon"
  region = "us-west-2"
  profile = "default"
}

resource "aws_glue_connection" "example" {
  provider = "aws.oregon"
   ....
}

但我看到了:

Error: aws_glue_connection.example: Provider doesn't support resource:     aws_glue_connection

【问题讨论】:

    标签: terraform-provider-aws


    【解决方案1】:

    您可以使用提供者别名来定义多个提供者,例如

    # this is default provider
    provider "aws" {
      region  = "us-west-1"
      profile = "default"
    }
    
    # additional provider
    provider "aws" {
      alias  = "west-2"
      region  = "us-west-2"
      profile = "default"
    }
    

    然后在您的glue.tf 中,您可以将别名提供者称为:

    resource "aws_glue_job" "example" {
      provider = "aws.west-2"
    
      # ...
    }
    

    更多详情请访问Multiple Provider Instances 部分:https://www.terraform.io/docs/configuration/providers.html

    【讨论】:

    • 嗨,phuong Nguyen:谢谢,我也看到了那个链接。但是当我运行 terraform apply 时,我仍然看到 Error: aws_glue_connection.example: Provider doesn't support resource: aws_glue_connection
    • @user389955 抱歉,我对 AWS Glue 不是很熟悉。 Glue 连接资源是否可能不是特定于区域的?也许你可以尝试在一个区域创建粘合连接,然后切换到另一个区域,看看它是否仍然可见
    • Phuong Nguyen,胶水连接和所有胶水组件必须在 us-west-2 中,这就是我尝试使用不同供应商的原因。如果我在\myproject\glue\glue.tf 中实现glue 并使用\myproject\glue\another_provider.tf,那么在us-west-2 中成功创建了glue,但是如果我将glue.tf 放在\myproject 中,连同其他 AWS 资源,它显示了该错误。请注意这两种情况,我使用后端 s3 来存储远程状态,并且 s3 在 us-west-1 中。
    • 不知何故,这个答案对我不起作用。我收到错误:aws_glue_connection.example:提供程序不支持资源:aws_glue_connection。但我会投票给 Phuong Nguyen 的答案,因为它应该以这种方式解决。可能我的配置有问题。
    • 来自生活的智慧——即使我可以做某事,也不代表你应该做。这种 ^^^ 方法有效,但是应该非常小心,不要将代码与配置混合在一起,不幸的是,terraform 提供者是提供大枪射击自己脚的完美示例....我是一个已经在一个巨大的 terraform 代码库(70% 由 Phuong Nguyen 创建)中重构这个大流程的人已经 5 个月了
    【解决方案2】:

    阅读我的comment ...

    这基本上意味着您应该尽可能远离 aws 配置文件和区域,以及您的 terraform 代码中不包含的内容,并将它们用作配置,如下所示:

    terraform {
        required_version = "1.0.1"
    
        required_providers {
          aws = {
            version = ">= 3.56.0"
            source  = "hashicorp/aws"
          }
        }
    
        backend "s3" {}
      }
    
      provider "aws" {
        region  = var.region
        profile = var.profile
      }
    

    比使用tfvars配置文件:

      cat cnf/env/spe/prd/tf/03-static-website.backend-config.tfvars
    
      profile        = "prd-spe-rcr-web"
      region         = "eu-north-1"
      bucket         = "prd-bucket-spe"
      foobar         = "baz"
    
      
    

    您将在 terraform 计划期间应用,并按如下方式应用调用:

        terraform -chdir=$tf_code_path plan -var-file=<<line-one-^^^>>.tfvars 
    
        terraform -chdir=$tf_code_path plan -var-file=<<like-the-one-^^^>>.tfvars -auto-approve
    

    根据经验,您应该始终将代码和配置分开,它们越混杂,您就越会陷入麻烦……这适用于任何编程语言/项目等。现在一些明智的人会争辩说 terraform代码本身就是配置,但不是。您应用程序中的 terraform 代码是声明性源代码,用于配置您的应用程序中的应用程序源代码等使用的二进制基础架构...

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2019-03-23
      • 2011-07-18
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多