Настройка SSL через Let's Encrypt для Elastic Beanstalk

Я хочу включить SSL (используя Let's Encrypt) для моего проекта Django, работающего на AWS Elastic Beanstalk.

tldr:
. К сожалению, похоже, что когда Let's encrypt подключается к моему сайту, чтобы проверить наличие токена, вместо этого он получает ошибку 404.

During secondary validation: Invalid response from
   http://sub.example.com/.well-known/acme-challenge/Gzo8gzkIEbLmtvGkSDhnNheml9XxNsctHJA3ufA0FYI
   [107.20.106.65]: "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n
   <meta http-equiv=\"content-type\" content=\"text/html;
   charset=utf-8\">\n  <title>Page not "

Теперь я не знаю, вызвана ли эта проблема конфигурацией Django, конфигурацией nginx, Elastic Beanstalk, моим субдоменом, Certbot или чем-то еще...

Какие следующие шаги по отладке я должен предпринять?

(Конечно, sub.example.com означает существующий поддомен, которым я владею)


Мой домен, допустим: example.com был зарегистрирован через внешнего регистратора доменов, а затем я создал поддомен sub.example.com, который указывает на EB CNAME (foo-bar-foo-bar.bar-foo.us-east-1.elasticbeanstalk.com.).

Сайт доступен через http, используя оба адреса (sub.example.com и foo-bar-foo-bar.bar-foo.us-east-1.elasticbeanstalk.com) и отображает страницу приветствия Django с изображением зеленой ракеты.

Вот скрипт, который я создал для создания проекта и среды (следуя официальному руководству ):

VAR_MYDOMAIN=sub.example.com
VAR_NUMBER=7
VAR_PROJECT_DIRNAME=project-foo-$VAR_NUMBER
VAR_DJANGO_PROJECT_NAME=project_foo_$VAR_NUMBER
VAR_EB_APP_NAME=project_foo_app_$VAR_NUMBER
VAR_EB_ENV_NAME=project-foo-env-$VAR_NUMBER
VAR_AWS_KEYNAME=aws_keys_name

mkdir $VAR_PROJECT_DIRNAME
cd $VAR_PROJECT_DIRNAME
py -m venv eb-virt
source eb-virt/Scripts/activate
pip install django==2.1.1
django-admin startproject $VAR_DJANGO_PROJECT_NAME
cd $VAR_DJANGO_PROJECT_NAME
pip freeze > requirements.txt
mkdir .ebextensions
echo "option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: $VAR_DJANGO_PROJECT_NAME.wsgi:application" > .ebextensions/django.config
deactivate
eb init -p python-3.7 $VAR_EB_APP_NAME -r us-east-1 -k $VAR_AWS_KEYNAME
eb create $VAR_EB_ENV_NAME
ls
sed -i -e "s|ALLOWED_HOSTS = |ALLOWED_HOSTS = \['`eb status | grep "CNAME" | cut -f 2 -d : | xargs`\',\'$VAR_MYDOMAIN\']#|g" $VAR_DJANGO_PROJECT_NAME/settings.py && eb deploy
eb open
echo "done"

Затем я последовал этому руководству для того, чтобы

  1. install Certbot
  2. Open port 443
  3. Configure the certificate for Nginx
  4. Add certificate renewal to cron

Поэтому я создал этот скрипт:

VAR_MYDOMAIN=sub.example.com
VAR_NUMBER=7
VAR_PROJECT_DIRNAME=project-foo-$VAR_NUMBER
VAR_DJANGO_PROJECT_NAME=project_foo_$VAR_NUMBER

VAR_TEST_CERT=--test-cert
VAR_MYDOMAIN_EMAIL=validaddress@example.com

cd $VAR_PROJECT_DIRNAME/$VAR_DJANGO_PROJECT_NAME
mkdir .platform
mkdir .platform/hooks
mkdir .platform/hooks/postdeploy
echo "container_commands:
    00_download_epel:
        command: \"sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/\"
        ignoreErrors: true
        test: test ! -d \"/etc/letsencrypt/\"
    10_install_epel_release:
        command: \"sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm\"
        ignoreErrors: true
        test: test ! -d \"/etc/letsencrypt/\"
    20_enable_epel:
        command: \"sudo yum-config-manager --enable epel*\"
        ignoreErrors: true
        test: test ! -d \"/etc/letsencrypt/\"
    30_install_certbot:
        command: \"sudo yum install -y certbot python3-certbot-nginx python2-certbot-nginx python-certbot-nginx\"
        ignoreErrors: true
        test: test ! -d \"/etc/letsencrypt/\"" > .ebextensions/00_install_certbot.config
echo "Resources:
    sslSecurityGroupIngress:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
            GroupId: {\"Fn::GetAtt\" : [\"AWSEBSecurityGroup\", \"GroupId\"]}
            IpProtocol: tcp
            ToPort: 443
            FromPort: 443
            CidrIp: 0.0.0.0/0" > .ebextensions/01_open_https_port.config
echo "#!/bin/sh
sudo certbot -n $VAR_TEST_CERT -d $VAR_MYDOMAIN --nginx --agree-tos --email $VAR_MYDOMAIN_EMAIL" > .platform/hooks/postdeploy/00_get_certificate.sh
echo "container_commands:
    00_permission_hook:
        command: \"chmod +x .platform/hooks/postdeploy/00_get_certificate.sh\"" > .ebextensions/02_grant_executable_rights.config
echo "files:
    /tmp/renew_cert_cron:
        mode: \"000777\"
        owner: root
        group: root
        content: |
            0 1,13 * * * certbot renew --no-self-upgrade" > .ebextensions/03_renew_ssl_certificate_cron_job.config
eb deploy
eb open

К сожалению, во время развертывания я получаю следующие ошибки:

Upload Complete.
2022-01-30 17:57:02    INFO    Environment update is starting.
2022-01-30 17:57:42    INFO    Deploying new version to instance(s).
2022-01-30 17:57:46    INFO    Instance deployment successfully generated a 'Procfile'.
2022-01-30 17:58:54    ERROR   Instance deployment failed. For details, see 'eb-engine.log'.
2022-01-30 17:58:57    ERROR   [Instance: i-xxxxxxxxxxxxxxxxx] Command failed on instance. Return code: 1 Output: Engine execution has encountered an error..
2022-01-30 17:58:57    INFO    Command execution completed on all instances. Summary: [Successful: 0, Failed: 1].
2022-01-30 17:58:57    ERROR   Unsuccessful command execution on instance id(s) 'i-xxxxxxxxxxxxxxxxx'. Aborting the operation.
2022-01-30 17:58:57    ERROR   Failed to deploy application.
ERROR: ServiceError - Failed to deploy application.

В журналах я вижу следующую информацию:

Возможно, вы захотите проверить группу безопасности, подключенную к вашей среде elastic beanstalk. Попробуйте добавить входящее правило, которое будет разрешать весь трафик для всех диапазонов ip. (Не идеальный подход, но может помочь)

В моем случае у меня были ограниченные диапазоны ip, которые могли подключиться к сайту, и certbot не мог запустить вызовы.

Вернуться на верх