Terraform: как не дублировать группы безопасности при создании с использованием модулей? - PullRequest
0 голосов
/ 29 августа 2018

Обновление

Я не понимаю, но я перезапустил terraform apply, и он не пытался дублировать ресурсы (без ошибок). Теперь он проверяет ресурсы правильно. Вид неожиданного окончания событий.


Я изучаю Terraform, и я создал модуль, позволяющий создавать некоторые основные группы безопасности. Он работает нормально с первого раза и создает ресурсы, как и ожидалось. Но если я запускаю terraform apply во второй раз, он снова пытается создать те же группы, а затем я получаю двойную ошибку, потому что такие группы безопасности уже существуют.

Если бы я создал группы безопасности напрямую без module, Terraform распознает его и не пытается воссоздать существующие ресурсы.

Возможно, я здесь что-то не так делаю.

Вот мой модуль и как я пытаюсь его использовать:

Структура моего проекта выглядит следующим образом

├── main.tf
├── modules
│   ├── security_group_ec2
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   └── variables.tf
│   └── security_group_rds
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
├── scripts
│   └── update-odoo-cfg.py
├── security_groups.tf
├── terraform.tfstate
├── terraform.tfstate.backup
├── variables.tf
└── vpc.tf

Теперь мой контент security_group_ec2:

main.tf:

resource "aws_security_group" "sg" {
  name = "${var.name}"
  description = "${var.description}"
  vpc_id = "${var.vpc_id}"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

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

variables.tf:

variable "name" {
  description = "Name of security group"
}

variable "description" {
  description = "Description of security group"
}
variable "vpc_id" {
  description = "Virtual Private Cloud ID to assign"
}

выходы:

output "sg_id" {
  value = "${aws_security_group.sg.id}"
}

И это файл, в котором я вызываю модуль для создания двух групп безопасности.

security_groups.tf:

# EC2
module "security_group_staging_ec2" {
  source = "modules/security_group_ec2"
  name = "ec2_staging_sg"
  description = "EC2 Staging Security Group"
  vpc_id = "${aws_default_vpc.default.id}"
}

module "security_group_prod_ec2" {
  source = "modules/security_group_ec2"
  name = "ec2_prod_sg"
  description = "EC2 Production Security Group"
  vpc_id = "${aws_default_vpc.default.id}"
}

Это вывод ошибок при запуске terraform apply:

module.security_group_staging.aws_security_group.sg: Destruction complete after 1s
module.security_group_prod.aws_security_group.sg: Destruction complete after 1s

Error: Error applying plan:

2 error(s) occurred:

* module.security_group_staging_ec2.aws_security_group.sg: 1 error(s) occurred:

* aws_security_group.sg: Error creating Security Group: InvalidGroup.Duplicate: The security group 'ec2_staging_sg' already exists for VPC 'vpc-2a84a741'
    status code: 400, request id: 835004f0-d8a1-4ed5-8e21-17f01eb18a23
* module.security_group_prod_ec2.aws_security_group.sg: 1 error(s) occurred:

* aws_security_group.sg: Error creating Security Group: InvalidGroup.Duplicate: The security group 'ec2_prod_sg' already exists for VPC 'vpc-2a84a741'
    status code: 400, request id: 953b23e8-20cb-4ccb-940a-6a9ddab54d53

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.

P.S. Возможно, мне нужно как-то указать, что ресурс создается при вызове модуля?

1 Ответ

0 голосов
/ 30 августа 2018

Это похоже на состояние гонки. Terraform пытается распараллелить создание ресурсов, которые не зависят друг от друга, и в этом случае похоже, что она пыталась уничтожить группы безопасности из module.security_group_staging, одновременно пытаясь создать их в module.security_group_staging_ec2 с тем же имена . Вы переименовали security_group_staging в security_group_staging_ec2?

Уничтожение прошло успешно, но создание не удалось, потому что оно работало параллельно с разрушением.

Во второй раз, когда вы запустили его, не было условий гонки, потому что module.security_group_staging уже был уничтожен.

В качестве дополнительного примечания обычно рекомендуется не хранить отдельные среды в одном файле состояния.

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