首页 > 解决方案 > Terraform 在模块中使用变量和其他资源

问题描述

我正在重构我的 terraform 代码以使用模块。但是我得到了很多变量/资源未定义的错误/发现。

我发现我需要将我的variable [name] {}块移动到模块中。模块是否不可能引用父/其他模块变量?例如。有时我可能有一些重用的变量,例如。NODE_ENV.


接下来...在此之后,我发现它说missing required argument。我只是在跑步terraform init,因为 terraform 说我需要这样做......我尝试添加-var-file,但它似乎不适用于模块?我应该如何解决这个问题?


还有很多

resource 'aws_ecs_service.xxx-ecs-service' config: unknown module referenced: ecs

错误...看来我不能再以通常的方式引用资源了?

# ecs/ecs.tf
resource "aws_ecs_task_definition" "xxx-ecs-task" {
  family = "${var.family}"
  container_definitions = "${data.template_file.container_defination.rendered}"
  task_role_arn = "${var.role_arn}"
  execution_role_arn = "${var.role_arn}"
  network_mode = "awsvpc"
  cpu = "${var.cpu}"
  memory = "${var.memory}"
  requires_compatibilities = ["FARGATE"]
  tags = "${var.tags}"
}

resource "aws_ecs_service" "xxx-ecs-service" {
  name = "${var.service_name}"
  cluster = "${var.ecs_cluster}"
  task_definition = "${module.ecs.aws_ecs_task_definition.pinfare-ecs-task.arn}"
}

对于task_defination,我尝试添加,module.ecs因为 ecs 是我的模块的名称

module "ecs" {
  source  = "./ecs"
  name = "ecs"
}

标签: terraform

解决方案


为避免混淆,建议完全目录分离。

module/ecs/ecs.tf
env/dev/myecs.tf

以下是说明目的,未经本人测试。

配置

模块/ecs/ecs.tf

resource "aws_ecs_task_definition" "xxx-ecs-task" {
  family = "${var.family}"
  container_definitions = "${data.template_file.container_defination.rendered}"
  task_role_arn = "${var.role_arn}"
  execution_role_arn = "${var.role_arn}"
  network_mode = "awsvpc"
  cpu = "${var.cpu}"
  memory = "${var.memory}"
  requires_compatibilities = ["FARGATE"]
  tags = "${var.tags}"
}

resource "aws_ecs_service" "xxx-ecs-service" {
  name = "${var.service_name}"
  cluster = "${var.ecs_cluster}"
  task_definition = "${aws_ecs_task_definition.xxx-ecs-task.arn}"
}

模块/ecs/variables.tf

定义要从模块用户端(env/dev/myecs.tf)传递的所有变量。

variable "family" {
}
variable "role_arn" {
}
...

env/dev/myeecs.tf

module "ecs" {
  source  = "../../module/ecs"
  family = "value of family here"
  role_arn = "value of IAM role arn"
  ...
}

模块路径

请注意 ${path.module} 在路径和嵌入式文件中指定模块内文件的路径。令人困惑的是 env/dev/ 和 module/ecs 都是Terraform 中的模块,其中 env/dev/ 是根模块。

创建模块

Terraform 中的模块是包含 Terraform 文件的文件夹。实际上,当您运行 terraform apply 时,保存您正在应用的 Terraform 文件的当前工作目录包含所谓的根模块。这本身就是一个有效的模块。

指定路径时,基本上是根模块内的路径。因此,在被调用的模块(module/ecs)中,以 ${path.module}/ 为前缀,这样被调用的模块就不会尝试在 env/dev 中加载文件。

Terraform 注册表

我建议看一下 Terraform Registry,例如Security Group模块以习惯如何使用 Terraform 模块。GitHub 的链接也在那里。


推荐阅读