Есть ли способ объединения переменных Terraform для использования одного и того же модуля в нескольких регионах AWS? - PullRequest
0 голосов
/ 17 сентября 2018

Я новичок в 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 Ответ

0 голосов
/ 19 сентября 2018

Ваша текущая настройка использует два раза один и тот же модуль, отличающийся от поставщика.В модуль можно передать несколько провайдеров ( см. Документацию ).Затем в модуле вы можете использовать те же переменные, которые вы указали один раз в своем основном документе, для создания всех необходимых вам экземпляров.

Однако, поскольку вы используете одного отдельного поставщика для каждого типа ресурса, вам необходимопо крайней мере немного дублирования кода.

Ваш код может выглядеть примерно так:

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

...