1

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

2 回答 2

2

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

# 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

于 2018-08-24T01:32:42.177 回答
0

阅读我的评论...

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

于 2021-11-29T12:07:12.067 回答