フロントエンドから参照する静的コンテンツをBrotli圧縮でサイズ削減する

mackey

こんにちは、DWSのエンジニアのmackeyです。最近の業務で、フロントエンドから参照するcsvファイルをバックエンドで作成してS3にアップロードするという機会がありました。しかし、ファイルサイズが数MBとそれなりに大きくなってしまったため、パフォーマンス上の懸念がありました。そこで、Brotli圧縮を用いることでファイルサイズを削減しパフォーマンスの向上ができたので、今回はその紹介をしたいと思います。

Brotliとは

Brotliは、Googleが開発した高効率なデータ圧縮アルゴリズムです。ウェブコンテンツの配信に特に適しており、従来のgzip圧縮と比較して優れた性能を発揮します。Brotliの主な特徴は以下の通りです。

  1. 高い圧縮率:同じ品質でgzipよりも10%〜20%程度小さいファイルサイズを実現
  2. 高速な解凍:圧縮率の向上にもかかわらず、解凍速度は維持
  3. 広範なブラウザサポート:最新のほぼ全てのブラウザでサポート

これらの特徴により、Brotliはウェブサイトのパフォーマンス向上に大きく貢献します。ファイルサイズの削減とページ読み込み速度の改善が期待できるため、多くのウェブサイトで採用されています。

PythonでBrotli圧縮を行う

PythonでBrotli圧縮を行い、圧縮したファイルをAWS S3にアップロードする方法を説明します。まず、必要なライブラリをインストールします。

pip install brotli boto3

以下は、ファイルをBrotli圧縮し、S3にアップロードするPythonスクリプトの例です。

import mimetypes

import boto3
import brotli

input_file = "data.csv"

# ファイルを圧縮
with open(input_file, "rb") as f_in:
    data = f_in.read()
compressed_data = brotli.compress(data, quality=4)

# MIMEタイプを取得
content_type, _ = mimetypes.guess_type(input_file)

# S3にアップロード
s3 = boto3.client("s3")
s3.put_object(
    Bucket="my-bucket",
    Key="data.csv.br",
    Body=compressed_data,
    ContentType=content_type,
    ContentEncoding="br",
)

11行目が圧縮を実行している部分です。brotli.compress関数の引数のqualityは、圧縮レベルを設定するパラメータです。圧縮速度と圧縮率はトレードオフになっており、qualityの数値が高いほど、圧縮率は高いが圧縮速度は遅くなります。範囲は0から11で、デフォルト値は11です。
ファイルサイズが大きい場合、qualityが大きすぎると圧縮にかなりの時間がかかってしまうので、どの値にするかは実際に試して調節するのがいいでしょう。

また、注意すべき点として、ブラウザから参照できるようにするためには適切なヘッダーを付与する必要があります。CSVファイルの例では以下の二つが必要です。

  • Content-Type: text/csv
  • Content-Encoding: br

これらのヘッダーを付与するために、s3.put_objectでS3にアップロードする際に引数でメタデータを設定しています。

このようにアップロードしたファイルは、Brotliに対応したブラウザではヘッダーを解釈して自動的に解凍処理を行うので、フロントエンドのコードからは通常のファイル(.brがついていないもの)と同じように扱うことができます。例えば、fetch等の関数を使用してファイルを取得できます。

まとめ

今回はPythonでファイルをBrotli圧縮してアップロードする方法を紹介しました。Brotli圧縮を使用することで、静的コンテンツのサイズを効果的に削減し、Webサイトのパフォーマンスを向上させることができるでしょう。

AUTHOR
mackey
mackey
記事URLをコピーしました