0
1

More than 3 years have passed since last update.

aws cli x bashの変数展開 の注意点

Last updated at Posted at 2019-10-03

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
としない限り動かない。そして何も言わない。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1