AWS Kinesis Data Firehose で GZIP 圧縮して S3 に流したデータをブラウザーでダウンロードすると GZIP 圧縮されてない? と勘違いしたときのメモ。
Firehose で GZIP 圧縮して S3 に流したデータをダウンロードすると GZIP 圧縮されてない?
サーバーのログは Firehose で S3 に流してて Firehose のデータ配信ストリームは S3 のデータ使用量を抑えるためにサーバーのログを GZIP 圧縮してから S3 に保存するように設定してるんだけど、ブラウザーで S3 に保存してるサーバーのログをダウンロードしてファイルタイプを確認したら GZIP じゃなくて JSON だった。 サーバーのログは JSON 形式で出力しているんだけど Firehose がサーバーのログを GZIP 圧縮してなさそうに思ったので「Firehose の配信ストリームの設定を間違えてるのかな?」と少し調べたときのメモ。
結論としては Firehose の配信ストリームの設定は間違ってなくて Firehose のデータ配信ストリームから S3 に流すときにちゃんと GZIP 圧縮してる。
事象
サーバーのログは JSON 形式で出力してて Firehose の配信ストリーム経由で S3 に保存している。
Firehose のデータ配信ストリームは S3 のデータ使用量を抑えるためにサーバーのログを GZIP 圧縮してから S3 に保存するように設定してるんだけど、ブラウザーで AWS コンソールを表示して保存してるサーバーのログをダウンロードしてファイルタイプを確認したら GZIP じゃなくて JSON だった。 テキストエディターでログ (data.gz) を表示してみると普通に表示できてやっぱり JSON になってる。
$ file data.gz data.gz: JSON data
一応、AWS CLI で同じログを S3 からダウンロードすると今度はファイルタイプが GZIP になってる。 やっぱり Firehose の配信ストリームの設定は合ってるっぽい。
$ aws s3 cp s3://hoge-bucket/data.gz data-2.gz download: s3://hoge-bucket/data.gz to ./data-2.gz $ file data-2.gz data-2.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT), original size modulo 2^32 3115
原因
S3 に保存してるサーバーのログを AWS コンソールでいろいろ見たりググったりしたら、どうも原因は Firehose がデータを S3 に保存するときに Content-Encoding: gzip
メタデータをサーバーのログに付与してからっぽい。
AWS コンソールでサーバーのログのメタデータを表示すると Content-Encoding: gzip
が付いてる。
Content-Encoding: gzip
がサーバーのログに付いてるのでブラウザーでアクセスすると Content-Encoding: gzip
ヘッダーがレスポンスヘッダーに付く。
ブラウザーはレスポンスに Content-Encoding: gzip
ヘッダーが付いてると body を自動的に GZIP 展開するのでダウンロードして保存したサーバーのログは GZIP 圧縮前の JSON になっているということのようだった。
結論
サーバーのログサイズはかなり大きいのでローカルにダウンロードすることはめったにないのと、あとたぶん実際にサーバーのログをローカルにダウンロードするときは AWS CLI でダウンロードすると思うので結論としては特に気にしないでよさそう。