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"},
}