我正在使用AWS Code star并使用Express Web服务模板。 Code star创建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 Handler。
'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模板,我将不胜感激。
答案 0 :(得分:0)
您无法将标头添加到代理集成的集成响应中。您需要在lambda的响应中添加CORS标头
{
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "..."
}
答案 1 :(得分:0)
您无需更改CloudFormation模板。如果您正在使用无服务器,则可以选择使用" 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 lambda代理。
您必须在lambda回调中显式设置标头才能使CORS正常工作。
let payload = {
headers: {"Access-Control-Allow-Origin": "*"}
};
callback(null, payload);
您还必须返回有效的statusCode和正文以及标题,否则API将无法将您的lambda响应转换为API响应。