AWS流式响应Lambda未为OPTIONS请求设置CORS头问题求助
解决AWS Lambda响应流(Function URL)的CORS问题
你的问题核心是浏览器发起的OPTIONS预请求未被正确处理:curl直接发送请求不会触发预请求,因此能正常获取CORS头;但浏览器会先发OPTIONS请求验证权限,而你的Lambda函数当前未处理该请求方法,导致响应缺失必要CORS头,引发错误。
以下是两种可行的解决方式:
1. 在Lambda函数内直接处理OPTIONS请求
Function URL会将所有请求方法(包括OPTIONS)转发到Lambda,因此可以在handler开头判断请求方法,单独处理OPTIONS请求并返回完整CORS头:
修改后的代码示例:
//@ts-ignore exports.handler = awslambda.streamifyResponse( async (event: any, responseStream: any, context: any) => { const requestMethod = event.requestContext.http.method; // 处理OPTIONS预请求 if (requestMethod === 'OPTIONS') { const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Max-Age': '86400' // 缓存预请求结果24小时 }; //@ts-ignore const optionsResponseStream = awslambda.HttpResponseStream.from( responseStream, { statusCode: 200, headers: corsHeaders } ); optionsResponseStream.end(); return; } // 处理GET/POST等流式响应请求 const httpResponseMetadata = { statusCode: 200, headers: { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin': '*', }, }; //@ts-ignore responseStream = awslambda.HttpResponseStream.from( responseStream, httpResponseMetadata ); responseStream.write('First line \n'); await new Promise((resolve) => setTimeout(resolve, 500)); responseStream.write('Second line \n'); await new Promise((resolve) => setTimeout(resolve, 500)); responseStream.write('Done!!!'); responseStream.end(); } );
2. 用CloudFront作为Function URL的前置代理(可选)
若不想修改Lambda代码,可配置CloudFront分发指向你的Function URL,再在CloudFront中添加Lambda@Edge函数,在Origin Response或Viewer Response阶段注入CORS头、处理OPTIONS请求响应。这种方式配置稍复杂,适合需要统一管理多资源CORS策略的场景。
注意事项
- 生产环境不要将
Access-Control-Allow-Origin设为*,应指定具体前端域名以提升安全性。 Access-Control-Allow-Headers需包含前端实际发送的自定义请求头(如果有)。
内容的提问来源于stack exchange,提问作者c2tarun
相关产品推荐
相关产品推荐

