【要約】API Gateway/LambdaでResponse BodyをGZIP圧縮して軽量化 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者がサーバーレス構成を運用中、レスポンスサイズ超過によるエラーに直面した。具体的には、Lambdaのペイロード制限に抵触し、以下の問題が発生している。
- ・Lambdaの同期レスポンス制限である6MBを超過した。
- ・
RequestEntityTooLargeエラーが返却される。 - ・既存APIのフィールド削減は、影響範囲が広く困難である。
// Approach
開発者は、既存APIを維持しつつ軽量化するため、GZIP圧縮を採用した。API GatewayとLambdaの設定を変更し、バイナリ通信を可能にする手順である。
1.API Gatewayの
binaryMediaTypesに*/*を設定する。2.LambdaでJSONをUTF-8バイト列に変換する。
3.
gzip.compress()を用いてデータを圧縮する。4.圧縮データをBase64エンコードする。
5.
isBase64Encoded: trueとContent-Encoding: gzipを付与して返却する。// Result
この手法により、レスポンスサイズを大幅に削減し、制限を回避できる見込みを得た。具体的な成果と特性は以下の通りである。
- ・レスポンスサイズが約半減することが期待できる。
- ・API Gatewayの10MB制限の範囲内で、より大きなデータを扱える。
- ・CloudFront利用時、既に圧縮済みであれば二重圧縮は発生しない。
Senior Engineer Insight
> 6MBの壁は、データ量が増大するシステムにおいて避けて通れない課題だ。本手法は即効性がある。ただし、LambdaのCPU負荷増大やクライアントの負荷を考慮せよ。より大規模なデータには、ストリーミングレスポンス(200MB制限)への移行も検討すべきである。