我正在使用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"
}
}
}
我特别将autoprovision
设置为false
,以确保新卷是而不是创建的。但是,当服务运行时,会创建一个16GiB(我认为这是默认大小(的新卷,并使用它,而不是使用";预创建EBSVolume";。
我检查了实例中的docker volume ls
,确实看到了列出的EBS卷。如果我运行一个装载了这个卷的新实例,它将按预期装载。
有没有一种方法可以让REX Ray使用现有的块存储?
我发现了这个问题。
问题是";"范围";所有物文件有以下内容:
Docker卷的作用域,它决定了它的生命周期。作用域为任务的Docker卷在任务启动时自动配置,在任务停止时销毁。作用域为共享的Docker卷在任务停止后仍将存在。
所以,我不得不将其更改为";共享的";从";任务";以使其使用现有EBS卷。
rexray/ebs的问题是,它只在与实例位于同一AZ时选择现有ebs卷。因此,在我们的案例中,我们需要将特定实例固定到特定的AZ,以便正确使用此驱动程序。
为了获得更好的可用性,我们在3个不同的AZ中设置了6个实例,每个实例都有自己的EBS,但在实例重新启动后,它进入了随机AZ,3个实例中有2个找不到卷。系统日志中的错误消息信息不多。
其他插件做它应该做的事情。
以下是任务定义示例,它回答了这个问题,如果您想知道如何创建指定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"
}
}
}
}