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

无法缓存Lambda@Edge触发的CloudFront 503错误,求解决方法

问题原因分析

你的503错误无法被缓存的核心原因有两个:

  1. Lambda执行错误的特殊处理:当Origin Request阶段的Lambda@Edge抛出异常/超时,CloudFront生成的是LambdaExecutionError类型的503响应,这种错误默认不会触发CloudFront的常规错误缓存逻辑——因为请求还未到达源站,CloudFront会将这类错误视为"临时执行故障",不会自动缓存。
  2. Origin Response Lambda未触发:由于异常发生在Origin Request阶段,请求不会流转到Origin Response环节,所以你在Origin Response中设置的Cache-Control: public, max-age=300完全不会生效,相当于白配置。
解决方案

针对这个场景,有两种可靠的解决方式,按需选择:

方案一:让Origin Request Lambda主动返回503响应(推荐)

不要直接抛出异常,而是构造标准的503响应并附带缓存头,这样CloudFront会将其视为正常响应进行缓存。

示例Node.js代码:

exports.handler = async (event) => {
    const request = event.Records[0].cf.request;

    // 模拟50%概率的故障场景
    if (Math.random() < 0.5) {
        return {
            status: '503',
            statusDescription: 'Service Unavailable',
            headers: {
                'cache-control': [{
                    key: 'Cache-Control',
                    value: 'public, max-age=300' // 缓存5分钟
                }],
                'content-type': [{
                    key: 'Content-Type',
                    value: 'text/html; charset=utf-8'
                }]
            },
            body: '<!DOCTYPE html><html><head><title>503 Service Unavailable</title></head><body><h1>暂时无法访问,请稍后重试</h1></body></html>'
            // 也可以通过Location头重定向到你的自定义错误页,不过直接返回内容更高效
        };
    }

    // 正常访问校验逻辑
    return request;
};

这种方式下,CloudFront会严格按照你设置的Cache-Control头缓存503响应,同时避免触发Lambda执行错误的特殊逻辑,彻底解决重复调用Lambda的问题。

方案二:调整CloudFront配置以缓存LambdaExecutionError的503

如果你必须保留Lambda抛出异常的逻辑,需要调整两项配置:

1. 修改缓存策略,允许缓存503状态码

默认缓存策略仅缓存200-399的响应,需要明确添加503到可缓存状态码列表:

MinTTL: 7200 # 2 hours
MaxTTL: 7200 # 2 hours
DefaultTTL: 7200 # 2 hours
CacheableStatusCodes:
  - 200-399
  - 503
ParametersInCacheKeyAndForwardedToOrigin:
  CookiesConfig:
    CookieBehavior: none
  HeadersConfig:
    HeaderBehavior: none
  QueryStringsConfig:
    QueryStringBehavior: none

2. 确保自定义错误页的ErrorCachingMinTTL生效

你的现有自定义错误页配置已经设置了ErrorCachingMinTTL: 300,该配置的优先级高于响应头的Cache-Control,最终缓存时间会是5分钟。不过这种方式的可靠性略低于方案一,因为CloudFront对LambdaExecutionError的缓存逻辑可能存在边缘场景的限制。

内容的提问来源于stack exchange,提问作者Yves M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:37:06