Lambda Function URL配置CORS仍全局可访问,求访问限制方案
解决Lambda Function URL被直接访问的问题
你之前配置的CORS仅能限制浏览器的跨域请求,无法阻止用户通过curl、Postman等工具直接访问Lambda URL——因为CORS是浏览器端的安全机制,非浏览器请求不会遵守CORS规则。要实现仅允许CloudFront触发Lambda,推荐以下几种方案:
方案1:Lambda内验证自定义请求头
这是最简单直接的方法:
- 给CloudFront分发的行为设置添加自定义请求头,比如
X-CloudFront-Auth,值设为一个只有你知道的密钥(比如my-secret-123) - 在Lambda代码中,检查请求头是否包含这个自定义头且值正确,否则返回403拒绝访问
示例Python代码:
import json def lambda_handler(event, context): # 从请求头中获取验证密钥(注意CloudFront转发的头会转成小写) auth_header = event["headers"].get("x-cloudfront-auth") VALID_SECRET = "my-secret-123" # 替换成你设置的密钥 if not auth_header or auth_header != VALID_SECRET: return { "statusCode": 403, "body": json.dumps("Invalid request origin") } # 这里写你的正常业务逻辑 return { "statusCode": 200, "body": json.dumps("Success") }
配置CloudFront的步骤:
- 进入CloudFront分发的行为设置
- 找到"自定义请求头"选项,添加
X-CloudFront-Auth和对应的值 - 确保CloudFront允许转发这个头到Lambda Function URL
方案2:用AWS WAF拦截非CloudFront请求
通过WAF规则限制只有来自CloudFront的请求能访问Lambda:
- 创建WAF Web ACL,关联到你的Lambda Function URL
- 添加规则:匹配请求中是否包含CloudFront专属的请求头(比如
CloudFront-Viewer-Address),或者直接限制请求来源IP为CloudFront的官方IP范围(AWS会定期更新CloudFront的IP列表) - 另一种方式:结合方案1的自定义请求头,WAF规则检查请求是否携带正确的自定义头,否则拦截
方案3:通过IAM授权+CloudFront OAC实现私有访问
这是最安全的方案,完全依赖AWS的IAM权限体系:
- 修改Lambda Function URL的授权方式为AWS IAM,此时直接访问会因为没有IAM权限被拒绝
- 创建CloudFront的Origin Access Control(OAC),配置OAC允许调用Lambda Function URL
- 给OAC对应的IAM角色添加
lambda:InvokeFunctionUrl权限,目标为你的Lambda函数 - 在CloudFront的源设置中,将Lambda Function URL设为源,并关联创建的OAC
这种方式下,只有CloudFront能通过OAC的授权访问Lambda,任何直接请求都会被IAM拒绝。
内容的提问来源于stack exchange,提问作者The Mahad Zone
相关产品推荐
相关产品推荐

