【问题标题】:AWS Code Star Express API Enable CORS and Integration ResponseAWS Code Star Express API 启用 CORS 和集成响应
【发布时间】:2017-12-12 09:24:55
【问题描述】:

我正在使用 AWS Code star 并使用 Express Web 服务模板。代码星创建 Lambda 并创建 API Gateway API。该api有效,它返回我想要的。我正在尝试通过 API 网关启用 CORS,

API Gateway -> API -> 资源 -> 操作 -> 启用 CORS

在选项上设置 CORS 失败,因为没有为代理生成集成响应。这是图像。

我想我必须通过 YAML 进行配置,以生成选项和 GET 的集成响应。

这是我的 YAML

    AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
- AWS::CodeStar

Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar projectID used to associate new resources to team members

Resources:
  HelloWorld:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /
            Method: get
  GetById:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs4.3
      Role:
        Fn::ImportValue:
          !Join ['-', [!Ref 'ProjectId', !Ref 'AWS::Region', 'LambdaTrustRole']]
      Events:
        GetEvent:
          Type: Api
          Properties:
            Path: /api/getById
            Method: get 

这是我的 Lambda 处理程序。

    'use strict';

const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const server = awsServerlessExpress.createServer(app)

exports.handler = (event, context) => awsServerlessExpress.proxy(server, event, context);

如果有人可以帮助我如何调整 CloudFormation 模板,我将不胜感激。

【问题讨论】:

    标签: aws-lambda aws-api-gateway aws-codepipeline amazon-cloudformation aws-codestar


    【解决方案1】:

    您无需更改 CloudFormation 模板。如果您使用的是无服务器,则可以选择使用“cors: true”启用 CORS,如下所示:

    functions:
      suggest:
        handler: shopping-service.suggestWardrobe
        timeout: 20
        memorySize: 256
        name: demo-shopping-service
        description: Provides wardrobe suggestions based on a given Location
    
        events:
         - http:
            path: suggest
            method: get
            cors: true
    

    但这仅适用于 API 端点,不适用于 API lambda 代理。

    您必须在 lambda 回调中显式设置标头才能使 CORS 工作。

    let payload = {
        headers: {"Access-Control-Allow-Origin": "*"}
    };
    callback(null, payload);
    

    您还必须返回有效的 statusCode 和正文以及标头,否则 API 将无法将您的 lambda 响应转换为 API 响应。

    【讨论】:

      【解决方案2】:

      您不能将标头添加到代理集成的集成响应中。您需要在 lambda 的响应中添加 CORS 标头作为

      {
          "isBase64Encoded": true|false,
          "statusCode": httpStatusCode,
          "headers": { "headerName": "headerValue", ... },
          "body": "..."
      }
      

      http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format

      【讨论】:

        猜你喜欢
        • 2018-06-09
        • 2019-06-04
        • 2020-11-21
        • 2018-03-24
        • 2021-09-15
        • 2019-07-09
        • 2021-11-28
        • 2012-10-10
        • 2018-05-02
        相关资源
        最近更新 更多