在模块中使用变量和其他资源的Terraform

时间:2019-01-24 11:06:37

标签: 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"
}

1 个答案:

答案 0 :(得分:0)

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

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

下面是说明目的,未经我自己测试。

配置

module / 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}"
}

module / 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"
  ...
}

模块路径

请注意Paths and Embedded Files中的$ {path.module},以指定模块中文件的路径。令人困惑的是,env / dev /和module / ecs都是Terraform中的 module ,其中env / dev /是根模块。

Creating Modules

  

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

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

Terraform注册中心

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