咨询一个 Cloudflare 用法,我没 PRO 套餐,无法测试 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
odirus
V2EX    Cloudflare

咨询一个 Cloudflare 用法,我没 PRO 套餐,无法测试

  •  
  •   odirus 309 天前 2175 次点击
    这是一个创建于 309 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在我有一批资源是放到阿里云 OSS 的,我希望在用户请求时,能够通过 Cloudflare Worker 存储到 R2 。

    由于 R2 不支持从 OSS 回源取数据(只支持 S3 、Google )下面是我计划做的做法:

    1. 配置一域名(称为 domainA )指向 R2 ;
    2. 配置一个域名(称为 domainB )指向特定的 Worker ,专门用于从 OSS 下载资源并上传到 R2 ;
    3. 设置 “转换规则( Transform Rules )”,当访问 domainA 且 response httpStatusCode = 404 的时候,执行:
      2.a 增加 Header:Location ,指向 domainB + DomainA fullPath (去除 host 部分),这个我测试过可以达到预期;
      2.b 增加 Header:status = 302 ,问题就在这里,Transform Rules 是不支持修改 status code 的;

    我通过文档找到 custom-error-responses 这个产品,从文档来看似乎是支持修改响应状态码,并且还会保留其他响应 Header ,这样就可以达到 “修改 statusCode + 增加 Location” 的目的了。

    不过我现在没有 PRO 套餐,个人买的话也不划算,我不确定 Transform Rules + custom-error-responses 是否可以协同达到我的预期目标。

    如果你有 Cloudflare PRO 套餐的话,请帮忙验证下是否能够满足我说的这个需求,如果确认可以,请加我微信(就是我的用户名),我给红包,不胜感激。

    为什么不全用 Worker ,目的还是节省经费,我上面的方案是当资源 404 的时候才会走 worker 搬运资源的逻辑,所以成本会少很多。

    13 条回复    2024-12-08 21:55:20 +08:00
    odirus
        1
    odirus  
    OP
       309 天前
    odirus
        2
    odirus  
    OP
       309 天前
    可能这段内容被 Cloudflare 识别为攻击,发就报错,用图片吧。

    ![测试步骤]( https://imgur.com/a/JxaUbx3)
    ChicC
        3
    ChicC  
       308 天前 via iPhone
    odirus
        4
    odirus  
    OP
       308 天前
    @ChicC

    如果用 worker 的话,每次都得用 worker ,费用一下子就上去了;我预期是 R2 里面没资源时才使用 worker 。

    我最开始是找的能不能在网站返回 404 的时候再执行特定 Cloudflare worker ,但确认不支持这种能力(要用 worker ,那全部请求都会执行 worker ),所以才找到了这个可能的方向。
    Aoang
        5
    Aoang  
       308 天前
    没必要那么麻烦,可以看看 Cloudflare Snippets ,无额外费用。
    odirus
        6
    odirus  
    OP
       307 天前
    @Aoang 这个产品也看了,和 worker 一样,要读取 response 的话,worker 里面就要执行 下面的代码:
    ```
    const respOnse= await fetch(request);

    f (response.ok) then {
    return response;
    } else {
    data = downloadFromOss()
    upload2R2(data)
    return data;
    }
    ```

    意味着所有请求都需要经过这个处理,先不说费用怎么样,就是 Limit ( Maximum execution time = 5ms 、Maximum memory = 2MB )都满足不了大文件下载、上传
    odirus
        7
    odirus  
    OP
       307 天前
    可以不用测试了,我开了个 PRO 测试,才发现文档写清楚了,修改后的 status code 要求是 > 400 ,满足不到我的需求。

    不太懂为啥 Cloudflare 不让这样处理,从技术上看起来是没什么影响的,但就是不给这样用,估计是会影响他的 worker 收益。
    odirus
        8
    odirus  
    OP
       307 天前
    @Aoang Snippets 确认不可以,如果是请求 R2 里面的文件,会超出 Limit ,然后返回 500 给请求方,不能用在回源这种场景。
    Aoang
        9
    Aoang  
       307 天前 via iPhone
    没明白你这操作是要干啥。你不是想要请求资源不存在时,回源转储吗?

    Snippets 接到请求后,请求 R2 ,状态码正常则直接返回。不正常的情况下,直接调用其他接口去处理。

    至于限制的问题,限制的是 CPU 占用时间和最大使用内存。

    按照我说的方法,内存就只用于解析一下 HTTP 头,Body 再大也不会在复制到内存里面。
    odirus
        10
    odirus  
    OP
       307 天前
    @Aoang 测试过,可以这样用,但 Limit 中的 5ms 执行限制太短了,就算是 HEAD 请求 R2 ,网络不好的情况下就超时了。
    Aoang
        11
    Aoang  
       307 天前 via iPhone   1
    不知道你是没有看懂,还是怎么。

    5ms 是 CPU 限制,不包含 I/O 等待。城域网延迟就 5ms ,正常网络请求几百毫秒再正常不过了。

    是不是超时,看看代码写的啥吧。就这种代码…能吃啥 CPU ?

    export default {
    async fetch(request) {
    const resp = await fetch("https://example.com/api/get-file")
    if (resp.status === 200) {
    return new Response(resp.body, resp)
    }

    return fetch("https://example.com/api/update-file")
    },
    };
    Aoang
        12
    Aoang  
       307 天前 via iPhone
    https://developers.cloudflare.com/rules/snippets/#availability

    还有一点,确保你的代码中,一次请求中,代码中发出去的请求不会超出两个,否则你就得升级计划。

    重定向也算是一个请求,除非你返回重定向给客户端。
    odirus
        13
    odirus  
    OP
       307 天前
    @Aoang 感谢,你这么一说,我查了下社区问答,的确有这个说法(不包含 IO 等待时间),只是我一直没在手册上找到,又是商业项目,所以不太敢用。感谢了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1149 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 17:47 PVG 01:47 LAX 10:47 JFK 13:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86