【发布时间】:2020-03-07 19:56:53
【问题描述】:
Terraform 注册表 AWS VPC 示例 terraform-aws-vpc/examples/complete-vpc/main.tf 有下面的代码,在我看来这是一个循环依赖。
data "aws_security_group" "default" {
name = "default"
vpc_id = module.vpc.vpc_id
}
module "vpc" {
source = "../../"
name = "complete-example"
...
# VPC endpoint for SSM
enable_ssm_endpoint = true
ssm_endpoint_private_dns_enabled = true
ssm_endpoint_security_group_ids = [data.aws_security_group.default.id] # <-----
...
data.aws_security_group.default 指“module.vpc.vpc_id”,module.vpc 指“data.aws_security_group.default.id”。
请解释为什么这不会导致错误以及为什么 module.vpc 可以引用 data.aws_security_group.default.id?
【问题讨论】:
-
因为依赖图适用于单个元素,而不是模块。无论您将安全组 ID 作为
ssm_endpoint_security_group_ids的一部分传递到何处,都不会对安全组产生循环依赖。但这完全没有必要,因为您可以直接在模块内部传递资源的安全组。为确保您还必须发布模块的源代码。 -
嗨@ydaetskcoR,谢谢,但仍然不知道为什么。据我了解,数据源首先运行以检索数据,并且需要现有资源,在这种情况下,尚未创建的 module.vpc 的默认安全组。我想知道为什么它没有失败。
-
由于插值,在创建 VPC 之前不运行。我仍然希望它在第一次创建时失败,因为安全组创建将与 VPC 创建同时发生(假设它还插入 VPC ID 并且模块输出直接来自 VPC 资源)所以在那指向未创建安全组。但更重要的是,如果您不发布模块的源代码,就不可能真正具体地说明事情是如何工作的。但考虑到您的模块看起来非常复杂,我会尝试生成一个 minimal reproducible example 来代替。
-
@ydaetskcoR 代码全部在 Terraform Registry AWS VPC 的 Github 中 github.com/terraform-aws-modules/terraform-aws-vpc ,示例是 github 中的 github.com/terraform-aws-modules/terraform-aws-vpc/tree/master/…。
标签: terraform