9

更新

我不明白,但我重新运行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 内容:

主文件:

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"]
  }
}

变量.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}"
}

这是我调用模块来创建两个安全组的文件。

安全组.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.

PS我可能需要以某种方式表明调用模块时创建了资源?

4

1 回答 1

4

这看起来像一个竞争条件。Terraform 尝试并行创建不依赖于彼此的资源,在这种情况下,它看起来像是试图破坏安全组,module.security_group_staging同时尝试module.security_group_staging_ec2 使用相同的名称创建它们。你改名security_group_stagingsecurity_group_staging_ec2?

销毁成功了,但创建失败了,因为它与销毁并行运行。

第二次运行它时没有竞争条件,因为module.security_group_staging它已经被破坏了。

附带说明一下,通常最好不要将不同的环境保存在同一个状态文件中。

于 2018-08-30T07:59:31.337 回答