Я работаю над тем, чтобы заставить статический веб-сайт вызывать API-шлюз с использованием CORS. Ниже приведен код, работающий с использованием SAM local, но я получаю следующую ошибку CORS при попытке вызвать мой API с помощью jQuery с моего статического веб-сайта (размещенного локально):
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.
Я видел несколько примеров CORS с API-шлюзом в Интернете, где другие использовали стандартные шаблоны API-шлюзов, а некоторые - с использованием SAM в дополнение к файлу swagger, но я не смог увидеть успешный пример кто-то заставляет CORS работать с использованием SAM без файла чванства (см. ссылки ниже). Я чувствую, что, должно быть, упускаю что-то очевидное!
Я использую обычный запрос POST от jQuery, я также могу опубликовать свой код переднего плана или «скомпилированный» 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', ''),
})
}