Есть ли способ объединить переменные terraform для использования одного модуля в нескольких регионах AWS?

Я новичок в терраформе, и я использую террагрунт, чтобы помочь мне сдвинуть дело с мертвой точки. У меня есть приличный объем инфраструктуры, которую можно перенести и настроить с помощью terraform, но сначала я начинаю действовать. У нас есть несколько VPC в разных регионах с множеством одинаковых правил группы безопасности, т. Е. (Веб, базы данных и т. Д.), Которые я хочу реплицировать в каждом регионе.

У меня есть простой пример того, как у меня сейчас есть установка модуля EC2 для воссоздания правил группы безопасности, и мне было интересно, есть ли лучший способ организовать этот код, чтобы мне не нужно было создавать новый модуль для одного и того же правила SG для каждого область? то есть какой-то умный способ использовать списки для моих vpc, провайдеров и т. д.

так как это всего лишь одно правило 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}"
  }
}

person veilig    schedule 17.09.2018    source источник


Ответы (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 для развертывания всех необходимых ресурсов.

person Markus    schedule 19.09.2018