Как настроить WSS для AWS Elasti c Beanstalk, Django -Каналы и Docker - PullRequest
0 голосов
/ 15 марта 2020

Я настроил AWS Elasti c Beanstalk Multi-Container Environment, используя пользовательский образ Django -Channels, который я развертываю в Amazon ECR. Все функциональные возможности веб-сокета отлично работают при работе с протоколами HTTP и WS. Однако, когда я переключаюсь на HTTPS, все маршруты HTTPS обрабатываются должным образом, но WSS не может подключиться.

Ошибка в консоли браузера: WebSocket connection to 'wss://[REMOVED_URL]/' failed: Error during WebSocket handshake: Unexpected response code: 403

Нет ошибки в внутренних журналах, потому что кажется, что запрос от внешнего интерфейса не достигает внутреннего сервера. Я использую интерфейс React, который вызывает конечные точки серверной части Django -Rest-Framework (+ Django -Channels). Требуется ли какая-либо дополнительная конфигурация для WSS на стороне клиента?

/ docker -compose.yml

version: "3"

services:
    channels:
        build: .
        ports:
            - 80:8000
        environment:
            - DEBUG
            - SECURITY_KEY
            - DB_HOSTNAME
            - DB_NAME
            - DB_PASSWORD
            - DB_PORT

/ Dockerrun. aws. json

{
    "AWSEBDockerrunVersion": 2,
    "containerDefinitions": [
        {
            "essential": true,
            "image": "[PATH_TO_AWS_ECR_IMAGE]",
            "name": "channels",
            "portMappings": [
                {
                    "containerPort": 8000,
                    "hostPort": 80
                }
            ],
            "memory": 256
        }
    ],
    "family": "",
    "volumes": []
}

/ Dockerfile

FROM python:3.7.5

ENV PYTHONUNBUFFERED 1
ENV REDIS_HOSTS "redis"

WORKDIR /usr/src/app

RUN mkdir static

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

RUN python manage.py migrate --no-input
CMD ["daphne", "-b", "0.0.0.0", "-p", "8000", "core_backend.asgi:application"]

EXPOSE 8000

Часть сокета / индекса. js

export const setupSocket = (dispatch, path) => {
  let URL = process.env.WEBSOCKET_API_URL;
  const socket = new WebSocket(URL + path);

  socket.onopen = () => {
    let token = localStorage.getItem('token');
    if (token !== null) {
      socket.send(
        JSON.stringify({
          token: token,
          type: 'CONNECTION_ESTABLISHMENT',
        }),
      );
    }
  };
...

Теперь, поскольку все запросы протокола WS правильно обрабатываются Дафной, я не добавляю routing.py и другой код, связанный с настройкой веб-интерфейса. розетки ш Django. Вышеуказанная ошибка возникает только для протоколов WSS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...