Firehose で S3 に保存したgzipファイルが正常に解凍出来ない問題の対処方法

2021.09.16

困っていた内容

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 ...