создание балансировщиков нагрузки, целевых групп и слушателей в terraform - PullRequest
0 голосов
/ 16 ноября 2018
  • Я пытаюсь создать балансировщик нагрузки с целевой группой, подключенной к ALB, и слушателями и экземплярами, подключенными к целевым группам.

  • Я установил, что он работает для одного балансировщика нагрузки, но я не могу заставить его работать для нескольких ALB без необходимости дублировать код.

  • Я также пытался передать входные переменные в командной строке, добавив их с помощью сценариев в powershell, но каждый раз, когда создаются ресурсы, файл состояния перезаписывается следующим именем ресурса.

Есть ли способ добавить к существующему файлу состояния новые ресурсы или способ создать несколько albs со всеми другими связанными ресурсами без дублирования?

Ниже приведен код:

variable` "name" {}

variable "environment" {

default = "Beta"    

}

variable "security_group_id" {

default = ["sg-xxxxxx"]     

}

variable "subnet_ids" {

type = "list"
default = ["subnet-xxxxxx","subnet-xxxxxxx","subnet-xxxxxxxxxxx"]   
}

variable "instance_ids" {

type = "list"
default = ["xxxxxxx","xxxxxxx"] 
}


variable "vpc_id" {

default = "vpc-xxxxxxxxxxxx"    

}

variable "ssl_certificate_arn" {

default = "vpc-xxxxxxxxxxx"     

}


provider "aws" {
region = "us-west-2"
access_key = "xxxxxxxxxx"
secret_key = "xxxxxxxxxx"

}
resource "aws_alb" "alb" {
count = "1"
name            = "${var.name}-${var.environment}"
internal        = false
security_groups = ["${var.security_group_id}"]
subnets         = ["${var.subnet_ids}"]



tags {
Environment = "${var.environment}"
} 

}

resource "aws_alb_target_group" "alb_targets" {
count     = "1"
name      = "${var.name}-${var.environment}"
port      = "80"
protocol  = "HTTP"
vpc_id    = "${var.vpc_id}"
health_check {
healthy_threshold   = 2
interval            = 15
path                = "/api/health"
timeout             = 10
unhealthy_threshold = 2
}



tags {

Environment = "${var.environment}"
}
}
resource "aws_alb_listener" "alb_listener" {
count             = "1"
load_balancer_arn = "${aws_alb.alb.arn}"
port              = "80"
protocol          = "HTTP"
#ssl_policy        = "ELBSecurityPolicy-2015-05"
#certificate_arn   = "${var.ssl_certificate_arn}"
default_action {
target_group_arn = "${element(aws_alb_target_group.alb_targets.*.arn, 0)}"
type = "forward"
}
}



resource "aws_lb_target_group_attachment" "test" {
target_group_arn = "${aws_alb_target_group.alb_targets.arn}"
target_id        = "${element(var.instance_ids,count.index)}"
port             = 80
}

1 Ответ

0 голосов
/ 16 ноября 2018

Сначала позвольте мне объяснить, почему ваши ALB перезаписываются:

Terraform является декларативным , т. Е. Он делает Среду именно такой, как она выглядит в файле. Поэтому, если вы создадите ALB с именем ALB1 и какой-либо конфигурацией, запустите Terraform, затем измените имя в файле на ALB2 , вызовите Terraform apply, Terraform удалит первое (так как вы нужен новый ресурс для переименования ALB) и создания нового.

То, что вы хотите, может быть легко достигнуто с помощью Модули Terraform . Что вы можете сделать, это следующее:

  1. Экспорт всей вашей информации вместе с переменными (вам может потребоваться еще несколько переменных) в модуль. Модуль - это просто папка, в которой вы находитесь, например, Main.tf , vars.tf , output.tf
  2. Затем из другого файла Terraform вы пару раз вызываете свой модуль с соответствующими значениями для каждого необходимого балансировщика нагрузки.

Проверьте это для получения дополнительной информации о модулях.

P.S. если вы застряли с этим, оставьте комментарий, и мы решим его.

...