首页 > 解决方案 > Terraform 错误:ClientException:指定卷参数时,只能使用一种卷配置类型

问题描述

我使用 terraform 创建多个任务定义,其中一个任务定义有多个卷,但是当我尝试从此错误创建时,是否可以通过 terraform 在任务中创建多个卷?因为通过 aws 是可能的。但是 terraform 显示了这个错误。

错误:ClientException:指定卷参数时,只能使用一种卷配置类型

我搜索了整个互联网以找到这个问题并没有找到答案,因为我已经在 terraform 文档中使用了与此相等的动态卷。

terraform {
  required_version = ">= 0.13.0"

  required_providers {
    aws = "~> 3.0"
  }
}

variable "task_definition_names" {
  type = any
  default = [
    {
      task_definition_name = "jenkins"
      task_definition_file = "jenkins-task-definition.json"
      shared_memory_size   = 64
      cpu                  = 0
      memory_reservation   = 3900
      entrypoint           = ""
      ecr_repository_name  = "jenkins:lts"
      dns                  = "jenkins.com.br"
      hosted_zone          = ""
      allowed_volumes      = true
      volume = [
        {
          name      = "efs-jenkins"
          host_path = "/var/jenkins_home"
          efs_volume_configuration = [{
            file_system_id     = "fs-"
            root_directory     = "/"
            transit_encryption = "ENABLED"
            authorization_config = [{
              access_point_id = "fsap-"
              iam             = "ENABLED"
            }]
          }]
        },
        {
          name                     = "docker-sock"
          host_path                = "/var/run/docker.sock"
        },
        {
          name                     = "docker-bin"
          host_path                = "/usr/bin/docker"
        }
      ]
    },
    {
      task_definition_name = "staging-api"
      task_definition_file = "staging-api-task-definition.json"
      shared_memory_size   = 64
      cpu                  = 0
      memory_reservation   = 900
      entrypoint           = ""
      ecr_repository_name  = "staging-api"
      allowed_volumes      = false
      volume               = []
    }
 ]
}

resource "aws_ecs_task_definition" "main" {
  count  = length(var.task_definition_names)
  family = var.task_definition_names[count.index].task_definition_name

  container_definitions = templatefile("${path.module}/templates/${var.task_definition_names[count.index].task_definition_file}", var.task_definition_names[count.index])

  dynamic "volume" {
    
    for_each = var.task_definition_names[count.index].volume
    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)
          transit_encryption      = lookup(efs_volume_configuration.value, "transit_encryption", null)
          transit_encryption_port = lookup(efs_volume_configuration.value, "transit_encryption_port", null)
          dynamic "authorization_config" {
            for_each = lookup(efs_volume_configuration.value, "authorization_config", [])
            content {
              access_point_id = lookup(authorization_config.value, "access_point_id", null)
              iam             = lookup(authorization_config.value, "iam", null)
            }
          }
        }
      }
    }
  }
}

此脚本用于创建多个任务定义。

标签: amazon-web-servicesterraformamazon-ecsterraform-provider-awsterraform0.12+

解决方案


我在使用 awscli 时遇到了同样的问题,但是删除了对配置hosthost_path配置中的任何引用为我解决了这个问题。


推荐阅读