【问题标题】:Is there a way to minimize the size of a CloudFront image response?有没有办法最小化 CloudFront 图像响应的大小?
【发布时间】:2020-07-31 02:07:14
【问题描述】:

我正在尝试寻找降低 Amazon CloudFront 成本的方法,并且在点击图像 URL 时,我会收到一堆响应标头,其中一些发送过来毫无意义,然后我试图弄清楚想办法减少响应的大小

我已经使用 Lamdba 函数和 Tinify API 自动压缩图像,我很想知道如何减少标题响应

当前的响应头是:

而 AWS S3 Bucket CORS 设置为

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Content-Length</AllowedHeader>
</CORSRule>
</CORSConfiguration>

在 Cloudfront 行为方面:

如何控制正在发送的标头,以便最小化响应?

顺便说一句,我们每月有 1600 亿次请求,价格高达 900 美元/月。 ????

【问题讨论】:

    标签: amazon-web-services amazon-cloudfront


    【解决方案1】:

    使用lambda@Edge 我可以删除自定义标头,但仅此而已...它仍然会发送X-Amz...X-Cache 标头,这些标头对于浏览器接收是没有意义的

    这是 20 分钟研究的结果:

    lamdba@edge函数内容:

    exports.handler = async (event, context) => {
        const response = event.Records[0].cf.response;
        const headers = response.headers;
    
        // console.log('before', JSON.stringify(headers).length, JSON.stringify(headers));
        
        /*
        {
            "x-amz-id-2": [
                {
                    "key": "x-amz-id-2",
                    "value": "XTGarjTktp+kDnYOCGbYkxDYLSZ9zHhUga6QSTNGhnqCuEgFRRvHsMcf0RbjrO6wsmX9NblckO0="
                }
            ],
            "x-amz-request-id": [
                {
                    "key": "x-amz-request-id",
                    "value": "E2FC8989DE42B358"
                }
            ],
            "date": [
                {
                    "key": "Date",
                    "value": "Thu, 30 Jul 2020 07:22:54 GMT"
                }
            ],
            "last-modified": [
                {
                    "key": "Last-Modified",
                    "value": "Mon, 27 Jul 2020 13:12:59 GMT"
                }
            ],
            "etag": [
                {
                    "key": "ETag",
                    "value": "\"115bbd98a61b665346d0b497f52cc94a\""
                }
            ],
            "x-amz-meta-cache-control": [
                {
                    "key": "x-amz-meta-cache-control",
                    "value": "max-age=604800"
                }
            ],
            "cache-control": [
                {
                    "key": "Cache-Control",
                    "value": "max-age=604800"
                }
            ],
            "x-amz-meta-file-compressed": [
                {
                    "key": "x-amz-meta-file-compressed",
                    "value": "Mon Jul 27 2020 13:12:58 GMT+0000 (Coordinated Universal Time)"
                }
            ],
            "accept-ranges": [
                {
                    "key": "Accept-Ranges",
                    "value": "bytes"
                }
            ],
            "server": [
                {
                    "key": "Server",
                    "value": "AmazonS3"
                }
            ],
            "content-type": [
                {
                    "key": "Content-Type",
                    "value": "image/png"
                }
            ],
            "content-length": [
                {
                    "key": "Content-Length",
                    "value": "73432"
                }
            ]
        }
        */
    
        // delete extra headers
        delete headers['age'];
        delete headers['via'];
        delete headers['connection'];
        delete headers['server'];
        delete headers['x-cache'];
        delete headers['x-amz-cf-pop'];
        delete headers['x-amz-cf-id'];
        delete headers['x-amz-meta-cache-control'];
        delete headers['x-amz-meta-file-compressed'];
        
        delete headers['x-amz-id-2'];
        delete headers['x-amz-request-id'];
        delete headers['etag'];
        
        // console.log('after', JSON.stringify(headers).length, JSON.stringify(headers));
    
        return response;
    };
    
    

    所以我们从 72.33Kb72.15Kb,这就是 0.18Kb 减少 ...我们希望 lambda 函数运行的成本没有超过我们节省的成本??

    Lambda 运行报告:

    REPORT RequestId: 433e05a2-fb70-45a5-9773-92f024d5f05c Duration: 3.94 ms Billed Duration: 50 ms Memory Size: 128 MB Max Memory Used: 65 MB Init Duration: 146.52 ms
    

    【讨论】:

    • 减少了 0.18kB 或 0.24%,节省了不到 900 美元的 3 美元。根据您的测量方式,实际减少的可能更少,因为 HTTP/2 具有标头压缩。我不会推荐这种方法。
    • @Michael-sqlbot 想法是删除所有其他标头...但不知何故我根本无法...将向 AWS 发送支持票,也许有办法...没有意义将AgeViaX-Amz-Cf-PopX-Amz-Cf-Id 发送到浏览器...仅在我们调试某些内容时才有用...您有什么建议?
    • 您确实意识到,如果您声明的流量为每月 1600 亿次请求,并且每百万次调用 Lambda@Edge 的价格为 0.60 美元,那么此解决方案每月将花费您 96,000 美元?对我来说似乎是虚假经济。
    • true,因此检查其他方式...我只是在测试免费的 1M 请求:)
    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2017-03-29
    • 2013-01-11
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多