フロントエンドから参照する静的コンテンツをBrotli圧縮でサイズ削減する
こんにちは、DWSのエンジニアのmackeyです。最近の業務で、フロントエンドから参照するcsvファイルをバックエンドで作成してS3にアップロードするという機会がありました。しかし、ファイルサイズが数MBとそれなりに大きくなってしまったため、パフォーマンス上の懸念がありました。そこで、Brotli圧縮を用いることでファイルサイズを削減しパフォーマンスの向上ができたので、今回はその紹介をしたいと思います。
Brotliとは
Brotliは、Googleが開発した高効率なデータ圧縮アルゴリズムです。ウェブコンテンツの配信に特に適しており、従来のgzip圧縮と比較して優れた性能を発揮します。Brotliの主な特徴は以下の通りです。
- 高い圧縮率:同じ品質でgzipよりも10%〜20%程度小さいファイルサイズを実現
- 高速な解凍:圧縮率の向上にもかかわらず、解凍速度は維持
- 広範なブラウザサポート:最新のほぼ全てのブラウザでサポート
これらの特徴により、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サイトのパフォーマンスを向上させることができるでしょう。