我在 AWS Lambda 中有一个 API,当我尝试调用它时,我收到与 CORS 策略相关的错误,尽管我认为我正确配置了 CORS。
我在 AWS Lambda 中有一个用 Python 编写的 API,我使用无服务器框架部署了该 API。尽管当我从前端获取 API 时,它会出现与 CORS 配置相关的错误。
“从源 'http://localhost:8080' 获取 'https://0vdu10a3e6.execute-api.eu-west-1.amazonaws.com/dev/init' 的访问已被 CORS 策略阻止:请求预检响应中的 Access-Control-Allow-Headers 不允许标头字段 access-control-allow-origin。”
尝试了一些修复后,我得到了这个,但我仍然收到错误
def init(event, context):
# removed most of the code
return {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "http://localhost:8080",
"Access-Control-Allow-Credentials": True,
"Access-Control-Allow-Headers": "Origin, Content-Type, Credentials",
"Access-Control-Allow-Methods": "POST, GET",
'Content-Type': "application/json"
},
"body": json.dumps(response)
}
这是我的 Dockerfile:
FROM public.ecr.aws/lambda/python:3.11.2023.09.12.11
WORKDIR /app
COPY Models/best.pt /app
COPY AcharyaMeasuringPrototype.py /app
COPY Utlis.py /app
COPY requirements.txt /app
RUN pip install --upgrade pip
RUN pip cache purge
RUN pip install 'ultralytics[yolo]~=8.0.147'
RUN pip install -r requirements.txt
EXPOSE 3000
CMD [ "AcharyaMeasuringPrototype.init" ]
这是我的 serverless.yaml:
service: acharya-ml
provider:
name: aws
runtime: python3.8
stage: dev
region: eu-west-1
iam:
role:
statements:
- Effect: "Allow"
Action:
- "ecr:InitiateLayerUpload"
- "ecr:SetRepositoryPolicy"
- "ecr:GetRepositoryPolicy"
Resource:
!Join
- ':'
- - 'arn:aws:ecr'
- Ref: AWS::Region
- Ref: AWS::AccountId
- 'repository/*'
plugins:
# - serverless-python-requirements
- serverless-offline
custom:
pythonRequirements:
dockerizePip: true
functions:
main:
image: 550512796301.dkr.ecr.eu-west-1.amazonaws.com/acharya-prototype-ml:latest
timeout: 30
events:
- http:
path: /init
method: POST
这就是我获取的方式:
const res = await fetch("https://hinjggqsg4.execute-api.eu-west-1.amazonaws.com/dev/init", {
method: "POST",
headers: {
'Content-Type': 'application/json'
},
});
我也没有登录 Lambda。 如果有人可以帮助我,我将不胜感激。谢谢您的宝贵时间。
错误消息提到“预检”。 这通常与 HTTP OPTION 方法相关联。 尝试返回:
def init(event, context):
# removed most of the code
return {
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "http://localhost:8080",
"Access-Control-Allow-Credentials": True,
"Access-Control-Allow-Headers": "Origin, Content-Type, Credentials",
"Access-Control-Allow-Methods": "POST, GET, OPTION",
'Content-Type': "application/json"
},
"body": json.dumps(response)
}