You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的步骤:

  1. 进入CloudFront分发的行为设置
  2. 找到"自定义请求头"选项,添加X-CloudFront-Auth和对应的值
  3. 确保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权限体系:

  1. 修改Lambda Function URL的授权方式为AWS IAM,此时直接访问会因为没有IAM权限被拒绝
  2. 创建CloudFront的Origin Access Control(OAC),配置OAC允许调用Lambda Function URL
  3. 给OAC对应的IAM角色添加lambda:InvokeFunctionUrl权限,目标为你的Lambda函数
  4. 在CloudFront的源设置中,将Lambda Function URL设为源,并关联创建的OAC

这种方式下,只有CloudFront能通过OAC的授权访问Lambda,任何直接请求都会被IAM拒绝。


内容的提问来源于stack exchange,提问作者The Mahad Zone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:10:06