Estoy desarrollando una aplicación esbelta que utiliza un backend FastAPI para interactuar con una base de datos PostgreSQL que es local para mi organización, no en mi instancia de AWS EC2.
Utilizo la API de recuperación de javascript para enviar solicitudes a mi backend para consultar la base de datos por varias cosas, en mi máquina local todas estas solicitudes se reciben en ambos extremos, en AWS, sin embargo, las solicitudes de mi frontend ni siquiera son reconocidas por el fastAPI backend.
No tengo experiencia en la configuración de servidores como este, así que asumo que hay algún error básico en la configuración de estos servidores que hace que la comunicación entre ellos en AWS sea imposible.
El código fastapi se ve así:
import uvicorn from fastapi import (Depends, FastAPI, HTTPException, Query, Request) from fastapi.middleware.cors import CORSMiddleware app = FastAPI(debug=True) origins = [ '*' ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get("/") async def root(): return {"message": "Hello World"} if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port=8000)Mis solicitudes de búsqueda suelen tener este aspecto:
const endpoint = public_IP:8000 + `/`; let objs = []; fetch(endpoint) .then(response => { if (!response.ok) { throw Error(response.statusText); } return response.json(); })Cuando envío una solicitud de recuperación como la anterior, aparece un error de CORS con el motivo: la solicitud de CORS no tuvo éxito. El servidor FastAPI no tiene comentarios, la solicitud nunca parece llegar, no estoy seguro de por qué. Por lo que sé, esto generalmente tiene que ver con problemas entre solicitudes con HTTP y HTTPS, pero estos no parecen relevantes para mi problema ya que ninguna parte de mi configuración no usa HTTP. Cuando uso Chrome, aparece el error: Failed to load resource: net::ERR_CONNECTION_REFUSED también.
Mis grupos de seguridad de AWS para mi instancia EC2 permiten el tráfico TCP desde cualquier IP a los puertos 5000 y 8000. Que es donde están alojadas mis dos aplicaciones, Svelte y FastAPI respectivamente.
Lo más probable es que su punto final en la aplicación fastapi genere una excepción. Cuando esto ocurre, el CORSMiddleware instalado a través app.add_middleware(...) no ve ninguna respuesta HTTP y no tiene posibilidad de hacer su trabajo en la respuesta HTTP producida por el controlador de errores FastAPI.
La solución es envolver toda la aplicación FastAPI con CORSMiddleware como en:
import uvicorn from fastapi import (Depends, FastAPI, HTTPException, Request from fastapi.middleware.cors import CORSMiddleware app = FastAPI(debug=True) origins = [ '*' ] @app.get("/") async def root(): return {"message": "Hello World"} app = CORSMiddleware( app=app, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port=8000)Los errores de CORS pueden ser muy confusos a veces porque los mensajes de error no son lo suficientemente claros y hay muchas soluciones posibles.
0.0.0.0 y luego intenta realizar una solicitud a otro host, por ejemplo 127.0.0.1 , la solicitud se bloquea para evitar ataques XSS. Cambiar su host de 0.0.0.0 a 127.0.0.1 debería solucionar este problema.
Si eres un Mozillian, hay errores [ ver , ver ] en Mozilla, pero si este es el caso, tu código debería estar funcionando en otro navegador
Solución: debe habilitar el certificado en cada puerto individualmente.
Intente cambiar su punto final este
const endpoint = public_IP:8000 + `/`;a esto
const endpoint = `/`;