Firehose で S3 に保存したgzipファイルが正常に解凍出来ない問題の対処方法
困っていた内容
Firehose で S3 に保存した gzip ファイルをダウンロードしたのですが、 解凍しようとするとファイル破損となり解凍できません。
原因
今回の事例では Firehose から S3 にファイルを保存する際に gzip 圧縮を行っています
※上記設定は Amazon Kinesis > Delivery streams > 対象の配信ストリームを選択
Configuration > Destination settings > Compression and encryption で確認できます。
この設定をしていた場合、 S3 に保存する際にメタデータとして Content-Encoding: gzip が付与されます
このメタデータが付与されていると、ブラウザ経由でダウンロードした際に、gzip が自動で解凍(展開)されてしまう事があります。
しかし、ファイル名は変わらないため、本当は解凍されているのに、拡張子が .gz なため、圧縮されているように見える。
それを解凍しようとするからエラーが出る。といった今回のような問題が発生します。
この問題はブラウザ経由でダウンロードした場合のみ発生します。そのため、 CLI でダウンロードした場合は、圧縮されたままのファイルがダウンロードされます。
確認
1.コンソールからファイルをダウンロード
S3 からファイルをダウンロードします
2.ファイルの解凍 - 失敗
$ gunzip PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz gzip: PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz: not in gzip format
対象のファイルは gzip では無いとエラーが出ました。
3.ファイルを解凍せずに開いてみる
解凍をせずにそのままファイルを開いてみましょう
$ cat PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz test
開けました。
この通り、拡張子は .gz のままですが、実際には解凍された状態になっています。
対処方法
1.拡張子を手動で変える
前述の通り、コンソールからダウンロードした場合は、拡張子が .gz でも実際には解凍されています。
そのため、拡張子を手動で圧縮前の拡張子に戻してやれば解決です。
2.CLI でダウンロード
原因にも記載しましたが、 CLI でダウンロードした場合はこの事象は発生しません。
実際に確認してみましょう。
ダウンロード
CLI でダウンロードします。
$ aws s3 cp s3://********/2021/09/16/07/PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz ./ download: s3://********/2021/09/16/07/PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz to ./PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz
解凍
$ gunzip PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e.gz $ ls PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e
CLI 経由ではエラーが出ず、正常に解凍されました。
内容確認
$ cat PUT-S3-rk4SV-2-2021-09-16-07-11-12-af7bad10-bc12-41e7-89bd-83ed220ede9e test
解凍後のファイルの内容も正常に確認出来ました。
参考資料
AWS Developer Forums: Firehose GZIP Compression to S3 not ...