Estoy usando Terraform para crear un ECS Cluster, una definición de tarea y un servicio.
Para la definición de tareas, la pieza de código se ve así:
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" } } } Configuré específicamente el autoprovision en false para asegurarme de que no se crea un nuevo volumen. Pero aun así, cuando se ejecuta el servicio, se crea un nuevo volumen con 16 GiB (que supongo que es el tamaño predeterminado) y se usa en lugar de usar el "PreCreatedEBSVolume".
Compruebo el docker volume ls en la instancia y, por supuesto, veo los volúmenes de EBS en la lista. Y si ejecuto una nueva instancia con este volumen montado, se está montando como se esperaba.
¿Hay alguna manera de hacer que REX-Ray use el almacenamiento en bloque existente?
Encontré el problema.
El problema es la propiedad "alcance". Los documentos dijeron lo siguiente:
El ámbito del volumen de Docker que determina su ciclo de vida. Los volúmenes de Docker que están en el ámbito de una tarea se aprovisionan automáticamente cuando se inicia la tarea y se destruyen cuando se detiene. Los volúmenes de Docker cuyo ámbito es compartido persisten después de que se detiene la tarea.
Entonces, solo tuve que cambiarlo a "compartido" de "tarea" para que use el volumen EBS existente.
El problema con rexray/ebs es que selecciona el volumen EBS existente solo cuando está en la misma AZ que la instancia. Entonces, en nuestro caso, necesitábamos anclar instancias específicas a AZ específicas para poder usar este controlador correctamente.
Nuestra configuración fue de 6 instancias en 3 AZ diferentes para una mejor disponibilidad y cada instancia tenía su propio EBS, pero después de reiniciar la instancia, fue a AZ aleatorio y 2 de 3 no pudieron encontrar el volumen. El mensaje de error en syslogs no fue muy informativo.
Aparte de eso, ese complemento hace lo que debería.
El siguiente es el ejemplo de definición de tareas que responde a la pregunta y brinda detalles adicionales si desea saber cómo crear un volumen gp3 con IOPS y cifrado especificado:
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" } } } }