在本地运行 AWS SAM CLI 时启用 CORS

Edu*_*nis 8 amazon-web-services aws-lambda aws-api-gateway aws-sam-cli serverless

每当我尝试通过浏览器通过 POST 访问无服务器 lambda 函数时,我都会收到错误消息

对预检请求的响应未通过访问控制检查:请求的资源上不存在 >'Access-Control-Allow-Origin' 标头。

当它是一个/GET它工作正常我读过它是因为它没有发送飞行前请求。当我把它改成POST这个的时候就是失败了。

我正在运行的命令:

sam local start-api

我的 template.yaml 是:

...

Resources:
    PropertiesFunction:
        Type: AWS::Serverless::Function
        Properties:
            CodeUri: target/service-0.0.1-SNAPSHOT.jar
            Handler: com.aws.PropertiesHandler::handleRequest
            Runtime: java8
            Events:
                PropertiesApi:
                    Type: Api
                    Properties:
                        Path: /properties
                        Method: post

...
Run Code Online (Sandbox Code Playgroud)

如何在这些端点上启用 CORS?

ngo*_*bui 10

我有同样的错误,我已经通过 3 个步骤修复了它。(Java8 中的 AWS Lambda,SAM CLI v0.37.0)

  1. 为您的标题添加选项:
    Map<String, String> headers = new HashMap<>();
    headers.put("Content-Type", "application/json");
    headers.put("X-Custom-Header", "application/json");
    headers.put("Access-Control-Allow-Origin", "*");
    headers.put("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, PATCH, DELETE");
    headers.put("Access-Control-Allow-Headers", "X-Requested-With,content-type");
Run Code Online (Sandbox Code Playgroud)
  1. 将 Option Cors 添加到 template.yaml 中
    Globals:
      Function:
        Timeout: 20
      Api:
        Cors:
          AllowMethods: "'GET,POST,OPTIONS'"
          AllowHeaders: "'content-type'"
          AllowOrigin: "'*'"
          AllowCredentials: "'*'"
Run Code Online (Sandbox Code Playgroud)
  1. 在 template.yaml 中更新属性资源函数
          Events:
            HelloWorld:
              Type: Api 
              Properties:
                # Path: /hello
                # Method: get
                Path: "/{proxy+}"
                Method: ANY
Run Code Online (Sandbox Code Playgroud)


me2*_*esh 6

首先,您需要在 template.yml 中添加以下部分以在 API 网关中启用 cors:

Globals:
  Api:
    Cors:
      AllowMethods: "'GET,POST,OPTIONS'"
      AllowHeaders: "'content-type'"
      AllowOrigin: "'*'"
      AllowCredentials: "'*'"
Run Code Online (Sandbox Code Playgroud)

然后在你的 lambda 函数响应中


        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        headers.add("Access-Control-Allow-Headers", requestContext.getHeaderString("Access-Control-Request-Headers"));
        headers.add("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,HEAD,OPTIONS");
Run Code Online (Sandbox Code Playgroud)


use*_*499 4

您应该能够通过在处理程序函数中将以下标头显式添加到响应中来解决本地测试的问题:

    "Access-Control-Allow-Origin": "*"
Run Code Online (Sandbox Code Playgroud)

如果您在本地运行,则可以使用仅添加标头的环境变量。

下面是我拥有的处理函数中的一个简单 Python 示例:

   if not all(field in values for field in required_fields):
    response = {
        'statusCode': 400,
        'body': json.dumps(
            {
                'message': 'Required data missing from request body'
            }
        )        
    }
    # explicitly add CORs headers for local testing
    response['headers'] = {"Access-Control-Allow-Origin": "*"}
    return response
Run Code Online (Sandbox Code Playgroud)

这仅适用于本地测试,当您部署到 API 网关时,COR 由 API 网关上的配置处理。

这个解决方案对我有用,直到我还使用 Cognito 用户池向 API 添加了授权,我目前正在尝试解决该问题。

这是关于该问题的类似帖子: How to Enable CORS for an AWS API Gateway Resource

这是 AWS 官方文档中对其的引用。