Приложение FastAPI работает локально, но конечная точка /blogs вызывает цикл перенаправления при развертывании AWS LambdPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Приложение FastAPI работает локально, но конечная точка /blogs вызывает цикл перенаправления при развертывании AWS Lambd

Сообщение Anonymous »

Я разработал приложение FastAPI и развернул его на AWS Lambda в виде архива .zip. Локально, когда я запускаю:

Код: Выделить всё

uvicorn src.main:app --reload
Я могу получить доступ к конечной точке /blogs (

Код: Выделить всё

http://127.0.0.1:8000/blogs
) и возвращает правильные данные:

Код: Выделить всё

[
{
"title": "blog with relationship",
"description": "description",
"written_by": {
"username": "Sarthak",
"email": "sss@ssss.com",
"blogs": [
{ "title": "blog with relationship", "description": "description" },
{ "title": "blog with relationship", "description": "description"  }
]
}
}
]
Однако, когда я развертываю это приложение в AWS Lambda, используя следующий шаблон SAM:

Код: Выделить всё

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
Full:
Type: AWS::Serverless::Function
Properties:
CodeUri: .
Handler: src.main.handler
Runtime: python3.12
MemorySize: 128
Timeout: 60
FunctionUrlConfig:
AuthType: NONE
Я получаю сообщение об ошибке Слишком много перенаправлений при выполнении запроса GET к сгенерированному URL-адресу:

Код: Выделить всё

https://cjosbvzkkcjiaa4e7frfwtacia0molag.lambda-url.us-east-1.on.aws/blogs
Это также происходит при тестировании в Postman, где превышен максимальный предел перенаправлений.
Однако выполнение запросов к определенным идентификаторам блога, например:< /p>

Код: Выделить всё

https://cjosbvzkkcjiaa4e7frfwtacia0molag.lambda-url.us-east-1.on.aws/blogs/1
работает отлично, возвращая ожидаемый ответ.
Если я тестирую приложение с помощью панели Test в AWS Lambda менеджер консоли, используя шаблон AWS Proxy:

Код: Выделить всё

{
"body": "eyJ0ZXN0IjoiYm9keSJ9",
"resource": "/{proxy+}",
"path": "/blogs",
"httpMethod": "GET",
"isBase64Encoded": true,
"queryStringParameters": {
"foo": "bar"
},
"multiValueQueryStringParameters": {
"foo": [
"bar"
]
},
"pathParameters": {
"proxy": "/blogs"
},
"stageVariables": {
"baz": "qux"
},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "en-US,en;q=0.8",
"Cache-Control": "max-age=0",
"CloudFront-Forwarded-Proto": "https",
"CloudFront-Is-Desktop-Viewer": "true",
"CloudFront-Is-Mobile-Viewer": "false",
"CloudFront-Is-SmartTV-Viewer": "false",
"CloudFront-Is-Tablet-Viewer": "false",
"CloudFront-Viewer-Country": "US",
"Host": "1234567890.execute-api.us-east-1.amazonaws.com",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Custom User Agent String",
"Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)",
"X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==",
"X-Forwarded-For": "127.0.0.1, 127.0.0.2",
"X-Forwarded-Port": "443",
"X-Forwarded-Proto": "https"
},
"multiValueHeaders": {
"Accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
],
"Accept-Encoding": [
"gzip, deflate, sdch"
],
"Accept-Language": [
"en-US,en;q=0.8"
],
"Cache-Control": [
"max-age=0"
],
"CloudFront-Forwarded-Proto": [
"https"
],
"CloudFront-Is-Desktop-Viewer": [
"true"
],
"CloudFront-Is-Mobile-Viewer": [
"false"
],
"CloudFront-Is-SmartTV-Viewer": [
"false"
],
"CloudFront-Is-Tablet-Viewer": [
"false"
],
"CloudFront-Viewer-Country": [
"US"
],
"Host": [
"0123456789.execute-api.us-east-1.amazonaws.com"
],
"Upgrade-Insecure-Requests": [
"1"
],
"User-Agent": [
"Custom User Agent String"
],
"Via": [
"1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)"
],
"X-Amz-Cf-Id": [
"cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA=="
],
"X-Forwarded-For":  [
"127.0.0.1, 127.0.0.2"
],
"X-Forwarded-Port": [
"443"
],
"X-Forwarded-Proto": [
"https"
]
},
"requestContext": {
"accountId": "123456789012",
"resourceId": "123456",
"stage": "prod",
"requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef",
"requestTime": "09/Apr/2015:12:34:56 +0000",
"requestTimeEpoch": 1428582896000,
"identity": {
"cognitoIdentityPoolId": null,
"accountId": null,
"cognitoIdentityId": null,
"caller": null,
"accessKey": null,
"sourceIp": "127.0.0.1",
"cognitoAuthenticationType": null,
"cognitoAuthenticationProvider": null,
"userArn": null,
"userAgent": "Custom User Agent String",
"user": null
},
"path": "/blogs",
"resourcePath": "/{proxy+}",
"httpMethod": "GET",
"apiId": "1234567890",
"protocol": "HTTP/1.1"
}
}
Я получаю такой ответ:

Код: Выделить всё

{
"statusCode": 307,
"headers": {
"content-length": "0",
"location": "https://0123456789.execute-api.us-east-1.amazonaws.com/blogs/?foo=bar"
},
"multiValueHeaders": {},
"body": "",
"isBase64Encoded": false
}
Структура проекта (упрощенная)

Код: Выделить всё

├── aws_lambda_artifact.zip
└── src
├── main.py
├── routers
│   └── blog.py
├── models.py
└── database.py
Main.py

Код: Выделить всё

from fastapi import FastAPI
from mangum import Mangum

from src import models
from src.database import engine
from src.routers import blog, user

app = FastAPI()
handler = Mangum(app)

models.Base.metadata.create_all(bind=engine)

app.include_router(blog.router)
routers/blog.py

Код: Выделить всё

from typing import List

from fastapi import APIRouter, Depends, status
from sqlalchemy.orm import Session

from src.database import get_db
from src.oauth2 import get_current_user
from src.repository import blog_repository
from src.schemas import ShowBlog, Blog, User

router = APIRouter(
prefix="/blogs",
tags=["blogs"]
)

@router.get("/", response_model=List[ShowBlog])
async def blogs(db: Session = Depends(get_db)):
return blog_repository.get_all(db)

@router.get("/{blog_id}", response_model=ShowBlog)
async def get_blog(blog_id: int, db: Session = Depends(get_db)):
return blog_repository.get(blog_id, db)

@router.post("/create-blog", status_code=status.HTTP_201_CREATED)
async def create_blog(request: Blog, db: Session = Depends(get_db)):
return blog_repository.create(request, db)

@router.put("/{blog_id}", status_code=status.HTTP_202_ACCEPTED)
async def update_blog(blog_id: int, request: Blog, db: Session = Depends(get_db)):
return blog_repository.update(blog_id, request, db)

@router.delete("/{blog_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_blog(blog_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
return blog_repository.delete(blog_id, db)
Этапы развертывания
  • Установленные зависимости в папку Dependency/:

    Код: Выделить всё

    pip3 install -r requirements.txt --target=dependencies --python-version 3.12
    
  • Добавлены каталоги зависимостей и src в архив .zip:

    Код: Выделить всё

    (cd dependencies; zip ../aws_lambda_artifact.zip -r .)
    zip aws_lambda_artifact.zip -u -r src
    
Проблема
Корневая конечная точка /blogs зависла в цикле перенаправления, но определенные URL-адреса на основе идентификатора (например, /blogs/1) работают нормально. Есть идеи, почему это происходит и как я могу это решить?


Подробнее здесь: https://stackoverflow.com/questions/789 ... -aws-lambd
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»