Firehose で GZIP 圧縮して S3 に流したデータをダウンロードすると GZIP 圧縮されてない?と勘違いしたときのメモ。 - 全力で怠けたい

全力で怠けたい

怠けるために全力を尽くしたいブログ。

Firehose で GZIP 圧縮して S3 に流したデータをダウンロードすると GZIP 圧縮されてない?と勘違いしたときのメモ。

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 が付いてる。

f:id:ebc_2in2crc:20200801152631p:plain:w500

Content-Encoding: gzip がサーバーのログに付いてるのでブラウザーでアクセスすると Content-Encoding: gzip ヘッダーがレスポンスヘッダーに付く。 ブラウザーはレスポンスに Content-Encoding: gzip ヘッダーが付いてると body を自動的に GZIP 展開するのでダウンロードして保存したサーバーのログは GZIP 圧縮前の JSON になっているということのようだった。

f:id:ebc_2in2crc:20200801152646p:plain:w400

結論

サーバーのログサイズはかなり大きいのでローカルにダウンロードすることはめったにないのと、あとたぶん実際にサーバーのログをローカルにダウンロードするときは AWS CLI でダウンロードすると思うので結論としては特に気にしないでよさそう。

参考サイト