我有一个 sam 文件试图构建 lambda 函数的 API 网关。我正在关注最新的用于配置 cors 的 AWS 文档 https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-api-corsconfiguration.html。该文档引用如下:
正如您可能已经猜到的那样,这对我不起作用。如果我使用“http://localhost:3000”或其变体作为“AllowOrigin”属性,则会收到以下错误:
CORS 策略已阻止从源“http://localhost:3000”访问“xxx”处的 XMLHttpRequest:请求的资源上不存在“Access-Control-Allow-Origin”标头。
检查 API 网关,该属性确实存在。尽管它似乎只存在于选项中,而不存在于“ANY”部分。
如果我将其更改为AllowOrigin: "'*'",则会收到以下错误:
从源“http://localhost:3000”访问“xxxx”处的 XMLHttpRequest 已被 CORS 策略阻止:“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。
除此之外,还创建了一个单独的“Stage”阶段,我不明白该阶段,并且我不确定代理是否需要存在或在 SAM 文件中的位置创建。
这是我的 sam 的 yaml 文件。
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: Storygraf backend API
Globals:
Function:
Timeout: 3
Resources:
ExpressApi:
Type: AWS::Serverless::Api
Properties:
StageName: dev
Cors:
AllowOrigin: "'*'"
AllowMethods: "'POST, GET, PUT, DELETE'"
AllowHeaders: "'X-Forwarded-For, Content-Type'"
ExpressLambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ./
Handler: lambda.handler
MemorySize: 512
Runtime: nodejs14.x
Timeout: 30
Events:
ProxyApiRoot:
Type: Api
Properties:
RestApiId: !Ref ExpressApi
Path: /
Method: ANY
ProxyApiGreedy:
Type: Api
Properties:
RestApiId: !Ref ExpressApi
Path: /{proxy+}
Method: ANY
Update
看起来测试在通过代理时有效,但在使用非代理 GET 命令时没有任何可用。
Update
我发现打包过程正在更改报价 https://stackoverflow.com/questions/73490786/sam-package-is-adding-quotes-to-my-yaml-file,但这似乎不是问题。