4

我正在使用 Terraform 创建 ECS 集群、任务定义和服务。

对于任务定义,这段代码如下所示:

resource "aws_ecs_task_definition" "postgres" {
  container_definitions    = ...
  family                   = "Postgres"
  requires_compatibilities = ["EC2"]
  network_mode             = "bridge"

  volume {
    name = "PreCreatedEBSVolume"

    docker_volume_configuration {
      scope         = "task"
      autoprovision = false
      driver        = "rexray/ebs"
    }
  }
}

我专门设置autoprovisionfalse确保创建新卷。但是,当服务运行时,会创建一个 16GiB 的新卷(我假设这是默认大小)并使用它而不是使用“PreCreatedEBSVolume”。

我检查了docker volume ls实例,果然,我看到了列出的 EBS 卷。如果我运行一个安装了这个卷的新实例,它会按预期安装。

有没有办法让 REX-Ray 使用现有的块存储?

4

3 回答 3

3

我发现了这个问题。

问题是“范围”属性。文档有以下说法:

决定其生命周期的 Docker 卷的范围。任务范围内的 Docker 卷在任务启动时自动配置,并在任务停止时销毁。任务停止后,范围为共享的 Docker 卷仍然存在。

因此,我只需将其从“任务”更改为“共享”,以使其使用现有的 EBS 卷。

于 2020-07-12T08:09:48.307 回答
0

如果您想知道如何创建指定 IOPS 和加密的 gp3 卷,以下是任务定义示例,该示例回答了该问题并提供了额外的详细信息:

resource "aws_ecs_task_definition" "postgres" {
  container_definitions    = ...
  family                   = "Postgres"
  requires_compatibilities = ["EC2"]
  network_mode             = "bridge"

  volume {
    name = "PreCreatedEBSVolume"

    docker_volume_configuration {
      scope         = "shared"
      autoprovision = false
      driver        = "rexray/ebs"
      driver_opts = {
        volumetype    = "gp3"
        size          = 40
        iops          = 3000
        encrypted     = true
        encryptionkey = "arn:aws:kms:us-east-1:111111111111:key/11111111-1111-1111-1111-11111111"
      }
    }
  }
}
于 2022-01-17T15:53:04.183 回答
0

rexray/ebs 的问题是它仅在与实例位于同一可用区时才选择现有的 EBS 卷。因此,在我们的案例中,我们需要将特定实例固定到特定 AZ 才能正确使用此驱动程序。

我们的设置是 3 个不同 AZ 中的 6 个实例,以获得更好的可用性,并且每个实例都有自己的 EBS,但是在实例重新启动后,它会进入随机 AZ,它是 3 个中有 2 个找不到卷。系统日志中的错误消息不是很丰富。

除此之外,该插件会做它应该做的事情。

于 2021-12-08T14:53:06.617 回答