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 代码是声明性源代码,用于提供应用程序源代码等使用的二进制基础结构 ...
我在名为 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 代码是声明性源代码,用于提供应用程序源代码等使用的二进制基础结构 ...