terraform - 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"
}
解决方案
为避免混淆,建议完全目录分离。
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 的链接也在那里。
推荐阅读
- python - 如何使用 keras 模型和 TFrecords 数据制作混淆矩阵?
- android - 用于聊天的 ConnectyCube 颤振 sdk 示例接收消息不稳定
- file - 使用 Apache Camel 使用大型 JSON 文件
- java - try-catch 中 else 语句中的死代码警告
- c++ - 致命错误:gtk--.h:没有这样的文件或目录
- ruby-on-rails - 为什么 capistrano 重新启动 puma 时服务器不停机
- swift - Xcode 构建顺序错误
- c++ - 如何阻止我的代码读取下一个字符?
- webpack - 在 CRA 中运行测试时无法包含 css?
- r - PMCID表行到列形式的解析