やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

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でアップロードしたファイルをもう一度見てます。 ファイル名をcsvcsv.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-cliでもやってみました。

$ aws s3 cp sample.csv.gz s3://my-bucket/hoge_dir/ --content-type --content-type application/octed-stream

とすると、無事正しい挙動になりました。