Django 无法在 ECS 中的同一任务中连接到 elasticsearch 集群

问题描述 投票:0回答:1

我使用以下容器定义将应用程序部署到 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 的连接不起作用。有人知道会发生什么吗?任何帮助将不胜感激。

django elasticsearch amazon-ecs
1个回答
0
投票

ECS 不为任务中的容器提供 DNS 名称解析。您可能期望它以这种方式工作,因为您已经习惯了 Docker Compose 的工作方式。

随着 ECS 任务在 Fargate 上运行,每个容器都可以被同一任务中各自端口上的 127.0.0.1

访问。因此,在您的情况下,您需要将 Django 中的 Elasticsearch 连接设置更改为以下内容:

ELASTICSEARCH_DSL = { "default": {"hosts": "127.0.0.1:9200"}, }
    
© www.soinside.com 2019 - 2024. All rights reserved.