我正在重构我的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"
}
答案 0 :(得分:0)
为避免混淆,建议完全目录分离。
module/ecs/ecs.tf
env/dev/myecs.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}"
}
定义所有要从模块用户端传递的变量(env / dev / myecs.tf)。
variable "family" {
}
variable "role_arn" {
}
...
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 /是根模块。
Terraform中的模块是包含Terraform文件的文件夹。实际上,当您运行terraform apply时,包含要应用的Terraform文件的当前工作目录包含所谓的根模块。这本身就是有效的模块。
指定路径时,基本上是在根模块中。因此,在被调用的模块(module / ecs)中,请加上$ {path.module} /前缀,以使被调用的模块不会尝试在env / dev中加载文件。
我建议您查看Terraform Registry,例如Security Group模块,以习惯于如何使用Terraform模块。到GitHub的链接也在那里。