Есть ли способ объединения переменных terraform для использования одного и того же модуля в нескольких регионах AWS?
Я новичок в terraform, и я использую terragrunt, чтобы помочь мне начать работу. У меня есть достаточное количество инфраструктуры для миграции и настройки с терраформой, но я сначала встаю под ноги. У нас есть несколько VPC в разных регионах с множеством одинаковых правил группы безопасности, т. Е.(Web, db и т. Д.), Которые я хочу воспроизвести в каждом регионе.
У меня есть простой пример того, как я сейчас настроил модуль EC2 для воссоздания правил группы безопасности, и мне было интересно, есть ли лучший способ организовать этот код, чтобы мне не нужно было создавать новый модуль для того же правила SG для каждого область, край? то есть какой-то умный способ использовать списки для моих виртуальных частных сетей, поставщиков и т. д.
так как это только одно правило SG в двух регионах, я стараюсь не допустить, чтобы это становилось все более уродливым, поскольку мы расширяемся до еще большего числа регионов, и я ввожу несколько правил SG
Мое состояние в настоящее время сохраняется в S3, и в этой настройке я извлекаю состояние, чтобы получить доступ к выходам VPC из другого модуля, который я использовал для создания VPC.
terraform {
backend "s3" {}
}
provider "aws" {
version = "~> 1.31.0"
region = "${var.region}"
profile = "${var.profile}"
}
provider "aws" {
version = "~> 1.31.0"
alias = "us-west-1"
region = "us-west-1"
profile = "${var.profile}"
}
#################################
# Data sources to get VPC details
#################################
data "terraform_remote_state" "vpc" {
backend = "s3"
config {
bucket = "${var.vpc_remote_state_bucket}"
key = "${var.vpc_remote_state_key}"
region = "${var.region}"
profile = "${var.profile}"
}
}
#####################
# Security group rule
#####################
module "east1_vpc_web_server_sg" {
source = "terraform-aws-modules/security-group/aws"
version = "2.5.0"
name = "web-server"
description = "Security group for web-servers with HTTP ports open within the VPC"
vpc_id = "${data.terraform_remote_state.vpc.us_east_vpc1_id}"
# Allow VPC public subnets to talk to each other for API's
ingress_cidr_blocks = ["${data.terraform_remote_state.vpc.us_east_vpc1_public_subnets_cidr_blocks}"]
ingress_rules = ["https-443-tcp", "http-80-tcp"]
# List of maps
ingress_with_cidr_blocks = "${var.web_server_ingress_with_cidr_blocks}"
# Allow engress all protocols to outside
egress_rules = ["all-all"]
tags = {
Terraform = "true"
Environment = "${var.environment}"
}
}
module "west1_vpc_web_server_sg" {
source = "terraform-aws-modules/security-group/aws"
version = "2.5.0"
providers {
aws = "aws.us-west-1"
}
name = "web-server"
description = "Security group for web-servers with HTTP ports open within the VPC"
vpc_id = "${data.terraform_remote_state.vpc.us_west_vpc1_id}"
# Allow VPC public subnets to talk to each other for API's
ingress_cidr_blocks = ["${data.terraform_remote_state.vpc.us_west_vpc1_public_subnets_cidr_blocks}"]
ingress_rules = ["https-443-tcp", "http-80-tcp"]
ingress_with_cidr_blocks = "${var.web_server_ingress_with_cidr_blocks}"
# Allow engress all protocols to outside
egress_rules = ["all-all"]
tags = {
Terraform = "true"
Environment = "${var.environment}"
}
}
1 ответ
Ваша текущая настройка использует два раза один и тот же модуль, отличающийся от поставщика. Вы можете передать несколько провайдеров в модуль ( см. Документацию). Затем в модуле вы можете использовать те же переменные, которые вы указали один раз в своем основном документе, для создания всех необходимых вам экземпляров.
Тем не менее, поскольку вы используете одного отдельного поставщика для каждого типа ресурса, вам нужно как минимум некоторое дублирование кода.
Ваш код может выглядеть примерно так
module "vpc_web_server_sg" {
source = "terraform-aws-modules/security-group/aws"
version = "2.5.0"
providers {
aws.main = "aws"
aws.secondary = "aws.us-west-1"
}
name = "web-server"
description = "Security group for web-servers with HTTP ports open within the VPC"
vpc_id = "${data.terraform_remote_state.vpc.us_west_vpc1_id}"
# Allow VPC public subnets to talk to each other for API's
ingress_cidr_blocks = ["${data.terraform_remote_state.vpc.us_west_vpc1_public_subnets_cidr_blocks}"]
ingress_rules = ["https-443-tcp", "http-80-tcp"]
ingress_with_cidr_blocks = "${var.web_server_ingress_with_cidr_blocks}"
# Allow engress all protocols to outside
egress_rules = ["all-all"]
tags = {
Terraform = "true"
Environment = "${var.environment}"
}
}
Внутри вашего модуля вы можете использовать main
а также secondary
провайдер для развертывания всех ваших необходимых ресурсов.