Terraform:一起创建和 depends_on
Terraform: create and depends_on together
我有这个 terraform 代码...
// Route53 Zone
module "zones" {
source = "terraform-aws-modules/route53/aws//modules/zones"
version = "~> 1.2.0"
create = var.environment == "PRO" ? true : false
zones = {
"example.com" = {
comment = "example.com (production)"
tags = merge(var.global_tags, { environment = var.environment})
}
}
}
// Route53 Records
module "records" {
source = "terraform-aws-modules/route53/aws//modules/records"
version = "~> 1.2.0"
create = var.environment == "PRO" ? true : false
zone_name = keys(module.zones.this_route53_zone_zone_id)[0]
records = [
{
name = "ci"
type = "A"
ttl = 300
records = [
"34.24.14.04",
]
},
]
depends_on = [module.zones]
}
我 select 一个不同于 PRO 的环境,所以这个模块除了...
运行 terraform 计划后我得到...
Error: Invalid index
on main.tf line 287, in module "records":
287: zone_name = keys(module.zones.this_route53_zone_zone_id)[0]
|----------------
| module.zones.this_route53_zone_zone_id is object with no attributes
The given key does not identify an element in this collection value.
我该如何处理?我想将我的代码与任何值一起使用到变量环境中。
我们在 github.com/mineiros-io/terraform-aws-route53
创建了一个 route53 模块作为 open-source terraform 库的一部分
使用此模块的解决方案如下所示:
- 为
example.com
创建区域
- 使用可预测的方式引用
zone_id = module.zones.zone["example.com"].zone_id
- 在区域中创建记录
注意:依赖关系应该以自然方式解决,因此无需在此解决方案中使用 depends_on
。 如果需要意外的依赖关系,我们还提供了一种方法为此 terraform 0.12
通过使用 module_depends_on = [...]
这将强制依赖模块中的所有资源。
module "zones" {
source = "mineiros-io/route53/aws"
version = "~> 0.3.0"
# not called 'create' but 'module_enabled' in our modules.
module_enabled = var.environment == "PRO"
# it is possible to create multiple zones at once all sharing the same
# delegation set (nameservers)
name = [
"example.com" ,
]
comment = "example.com (${var.environment})"
tags = merge(var.global_tags, {
environment = var.environment
})
}
module "records" {
source = "mineiros-io/route53/aws"
version = "~> 0.3.0"
module_enabled = var.environment == "PRO"
zone_id = module.zones.zone["example.com"].zone_id
records = [
{
name = "ci"
type = "A"
ttl = 300
records = [
"34.24.14.04",
]
},
]
}
在此处查看一些更复杂的示例:github.com/mineiros-io/terraform-aws-route53/tree/master/examples
计划类似于:
# module.records.aws_route53_record.record["a-ci"] will be created
+ resource "aws_route53_record" "record" {
+ allow_overwrite = false
+ fqdn = (known after apply)
+ id = (known after apply)
+ name = "ci"
+ records = [
+ "34.24.14.04",
]
+ ttl = 300
+ type = "A"
+ zone_id = (known after apply)
}
# module.zones.aws_route53_delegation_set.delegation_set[0] will be created
+ resource "aws_route53_delegation_set" "delegation_set" {
+ id = (known after apply)
+ name_servers = (known after apply)
}
# module.zones.aws_route53_zone.zone["example.com"] will be created
+ resource "aws_route53_zone" "zone" {
+ comment = "example.com (PRO)"
+ delegation_set_id = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ name = "example.com"
+ name_servers = (known after apply)
+ tags = {
+ "Name" = "example.com"
+ "environment" = "PRO"
}
+ zone_id = (known after apply)
}
Plan: 3 to add, 0 to change, 0 to destroy.
注意:为了清楚起见,您也可以合并模块的两个调用并在同一个模块调用中创建区域和记录。我只是拆分了用法以匹配您的初始示例。
我有这个 terraform 代码...
// Route53 Zone
module "zones" {
source = "terraform-aws-modules/route53/aws//modules/zones"
version = "~> 1.2.0"
create = var.environment == "PRO" ? true : false
zones = {
"example.com" = {
comment = "example.com (production)"
tags = merge(var.global_tags, { environment = var.environment})
}
}
}
// Route53 Records
module "records" {
source = "terraform-aws-modules/route53/aws//modules/records"
version = "~> 1.2.0"
create = var.environment == "PRO" ? true : false
zone_name = keys(module.zones.this_route53_zone_zone_id)[0]
records = [
{
name = "ci"
type = "A"
ttl = 300
records = [
"34.24.14.04",
]
},
]
depends_on = [module.zones]
}
我 select 一个不同于 PRO 的环境,所以这个模块除了... 运行 terraform 计划后我得到...
Error: Invalid index
on main.tf line 287, in module "records":
287: zone_name = keys(module.zones.this_route53_zone_zone_id)[0]
|----------------
| module.zones.this_route53_zone_zone_id is object with no attributes
The given key does not identify an element in this collection value.
我该如何处理?我想将我的代码与任何值一起使用到变量环境中。
我们在 github.com/mineiros-io/terraform-aws-route53
创建了一个 route53 模块作为 open-source terraform 库的一部分使用此模块的解决方案如下所示:
- 为
example.com
创建区域
- 使用可预测的方式引用
zone_id = module.zones.zone["example.com"].zone_id
- 在区域中创建记录
注意:依赖关系应该以自然方式解决,因此无需在此解决方案中使用 depends_on
。 如果需要意外的依赖关系,我们还提供了一种方法为此 terraform 0.12
通过使用 module_depends_on = [...]
这将强制依赖模块中的所有资源。
module "zones" {
source = "mineiros-io/route53/aws"
version = "~> 0.3.0"
# not called 'create' but 'module_enabled' in our modules.
module_enabled = var.environment == "PRO"
# it is possible to create multiple zones at once all sharing the same
# delegation set (nameservers)
name = [
"example.com" ,
]
comment = "example.com (${var.environment})"
tags = merge(var.global_tags, {
environment = var.environment
})
}
module "records" {
source = "mineiros-io/route53/aws"
version = "~> 0.3.0"
module_enabled = var.environment == "PRO"
zone_id = module.zones.zone["example.com"].zone_id
records = [
{
name = "ci"
type = "A"
ttl = 300
records = [
"34.24.14.04",
]
},
]
}
在此处查看一些更复杂的示例:github.com/mineiros-io/terraform-aws-route53/tree/master/examples
计划类似于:
# module.records.aws_route53_record.record["a-ci"] will be created
+ resource "aws_route53_record" "record" {
+ allow_overwrite = false
+ fqdn = (known after apply)
+ id = (known after apply)
+ name = "ci"
+ records = [
+ "34.24.14.04",
]
+ ttl = 300
+ type = "A"
+ zone_id = (known after apply)
}
# module.zones.aws_route53_delegation_set.delegation_set[0] will be created
+ resource "aws_route53_delegation_set" "delegation_set" {
+ id = (known after apply)
+ name_servers = (known after apply)
}
# module.zones.aws_route53_zone.zone["example.com"] will be created
+ resource "aws_route53_zone" "zone" {
+ comment = "example.com (PRO)"
+ delegation_set_id = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ name = "example.com"
+ name_servers = (known after apply)
+ tags = {
+ "Name" = "example.com"
+ "environment" = "PRO"
}
+ zone_id = (known after apply)
}
Plan: 3 to add, 0 to change, 0 to destroy.
注意:为了清楚起见,您也可以合并模块的两个调用并在同一个模块调用中创建区域和记录。我只是拆分了用法以匹配您的初始示例。