aws-cliを使ってs3にgz圧縮ファイルをアップロードするときの注意点
aws-cliを使ってローカルからファイルをアップロードしようとしたのですが、csv.gzなファイルをアップロードするときにちょっとハマってしまったのでメモとして残しておきます。
まずはcsvファイルを用意します。
$cat sample.csv hoge,fuga foo,bar $ gzip sample.csv $ ls sample.csv.gz
gzファイルになりました。
これを普通に$ aws s3 cp
コマンドを使ってs3にコピーしようとしてみます。
$ aws s3 cp sample.csv.gz s3://my-bucket/hoge_dir/
できました。
と、これをブラウザからダウンロードしてみると、ファイルはsample.csvという名前になっています。 お、これはgzをいい感じに解凍してくれているっぽいですね。
開いてみます。
Oops、だめだ。これcsvになっていない。 文字化けしてしまいました。
手動で同じことをやってみます。 すると、ダウンロードしても勝手に解凍されない。 sample.csv.gzファイルとしてダウンロードされています。 ローカルで解凍します。 csvファイルになったのでそれを開いてみます。
$cat sample.csv hoge,fuga foo,bar
ちゃんと開けていますね。
aws-cliでアップロードしたファイルをもう一度見てます。 ファイル名をcsv→csv.gzに戻してみます。 そしてこれを解凍し、開いてみます。 すると、正常に開けましたー
ということで、s3からダウンロードするときにgzを解凍していないのに解凍している風を出していたのが問題でした。
しかしs3はこんな余計なことをやってくれるんだろうか?
GUIからアップロードしたのと、CLIでコピーしたファイルの何が違うのか調べてみました。
すると、 プロパティ > メタデータ を見てみます。 正常に動作できるGUIでアップロードした方には、 Content-Type application/octed-stream とある。 一方で、挙動がおかしい方は Content-Type text/csv とある。
application/octed-streamとは?
https://wa3.i-3-i.info/word15821.html
まぁ「application/octet-stream」って単語が出てきたら「その他のファイル(ファイルの種類は気にするな)なんだな~」と、お考えください。
とのことで、よくわからないけど、これにすると大丈夫らしい。
$ aws s3 cp sample.csv.gz s3://my-bucket/hoge_dir/ --content-type --content-type application/octed-stream
とすると、無事正しい挙動になりました。