Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

860
Visualizações
Al implementar Django en AWS Fargate, ¿cómo agrega la IP local en ALLOWED_HOSTS?

Estoy probando la implementación de mi aplicación Django en el servicio Fargate de AWS.

Todo parece funcionar, pero recibo errores de Health Check ya que Application Load Balancer envía solicitudes a mi aplicación Django usando la IP local del host. Esto me da un error de host permitido en los registros.

Encabezado HTTP_HOST no válido: '172.31.86.159:8000'. Es posible que deba agregar '172.31.86.159' a ALLOWED_HOSTS

Intenté obtener la IP local en el momento de inicio de la tarea y agregarla a mi ALLOWED_HOSTS, pero esto falla en Fargate:

 import requests EC2_PRIVATE_IP = None try: EC2_PRIVATE_IP = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4', timeout = 0.01).text except requests.exceptions.RequestException: pass if EC2_PRIVATE_IP: ALLOWED_HOSTS.append(EC2_PRIVATE_IP)

¿Hay alguna forma de obtener la dirección IP de ENI para poder agregarla a ALLOWED_HOSTS?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Ahora bien, esto funciona y se alinea con la documentación, pero no sé si es la MEJOR manera o si hay una MEJOR MANERA.

Mis contenedores se ejecutan en el modo de red awsvpc .

https://aws.amazon.com/blogs/compute/under-the-hood-task-networking-for-amazon-ecs/

...el agente de ECS crea un contenedor de "pausa" adicional para cada tarea antes de iniciar los contenedores en la definición de la tarea. Luego configura el espacio de nombres de red del contenedor de pausa ejecutando los complementos CNI mencionados anteriormente. También inicia el resto de contenedores en la tarea para que compartan su pila de red del contenedor de pausa. (énfasis mío)

asumo el

para que compartan su pila de red del contenedor de pausa

Significa que realmente solo necesitamos la dirección IPv4 del contenedor de pausa. En mis pruebas no exhaustivas, parece que esto siempre es Container[0] en el metadato de ECS: http://169.254.170.2/v2/metadata

Con esas suposiciones en juego, esto funciona, aunque no sé qué tan inteligente es hacerlo:

 import requests EC2_PRIVATE_IP = None METADATA_URI = os.environ.get('ECS_CONTAINER_METADATA_URI', 'http://169.254.170.2/v2/metadata') try: resp = requests.get(METADATA_URI) data = resp.json() # print(data) container_meta = data['Containers'][0] EC2_PRIVATE_IP = container_meta['Networks'][0]['IPv4Addresses'][0] except: # silently fail as we may not be in an ECS environment pass if EC2_PRIVATE_IP: # Be sure your ALLOWED_HOSTS is a list NOT a tuple # or .append() will fail ALLOWED_HOSTS.append(EC2_PRIVATE_IP)

Por supuesto, si pasamos el nombre del contenedor que debemos establecer en la definición de la tarea de ECS, también podríamos hacer esto:

 import os import requests EC2_PRIVATE_IP = None METADATA_URI = os.environ.get('ECS_CONTAINER_METADATA_URI', 'http://169.254.170.2/v2/metadata') try: resp = requests.get(METADATA_URI) data = resp.json() # print(data) container_name = os.environ.get('DOCKER_CONTAINER_NAME', None) search_results = [x for x in data['Containers'] if x['Name'] == container_name] if len(search_results) > 0: container_meta = search_results[0] else: # Fall back to the pause container container_meta = data['Containers'][0] EC2_PRIVATE_IP = container_meta['Networks'][0]['IPv4Addresses'][0] except: # silently fail as we may not be in an ECS environment pass if EC2_PRIVATE_IP: # Be sure your ALLOWED_HOSTS is a list NOT a tuple # or .append() will fail ALLOWED_HOSTS.append(EC2_PRIVATE_IP)

Cualquiera de estos fragmentos de código entraría en la configuración de producción de Django.

¿Hay una mejor manera de hacer esto que me estoy perdiendo? Nuevamente, esto es para permitir las verificaciones de estado del balanceador de carga de aplicaciones. Cuando se usa ECS (Fargate), el ALB envía el encabezado del host como la IP local del contenedor.

over 4 years ago · Santiago Trujillo Relatório

0

En fargate, hay una variable de entorno inyectada por el agente de contenedor de AWS: ${ECS_CONTAINER_METADATA_URI}

Esto contiene la URL del punto final de metadatos, por lo que ahora puede hacer

 curl ${ECS_CONTAINER_METADATA_URI}

La salida se ve algo como

 { "DockerId":"redact", "Name":"redact", "DockerName":"ecs-redact", "Image":"redact", "ImageID":"redact", "Labels":{ }, "DesiredStatus":"RUNNING", "KnownStatus":"RUNNING", "Limits":{ }, "CreatedAt":"2019-04-16T22:39:57.040286277Z", "StartedAt":"2019-04-16T22:39:57.29386087Z", "Type":"NORMAL", "Networks":[ { "NetworkMode":"awsvpc", "IPv4Addresses":[ "172.30.1.115" ] } ] }

Debajo de la clave Networks encontrará IPv4Address

Poniendo esto en python, obtienes

 METADATA_URI = os.environ['ECS_CONTAINER_METADATA_URI'] container_metadata = requests.get(METADATA_URI).json() ALLOWED_HOSTS.append(container_metadata['Networks'][0]['IPv4Addresses'][0])

Una solución alternativa a esto es crear un middleware que omita la verificación ALLOWED_HOSTS solo para su punto final de verificación de estado, por ejemplo

 from django.http import HttpResponse from django.utils.deprecation import MiddlewareMixin class HealthEndpointMiddleware(MiddlewareMixin): def process_request(self, request): if request.META["PATH_INFO"] == "/health/": return HttpResponse("OK")
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda