Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

839
Views
Cómo resolver los problemas de verificación de estado de AWS Elastic Beanstalk Django

Recientemente implementé mi backend de la API de Django en AWS EB en su sistema Linux 2 (el nombre exacto de la plataforma es Python 3.7 running on 64bit Amazon Linux 2 ).

Casi todo funciona como se esperaba, pero el estado de salud de mi aplicación es Severe y después de horas de depuración, no tengo idea de por qué.

La comprobación del estado de la aplicación se gestiona mediante el siguiente punto final (módulo django-health-check ).

 url(r'^ht/', include('health_check.urls'))

El 100% de las solicitudes tienen un código de estado de 200 , pero mi estado de salud general es el siguiente:

 |--------------------|----------------|---------------------------------------------------| | instance-id | status | cause | |--------------------|----------------|---------------------------------------------------| | Overall | Degraded | Impaired services on all instances. | | i-0eb89f... | Severe | Following services are not running: release. | |--------------------|----------------|---------------------------------------------------|

Lo más extraño es el hecho de que el mensaje Los Following services are not running: release. es exclusivo de Internet (parece que nadie ha tenido ese problema antes).

La otra cosa extraña son los contenidos de mi archivo /var/log/healthd/daemon.log que son líneas similares a

 W, [2020-07-21T09:00:01.209091 #3467] WARN -- : log file "/var/log/nginx/healthd/application.log.2020-07-21-09" does not exist

donde cambia el tiempo.

Lo último que puede ser relevante son los contenidos de mi único archivo dentro del directorio .ebextensions :

 option_settings: "aws:elasticbeanstalk:application:environment": DJANGO_SETTINGS_MODULE: "app.settings" "PYTHONPATH": "/var/app/current:$PYTHONPATH" "aws:elasticbeanstalk:container:python": WSGIPath: app.wsgi:application NumProcesses: 3 NumThreads: 20 aws:elasticbeanstalk:environment:proxy:staticfiles: /static: static /static_files: static_files container_commands: 01_migrate: command: "source /var/app/venv/staging-LQM1lest/bin/activate && python manage.py migrate --noinput" leader_only: true packages: yum: git: [] postgresql-devel: []

¿Alguien tiene alguna idea de cómo se puede resolver esto? El objetivo final es tener la salud verde OK.


EDITAR: Al final cambié al sistema de salud Basic y los problemas desaparecieron de repente. Sin embargo, todavía estoy interesado en resolver el problema original, ya que el sistema de salud Enhanced brinda algunos beneficios.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Creo que el problema que tiene puede deberse a la configuración ALLOWED_HOSTS ubicada en su archivo settings.py.

EB envía una solicitud HTTP a su aplicación para ver si funciona, pero Django bloquea cualquier comunicación que no sea de los hosts especificados en la variable de configuración. Pero aquí hay un problema, EB envía la solicitud a la ip privada de la instancia ec2.

La forma más fácil de resolver esto es permitir todos los HOSTS como este dentro de su archivo settings.py :

 ALLOWED_HOSTS=['*']

Esto puede generar problemas de seguridad, pero es la forma más rápida de hacerlo. Ahora, para que funcione dinámicamente, ya que las instancias ec2 pueden activarse en cualquier momento, la IP privada cambia de una instancia a otra.

Para solucionar esto, debe obtener la IP privada al comienzo del proceso de implementación.

En la parte superior de su settings.py coloque las siguientes funciones:

 import os import requests # Other imports ... def is_ec2_linux(): """Detect if we are running on an EC2 Linux Instance See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html """ if os.path.isfile("/sys/hypervisor/uuid"): with open("/sys/hypervisor/uuid") as f: uuid = f.read() return uuid.startswith("ec2") return False def get_token(): """Set the autorization token to live for 6 hours (maximum)""" headers = { 'X-aws-ec2-metadata-token-ttl-seconds': '21600', } response = requests.put('http://169.254.169.254/latest/api/token', headers=headers) return response.text def get_linux_ec2_private_ip(): """Get the private IP Address of the machine if running on an EC2 linux server. See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html""" if not is_ec2_linux(): return None try: token = get_token() headers = { 'X-aws-ec2-metadata-token': f"{token}", } response = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', headers=headers) return response.text except: return None finally: if response: response.close() # Other settings

Las funciones más importantes son get_token() y get_linux_ec2_private_ip() , la primera establece el token de acceso y lo recupera para que la segunda lo use y obtenga la IP de la instancia ec2 actual.

Una vez que lo hayas recuperado, agrégalo a ALLOWED_HOSTS

 ALLOWED_HOSTS = ['127.0.0.1', 'mywebsite.com'] private_ip = get_linux_ec2_private_ip() if private_ip: ALLOWED_HOSTS.append(private_ip)

Después de eso, simplemente confirme sus cambios y vuelva a eb deploy si ha configurado la CLI de EB.

over 4 years ago · Santiago Trujillo Report

0

Hay un paquete django-ebhealthcheck que está diseñado para resolver este problema al obtener la ip local de su instancia ec2 y agregarla a ALLOWED_HOSTS , es muy simple de usar, solo tiene que agregar 'ebhealthcheck.apps.EBHealthCheckConfig' a INSTALLED_APPS

Página del paquete github: https://github.com/sjkingo/django-ebhealthcheck

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!