Terraform - 具有多个环境(区域)的多个帐户

Posted

技术标签:

【中文标题】Terraform - 具有多个环境(区域)的多个帐户【英文标题】:Terraform - Multiple accounts with multiple environments (regions) 【发布时间】:2021-01-15 21:59:26 【问题描述】:

我正在使用 Terraform 开发我希望在 AWS 中拥有的基础架构 (IaC)。为了测试,我使用的是 EC2 实例。

此代码必须能够部署跨多个帐户和**每个开发者的多个区域(环境)**。这是一个例子:

account-999

developer1: us-east-2
developer2: us-west-1
developerN: us-east-1

account-666

Staging: us-east-1
Production: eu-west-2

我创建了两个 .tfvars 变量,account-999.env.tfvarsaccount-666.env.tfvars,内容如下:

profile="account-999"profile="account-666" 分别

这是我的 main.tf,其中包含带有 EC2 实例的 aws 提供程序:

provider "aws" 
  version = "~> 2.0"
  region  = "us-east-1"
  profile = var.profile


data "aws_ami" "ubuntu" 
  most_recent = true

  filter 
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  

  filter 
    name   = "virtualization-type"
    values = ["hvm"]
  

  owners = ["099720109477"]


resource "aws_instance" "web" 
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"

  tags = 
    Name = "HelloWorld"
  

还有variable.tf 文件:

variable "profile" 
  type=string


variable "region" 
  description = "Region by developer"
  type = map
  default = 
    developer1 = "us-west-2"
    developer2 = "us-east-2"
    developerN = "ap-southeast-1"
  

但我不确定我是否管理得很好。例如,region 变量仅包含 account-999 帐户的值。我该如何解决? 另一方面,有了这种结构,是否可以实现模块?

【问题讨论】:

使用模块和提供者别名可以最好地解决区域问题,特别是如果您使用 0.13 和新的模块元参数功能。 【参考方案1】:

您可以使用provider alias 来完成此操作。更多关于提供者别名的信息可以在here找到。

provider "aws" 
  region = "us-east-1"


provider "aws" 
  alias  = "west"
  region = "us-west-2"


resource "aws_instance" "foo" 
  provider = aws.west
  # ...

另一种查看方式是使用terraform workspaces。这是一个例子:

terraform workspace new account-999
terraform workspace new account-666

那么这是您的 aws 凭证文件的示例:

[account-999]
aws_access_key_id=xxx
aws_secret_access_key=xxx

[account-666]
aws_access_key_id=xxx
aws_secret_access_key=xxx

可以在提供程序块中使用对该帐户的引用:

provider "aws" 
    region  = "us-east-1"
    profile = "$terraform.workspace"

你甚至可以结合这两种方法!

【讨论】:

以上是关于Terraform - 具有多个环境(区域)的多个帐户的主要内容,如果未能解决你的问题,请参考以下文章

具有 Terraform 的多个提供程序版本

在 Terraform 中将多个 AWS 账户作为环境处理的最佳方式是啥?

具有自动缩放组的多个模板文件和使用 Terraform 的启动配置

如何使用一个 terraform 脚本和不同的变量值管理多个不同环境的部署

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?

Terraform - 为变量指定多个可能的值