Terraform:如何支持不同的供应商

Terraform: how to support different providers

我在名为 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

另一个_provider.tf是:

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

一个文件启动资源是不是只能存放在不同区域?还有更好的办法吗?

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

------------更新: 我关注了 Phuong Nguyen 发布的 link,

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

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

# 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

阅读我的 ...

这基本上意味着您应该尽可能地将 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 代码是声明性源代码,用于提供应用程序源代码等使用的二进制基础结构 ...