bashファイルで変数展開をするときはスラッシュ/
に気をつけようという話。
PATH1=hogehoge
PATH2=/root/data
echo $PATH1/$PATH2
# -> hogehoge//root/data
echo ${PATH1}${PATH2}
# -> hogehoge/root/data
となります。あたり前のことなのですが、これとaws s3 cpコマンドが組み合わさるとハマります。
aws s3 cp は気を付けろ
s3://hogehoge/root/data
にsome.object
があったとして、それをs3 cp
で持ってきたいとしましょう。
①
aws s3 cp s3:$PATH1/$PATH2/some.object
-> fatal error: An error occurred (404) when calling the HeadObject operation: Key "/hogehoge/root/data/some.object" does not exist
②
aws s3 cp s3:${PATH1}${PATH2}/some.object
-> success
③
aws s3 cp s3:${PATH1}${PATH2}/some.objects
-> fatal error: An error occurred (404) when calling the HeadObject operation: Key "hogehoge/root/data/some.objects" does not exist
おわかりだろうか。
③のエラーが出れば、「some.objectsじゃなくてsome.objectだった!と一瞬で気がつくことができる」
一方で①の場合、エラーが出ているのは
"/hogehoge/root/data/some.object"
↑ここなのだ。
普段からよく見る形であり、まさかデフォルトでの表示が、③のように最初のスラッシュがないなどとは思いも寄らない。そして泥沼にハマるのである。
ということで、
「aws s3 cp のエラーログ Key "" does not exist は最初のスラッシュを表示しない」
ことを覚えておきたい。
さらなる罠
s3://hogehoge/root/data
にsomedir
ディレクトリがあったとして、それをs3 cp
で持ってきたいとしましょう。
この時、--recursive
オプションを付ける必要があるのは基本ですね。
しかし、これがまた罠を生むのです。
④
aws s3 cp s3:$PATH1/$PATH2/somedir . --recursive
-> silence
何も言ってくれないのだ。しかし、ダウンロードはしてくれていないのだ。
これも結局、
aws s3 cp s3:${PATH1}${PATH2}/somedir . --recursive
としない限り動かない。そして何も言わない。