AWS SAM: в запрошенном ответе ресурса отсутствует заголовок «Access-Control-Allow-Origin» - PullRequest
0 голосов
/ 05 июля 2018

Я работаю над тем, чтобы заставить статический веб-сайт вызывать 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', ''),
        })
    }
...