我在一个名为myproject的目录中有一组地形代码:
myprojectec2.tf
myprojectprovider.tf
myprojects3.tf
....
provider.tf 显示:
provider "aws" {
region = "us-west-1"
profile = "default"
}
因此,如果我在 MyProject 文件夹中进行地形化应用,则会在我的账户下的 us-west-1 中启动一组 AWS 资源。
现在,我想介绍一个 AWS Glue 资源,该资源仅在不同的区域 us-west-2 中可用。 那么如何布局 glue.tf 文件呢?
目前,我将其存储在myproject下的子目录中,并在该子目录中运行terraform应用程序,即
myprojectglueglue.tf
myprojectglueanother_provider.tf
another_provider.tf 是:
provider "aws" {
region = "us-west-2"
profile = "default"
}
这是在不同区域存储启动资源的唯一方法吗? 有更好的方法吗?
如果没有更好的方法,那么我也需要在胶水子文件夹中有另一个后端文件,此外,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
您可以使用提供程序别名来定义多个提供程序,例如
# 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 -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 代码是声明性源代码,用于配置应用程序中应用程序源代码等使用的二进制基础结构......