Terraform 地形嵌套动态块:不支持的块类型
我正在尝试做下面的事情Terraform 地形嵌套动态块:不支持的块类型,terraform,terraform-provider-aws,terraform0.12+,Terraform,Terraform Provider Aws,Terraform0.12+,我正在尝试做下面的事情 dynamic "volume" { for_each = var.volumes content { host_path = lookup(volume.value, "host_path", null) name = volume.value.name dynamic "efs_volume" { for_each = var
dynamic "volume" {
for_each = var.volumes
content {
host_path = lookup(volume.value, "host_path", null)
name = volume.value.name
dynamic "efs_volume" {
for_each = var.efs_volumes
content {
name = efs_volume.value.name
efs_volume_configuration {
file_system_id = efs_volume.value.file_system_id
root_directory = efs_volume.value.root_directory
transit_encryption = efs_volume.value.transit_encryption != "ENABLED" ? "" : "ENABLED"
dynamic "authorization_config" {
for_each = efs_volume.value.access_point_id != "" ? [1] : []
content {
access_point_id = volume.value.access_point_id
}
}
}
}
}
}
}
它给了我
错误:不支持的块类型
此处不需要“efs\U卷”类型的块
有人能告诉我这里出了什么问题吗?我正在使用terraform 0.12.24
请注意,我知道AWS提供商仍然不支持“authorization_config”,我希望看到github请求后,该功能将很快出现。因此,我正在准备我的代码兼容性。基本上,我需要的是将主机和EFS卷装载到我的ECS任务定义中
编辑
我按照你说的更新了密码
dynamic "volume" {
for_each = var.volumes
content {
host_path = lookup(volume.value, "host_path", null)
name = volume.value.name
dynamic "efs_volume_configuration" {
for_each = lookup(volume.value, "efs_volume_configuration", [])
content {
file_system_id = lookup(efs_volume_configuration.value, "file_system_id", null)
root_directory = lookup(efs_volume_configuration.value, "root_directory", null)
}
}
}
}```
Now the problem is,
> efs_volume_configuration
getting added to each volume block. Which actually need to be null.
``` + volume { # forces replacement
+ host_path = "/var/run"
+ name = "docker-sock-folder"
+ efs_volume_configuration {}
}
+ volume { # forces replacement
+ host_path = "/var/run/docker/netns"
+ name = "docker-netns"
+ efs_volume_configuration {}
}
+ volume { # forces replacement
+ name = "efs_share"
+ efs_volume_configuration {
+ file_system_id = "fs-xxxxxx"
+ root_directory = "/"
}
}
编辑
这是我的证件
type = list(object({
name = string
host_path = string
efs_volume_configuration = list(object({
file_system_id = string
root_directory = string
}))
}))
description = "Task volume definitions as list of configuration objects"
default = [
{
"name" : "data-folder",
"host_path" : "/var/lib/data",
"efs_volume_configuration" = [
{
"file_system_id" : "",
"root_directory" : ""
}
]
},
{
"name" : "docker-sock-folder",
"host_path" : "/var/run",
"efs_volume_configuration" = [
{
"file_system_id" : "",
"root_directory" : ""
}
]
},
{
"name" : "efs_share",
"host_path" : null,
"efs_volume_configuration" = [
{
"file_system_id" : "fs-xxxxxx",
"root_directory" : "/"
}
]
}
....
对于ecs任务定义,资源efs_卷不是受支持的参数。如果您正在寻找一个完全工作的模块,也许我编写的模块工作得很好,并发布到TerraformRegistry可能会有所帮助 要使用efs卷,可以定义以下动态块:
dynamic "volume" {
for_each = var.volume
content {
name = volume.value.name
host_path = lookup(volume.value, "host_path", null)
dynamic "docker_volume_configuration" {
for_each = lookup(volume.value, "docker_volume_configuration", [])
content {
scope = lookup(docker_volume_configuration.value, "scope", null)
autoprovision = lookup(docker_volume_configuration.value, "autoprovision", null)
driver = lookup(docker_volume_configuration.value, "driver", null)
driver_opts = lookup(docker_volume_configuration.value, "driver_opts", null)
labels = lookup(docker_volume_configuration.value, "labels", null)
}
}
dynamic "efs_volume_configuration" {
for_each = lookup(volume.value, "efs_volume_configuration", [])
content {
file_system_id = lookup(efs_volume_configuration.value, "file_system_id", null)
root_directory = lookup(efs_volume_configuration.value, "root_directory", null)
}
}
}
在这种情况下,efs_卷_配置是一个支持块。一旦模块中有了efs配置,就可以通过以下方式传入efs配置:
module "ecs-task-definition" {
...
volume = [
{
name = "efs-html",
efs_volume_configuration = [
{
"file_system_id" : "efs_id",
"root_directory" : "/usr/share/nginx"
}
]
}
]
}
重要提示:您至少需要terraform aws provider的v2.64.0版本。对于ecs任务定义资源,efs\U卷是不受支持的参数。如果您正在寻找一个完全工作的模块,也许我编写的模块工作得很好,并发布到TerraformRegistry可能会有所帮助 要使用efs卷,可以定义以下动态块:
dynamic "volume" {
for_each = var.volume
content {
name = volume.value.name
host_path = lookup(volume.value, "host_path", null)
dynamic "docker_volume_configuration" {
for_each = lookup(volume.value, "docker_volume_configuration", [])
content {
scope = lookup(docker_volume_configuration.value, "scope", null)
autoprovision = lookup(docker_volume_configuration.value, "autoprovision", null)
driver = lookup(docker_volume_configuration.value, "driver", null)
driver_opts = lookup(docker_volume_configuration.value, "driver_opts", null)
labels = lookup(docker_volume_configuration.value, "labels", null)
}
}
dynamic "efs_volume_configuration" {
for_each = lookup(volume.value, "efs_volume_configuration", [])
content {
file_system_id = lookup(efs_volume_configuration.value, "file_system_id", null)
root_directory = lookup(efs_volume_configuration.value, "root_directory", null)
}
}
}
在这种情况下,efs_卷_配置是一个支持块。一旦模块中有了efs配置,就可以通过以下方式传入efs配置:
module "ecs-task-definition" {
...
volume = [
{
name = "efs-html",
efs_volume_configuration = [
{
"file_system_id" : "efs_id",
"root_directory" : "/usr/share/nginx"
}
]
}
]
}
重要提示:您至少需要terraform aws provider的v2.64.0版本。我添加了一个示例,说明如何将变量传递到模块中。希望对你有所帮助谢谢你的支持。你能检查一下我的编辑部分吗。更改代码后,现在的问题是
efs\u volume\u configuration{}
被添加到每个卷中,实际上需要为null。我不认为这是一个问题。它不应该失败。对于卷数据文件夹
和docker sock文件夹
删除efs\u卷\u配置,您应该创建efs卷作为模块的一部分或数据源efs卷,然后引用efs id。不应该在VARS中硬编码。我添加了一个示例,说明如何将变量传递到模块中。希望对你有所帮助谢谢你的支持。你能检查一下我的编辑部分吗。更改代码后,现在的问题是efs\u volume\u configuration{}
被添加到每个卷中,实际上需要为null。我不认为这是一个问题。它不应该失败。对于卷数据文件夹
和docker sock文件夹
删除efs\u卷\u配置,您应该创建efs卷作为模块或数据源efs卷的一部分,然后引用efs id。它不应该在VAR中硬编码