API-интерфейс AWS Code Star Express включает CORS и ответ интеграции

Я использую AWS Code star и использую шаблон веб-службы Express. Code star создает Lambda и создает API шлюза API. API работает, возвращает то, что я хочу. Я пытаюсь включить CORS через шлюз API,

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 

Вот мой лямбда-обработчик.

    '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.




Ответы (2)


Вы не можете добавлять заголовки в ответ интеграции для прокси-интеграции. Вам нужно будет добавить заголовки 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

person Abhigna Nagaraja    schedule 09.07.2017

Вам не нужно менять свой шаблон CloudFormation. Если вы используете Serverless, у вас есть возможность включить CORS с «cors: true», как показано ниже:

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.

Вы должны явно установить заголовок в обратном вызове лямбда, чтобы CORS работал.

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

Вы также должны вернуть допустимый статусCode и тело вместе с заголовками, иначе API не сможет преобразовать ваш лямбда-ответ в ответ API.

person Ben Richards    schedule 10.07.2017