CloudFront + Ubuntu EC2 + Пользовательский порт работает для HTTP, но не для HTTPS

Вопрос или проблема

Я пытаюсь использовать CF -> EC2 с доменом из Route 53 и SSL из ACM, но этот URL работает только по HTTP, а по HTTPS возвращает 504 ERROR: The request could not be satisfied.:

1

EC2 работает на Ubuntu+Python+Flask+Waitress для обслуживания API на порту 5000. Я включил весь IP4/IP6 входящий/исходящий трафик в конфигурации EC2, отключил брандмауэр в Ubuntu и могу получить доступ к нему напрямую через http://IP адрес, что работает нормально.

Есть идеи, почему это работает по HTTP, но не по HTTPS? Он должен перенаправлять HTTPS-трафик на порт 5000, верно?

2

Ответ или решение

Проблема, с которой вы столкнулись, скорее всего связана с неправильной настройкой CloudFront для обработки HTTPS-трафика. Давайте рассмотрим основные шаги, которые необходимо выполнить для правильной конфигурации вашего окружения.

1. Настройка CloudFront

  1. Проверьте настройки дистрибутива CloudFront:

    • Убедитесь, что в настройках Origin установлен правильный URL-адрес вашего EC2-инстанса. Для HTTPS используйте формат http://IP-адрес-EC2:5000.
    • В поле Origin Protocol Policy выберите HTTPS Only, чтобы требовать использование HTTPS при обращении к вашему Origin.
  2. Настройка поведения (Behavior):

    • Убедитесь, что в настройках поведения установлен правильный путь, например, /*, чтобы обрабатывать все запросы.
    • Проверьте, что метод запросов (Allowed HTTP Methods) включает GET, HEAD, OPTIONS, PUT, POST и DELETE, если это необходимо.
  3. SSL-сертификат:

    • Убедитесь, что вы правильно настроили SSL-сертификат ACM (AWS Certificate Manager) и он правильно связан с вашим CloudFront дистрибутивом.
    • Выберите «Custom SSL Certificate» и укажите ваш сертификат.

2. Настройка Security Groups на EC2

Убедитесь, что ваши группы безопасности (Security Groups) разрешают входящий трафик на 443 (HTTPS).

  1. Перейдите в раздел "EC2 > Security Groups".
  2. Выберите группу безопасности вашего инстанса и добавьте правило:
    • Type: HTTPS
    • Protocol: TCP
    • Port Range: 443
    • Source: 0.0.0.0/0 (или ограничьте нужными IP-адресами, если необходимо).

3. Порт на EC2

Flask (с использованием Waitress) слушает на порту 5000 по умолчанию. Чтобы правильно обрабатывать HTTPS-запросы, необходимо убедиться, что ваши запросы фактически перенаправляются на этот порт.

4. Настройка Nginx или Apache (если необходимо)

Если требуется, можно установить веб-сервер (например, Nginx или Apache) для управления вашим приложением. Установив сервер, вы можете настроить его для получения HTTPS-запросов на порту 443 и проксирования их на ваш Flask-приложение, работающее на порту 5000.

Пример конфигурации для Nginx:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/your/certificate.pem;
    ssl_certificate_key /path/to/your/key.pem;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

5. Проверка и тестирование

После внесения всех изменений проверяйте доступность вашего API через HTTPS. Убедитесь, что:

  • Дистрибутив CloudFront был обновлен (может занять некоторое время из-за кэширования).
  • Вы очищали кеш браузера или используете режим инкогнито для тестирования.

Заключение

После выполнения всех вышеуказанных шагов вы должны быть в состоянии обрабатывать HTTPS-запросы к вашему Flask API из CloudFront. Если проблема сохранится, желательно проверить логи CloudFront и EC2 для поиска дополнительной информации о возникших ошибках.

Оцените материал
Добавить комментарий

Капча загружается...