我正在努力让一个静态网站使用 CORS 调用 API 网关。我已经使用本地 SAM 运行了下面的代码,但是尝试从我的静态网站(本地托管)使用 jQuery 调用我的 API 时遇到以下 CORS 错误:
Failed to load http://localhost:3000/notify: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4000' is therefore not allowed access.
我的template.yaml
:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Globals:
Api:
# enable CORS; to make more specific, change the origin wildcard
# to a particular domain name, e.g. "'www.example.com'"
Cors: "'*'"
Parameters:
RecaptchaSecret:
Type: String
Resources:
NotifierFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: notifier/build
Handler: app.lambda_handler
Runtime: python3.6
Environment:
Variables:
PARAM1: VALUE
Events:
Notify:
Type: Api
Properties:
Path: /notify
Method: post
Outputs:
NotifierApi:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/notify/"
NotifierFunction:
Value: !GetAtt NotifierFunction.Arn
NotifierFunctionIamRole:
Value: !GetAtt NotifierFunctionRole.Arn
我对Globals
SAM 部分的理解是,它应该将该Api
字段应用于我的(推断的)API 网关。
我在网上看到了一些带有 API 网关的 CORS 示例,其中其他人使用了标准 API 网关模板,还有一些人除了使用 swagger 文件之外还使用了 SAM,但我一直无法看到有人获得成功的示例CORS 在没有 swagger 文件的情况下使用 SAM 工作(参见下面的参考资料)。我觉得我一定错过了一些明显的东西!
我正在使用来自 jQuery 的常规 POST 请求,我可以发布我的前端代码,或者如果有帮助的话,也可以发布“已编译”的 CloudForamtion。
非常感谢任何帮助!
干杯:)
我看过的参考资料:
这是我的功能代码:
import json
import boto3
import requests
def lambda_handler(event, context):
print "REACHED"
print event
ip = requests.get('http://checkip.amazonaws.com/')
return {
"statusCode": 200,
"headers": {"Access-Control-Allow-Origin": "*"},
"body": json.dumps({
'message': 'hello world',
'location': ip.text.replace('\n', ''),
})
}