Terraform — несколько учетных записей с несколькими средами (регионами)

#amazon-web-services #terraform #environment #terraform-provider-aws #infrastructure-as-code

#amazon-веб-сервисы #terraform #Окружающая среда #terraform-поставщик -aws #инфраструктура как код

Вопрос:

Я разрабатываю инфраструктуру (IaC), которую я хочу иметь в AWS с помощью Terraform. Для тестирования я использую экземпляр EC2.

Этот код должен иметь возможность развертывания в нескольких учетных записях и ** нескольких регионах (средах) для каждого разработчика **. Это пример:

учетная запись-999

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

учетная запись-666:

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

Я создал две .tfvars переменные account-999.env.tfvars account-666.env.tfvars со следующим содержимым:

  • profile="account-999" и profile="account-666" соответственно

Это мой main.tf , который содержит поставщика aws с экземпляром EC2:

 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 учетной записи. Как я могу это решить?
С другой стороны, при такой структуре можно было бы реализовать модули?

Комментарии:

1. Регионы лучше всего решаются с помощью модулей и псевдонимов поставщиков, особенно если вы используете 0.13 с новыми функциями мета-аргументов для модулей.

Ответ №1:

provider alias Для этого можно использовать a . Более подробную информацию об псевдонимах поставщиков можно найти здесь .

 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}"
}
  

Вы даже можете комбинировать оба метода!