#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}"
}
Вы даже можете комбинировать оба метода!