Amazon web services 避免Terraform模块创建重复资源?

Amazon web services 避免Terraform模块创建重复资源?,amazon-web-services,terraform,Amazon Web Services,Terraform,我使用Terraform在AWS上构建Lambda函数的项目结构如下: . ├── 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 │

我使用Terraform在AWS上构建Lambda函数的项目结构如下:

.
├── 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文件中,我有一段代码,它将创建两个不同的lambda函数:

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}"
}
问题是,在部署terraform中,所有资源都要创建两次。对于Lambda来说,这没关系,这就是目的,但是对于安全组和角色,这不是我想要的

例如,此安全组被创建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}"))}"

}
很明显,问题在于项目的结构。你能帮我解决这个问题吗


谢谢。

如果您在模块内创建SecurityGroup,则将在每个模块中创建一次

我相信,当包含模块时,sg名称的一些变量值会发生变化,对吗?因此,两个模块的sg名称都是唯一的,可以创建两次而不会出现错误

如果您选择一个静态名称,Terraform在尝试从模块2创建sg时会抛出一个错误,因为资源已经存在,正如模块1创建的一样

因此,您可以在模块本身之外定义sg资源,以便只创建一次。
然后,您可以将创建的sg的id作为变量传递给模块包含,并将其用于其他资源

那么你的模块设计是错误的。将非特定于模块的内容放在模块外,即不应在每次使用模块时单独创建的内容。