Django не может подключиться к кластеру elasticsearch в рамках одной задачи в ECS

Я развернул приложение в задаче ECS, используя следующие определения контейнеров

[
 {
   "name": "api",
   "image": "${app_image}",
   "essential": true,
   "memoryReservation": 256,
   "environment": [
     {"name": "DJANGO_SECRET_KEY", "value": "${django_secret_key}"},
     {"name": "DB_HOST", "value": "${db_host}"},
     {"name": "DB_NAME", "value": "${db_name}"},
     {"name": "DB_USER", "value": "${db_user}"},
     {"name": "DB_PASS", "value": "${db_pass}"},
     {"name": "DEBUG", "value": "false"},
     {"name": "STORAGE_HOST", "value": "${bucket_host}"},
     {"name": "ALLOWED_HOSTS", "value": "${allowed_hosts}"},
     {"name": "DJANGO_SETTINGS_MODULE_STAGING", "value": "${django_settings_module}"},
     {"name": "S3_STORAGE_BUCKET_NAME", "value": "${s3_storage_bucket_name}"},
     {"name": "S3_STORAGE_BUCKET_REGION", "value": "${s3_storage_bucket_region}"}
   ],
   "logConfiguration": {
     "logDriver": "awslogs",
     "options": {
       "awslogs-group": "${log_group_name}",
       "awslogs-region": "${log_group_region}",
       "awslogs-stream-prefix": "api"
     }
   },
   "portMappings": [
     {
       "containerPort": 9000,
       "hostPort": 9000
     }
   ],
   "mountPoints": [
     {
       "readOnly": false,
       "containerPath": "/vol/web",
       "sourceVolume": "static"
     }
   ]
 },
 {
   "name": "proxy",
   "image": "${proxy_image}",
   "essential": true,
   "portMappings": [
     {
       "containerPort": 8000,
       "hostPort": 8000
     }
   ],
   "memoryReservation": 256,
   "environment": [
     {"name": "APP_HOST", "value": "127.0.0.1"},
     {"name": "APP_PORT", "value": "9000"},
     {"name": "LISTEN_PORT", "value": "8000"}
   ],
   "logConfiguration": {
     "logDriver": "awslogs",
     "options": {
       "awslogs-group": "${log_group_name}",
       "awslogs-region": "${log_group_region}",
       "awslogs-stream-prefix": "proxy"
     }
   },
   "mountPoints": [
     {
       "readOnly": true,
       "containerPath": "/vol/static",
       "sourceVolume": "static"
     }
   ]
 },
 {
   "name": "elasticsearch",
   "image": "${elasticsearch_image}",
   "essential": true,
   "memoryReservation": 256,
   "portMappings": [
     {
       "containerPort": 9200,
       "hostPort": 9200
     }
   ],
   "logConfiguration": {
     "logDriver": "awslogs",
     "options": {
       "awslogs-group": "${log_group_name}",
       "awslogs-region": "${log_group_region}",
       "awslogs-stream-prefix": "elasticsearch"
     }
   }
 }
]

В настройках django я настраиваю подключение к elasticsearch с помощью:

ELASTICSEARCH_DSL = {
   "default": {"hosts": "elasticsearch:9200"},
}

Я также настраиваю правила выхода и входа для группы безопасности службы с помощью terraform:

resource "aws_security_group" "ecs_service_api" {
  description = "Access for the ECS service"
  name        = "${local.prefix}-ecs-service-api"
  vpc_id      = data.terraform_remote_state.core.outputs.vpc_id

  egress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port = 5432
    to_port   = 5432
    protocol  = "tcp"
    cidr_blocks = [
      data.terraform_remote_state.core.outputs.subnet_public_a_cidr_block,
      data.terraform_remote_state.core.outputs.subnet_public_b_cidr_block,
    ]
  }

  ingress {
    from_port       = 8000
    to_port         = 8000
    protocol        = "tcp"
    security_groups = [aws_security_group.lb_api.id]

  }

  ingress {
    from_port       = 9200
    to_port         = 9200
    protocol        = "tcp"
    security_groups = [aws_security_group.lb_api.id]
  }

  tags = local.common_tags
}

Приложение было развернуто правильно, и контейнер elasticsearch работает нормально. Но соединение от django к elasticsearch не работает. Кто-нибудь знает, что может происходить? Любая помощь будет оценена по достоинству.

ECS не обеспечивает разрешение DNS-имен для контейнеров в задаче. Возможно, вы ожидаете, что это будет работать именно так, потому что привыкли к тому, как работает Docker Compose.

В ECS-задачах, запущенных на Fargate, каждый контейнер доступен другим контейнерам в той же задаче на 127.0.0.1 соответствующем порту (портах). Поэтому в вашем случае вам нужно изменить настройки подключения Elasticsearch в Django следующим образом:

ELASTICSEARCH_DSL = {
   "default": {"hosts": "127.0.0.1:9200"},
}
Вернуться на верх