如何解决Terraform资源作为模块输入变量
在开发terraform模块时,有时我发现自己需要为相同的资源定义不同的输入变量。例如,现在我需要为模块使用同一AWS / ECS集群的NAME和ARN,因此,我在模块中定义了两个变量:ecs_cluster_arn
和ecs_cluster_name
。
出于DRY的考虑,如果我只定义类型ecs_cluster
的输入变量aws_ecs_cluster
并在模块内部使用我需要的任何东西,那将是非常好的。
我似乎找不到解决办法。有人知道这是否可能吗?
解决方法
您可以定义一个输入变量,其type constraint与aws_ecs_cluster
资源类型的架构兼容。通常,您会编写一个子集类型约束,其中仅包含模块实际需要的属性。例如:
variable "ecs_cluster" {
type = object({
name = string
arn = string
})
}
在模块的其他位置,您可以使用var.ecs_cluster.name
和var.ecs_cluster.arn
来引用那些属性。模块的调用者可以传入与该类型约束兼容的任何内容,其中包括aws_ecs_cluster
资源类型的整个实例,但还包括仅包含这两个属性的文字对象:
module "example" {
# ...
ecs_cluster = aws_ecs_cluster.example
}
module "example" {
# ...
ecs_cluster = {
name = "blah"
arn = "arn:aws:yada-yada:blah"
}
}
在许多情况下,这还将允许传递the corresponding data source的结果而不是托管资源类型。不幸的是,对于这种配对,由于某种原因,数据源使用了不同的属性名称cluster_name
,因此不兼容。不幸的是,这不是同名托管资源类型和数据源对的典型设计约定。我认为这是设计疏忽。
module "example" {
# ...
# This doesn't actually work for the aws_ecs_cluster
# data source because of a design quirk,but this would
# be possible for most other pairings such as
# the aws_subnet managed resource type and data source.
ecs_cluster = data.aws_ecs_cluster.example
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。