Избегать модуля Terraform для создания дубликатов ресурсов? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующая структура проекта для построения лямбда-функций на AWS с использованием Terraform:

.
├── aws.tf
├── dev.tfvars
├── global_variables.tf -> ../shared/global_variables.tf
├── main.tf
├── module
│   ├── data_source.tf
│   ├── main.tf
│   ├── output.tf
│   ├── role.tf
│   ├── security_groups.tf
│   ├── sources
│   │   ├── function1.zip
│   │   └── function2.zip
│   └── variables.tf
└── vars.tf

В файле .main.tf у меня есть этот код, который создаст 2 разные лямбда-функции:

module "function1" {
  source = "./module"

  function_name    = "function1"
  source_code      = "function1.zip"

  runtime          = "${var.runtime}"
  memory_size      = "${var.memory_size}"
  timeout          = "${var.timeout}"
  aws_region       = "${var.aws_region}"
  vpc_id           = "${var.vpc_id}"
}


module "function2" {
  source = "./module"

  function_name    = "function2"
  source_code      = "function2.zip"  
  runtime          = "${var.runtime}"
  memory_size      = "${var.memory_size}"
  timeout          = "${var.timeout}"
  aws_region       = "${var.aws_region}"
  vpc_id           = "${var.vpc_id}"
}

Проблема в том, что при развертывании терраформ создает все ресурсы дважды.Для лямбды это нормально, это цель, но для групп безопасности и ролей это не то, что я хочу.

Например, эту группу безопасности создают 2 раза:

resource "aws_security_group" "lambda-sg" {
  vpc_id = "${data.aws_vpc.main_vpc.id}"
  name   = "sacem-${var.project}-sg-lambda-${var.function_name}-${var.environment}"

  egress {
    protocol    = "-1"
    from_port   = 0
    to_port     = 0
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    protocol        = "-1"
    from_port       = 0
    to_port         = 0
    cidr_blocks     = "${var.authorized_ip}"
  }
  # To solve dependcies error when updating the security groups
  lifecycle {
    create_before_destroy = true
    ignore_changes        = ["tags.DateTimeTag"]
  }

  tags = "${merge(var.resource_tagging, map("Name", "${var.project}-sg-lambda-${var.function_name}-${var.environment}"))}"

}

Так что ясно, чтоПроблема в структуре проекта.Не могли бы вы помочь решить это?

Спасибо.

1 Ответ

1 голос
/ 17 июня 2019

Если вы создадите группу безопасности внутри модуля, она будет создана один раз за включение модуля .

Я считаю, что некоторые значения переменных для sg name изменяются при включении модуля, верно? Следовательно, sg name будет уникальным для обоих модулей и может быть создан дважды без ошибок.

Если вы выберете статическое имя, Terraform выдаст ошибку при попытке создать sg из модуля 2, поскольку ресурс уже существует (созданный модулем 1).

Таким образом, вы можете определить ресурс sg вне самого модуля, чтобы создать его только один раз. Затем вы можете передать id созданного sg как переменную для включения модуля и использовать его там для других ресурсов.

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