cronでS3のファイルをダウンロードするシェルスクリプトを実行するとダウンロードできない
AWS CLIで、s3からファイルをダウンロードするシェルスクリプトがあって、シェルスクリプトを実行すると問題なく実行できてCron経由だとエラーになる状況でした
s3からダウンロードするスクリプトは下記のようになっています
$ vim /home/admin/aws_s3.sh #!/bin/bash aws s3 cp s3://xxxxx/test1.csv /var/tmp/ aws s3 cp s3://xxxxx/test2.csv /var/tmp/
シェルスクリプトをSSHのコンソールから実行するとダウンロードできているのでシェルスクリプト自体とAWS CLI に問題は無いと思います。
cronでシェルスクリプトを実行した場合は、SSHログインして場合では実行できるPATHが少ないので、それが原因と思い「!/bin/bash -l」で実行するユーザーの環境変数を読み込むように変更しました。
詳しくは、「cron実行時に環境変数を読み込む」の記事を参考にして下さい。
$ vim /home/admin/aws_s3.sh #!/bin/bash -l aws s3 cp s3://xxxxx/test1.csv /var/tmp/ aws s3 cp s3://xxxxx/test2.csv /var/tmp/
上記でもダウンロードされないので、cronの実行した際にどんなエラーが表示されているか確認したいので、実行時の結果をログファイルに出力するように下記のようにcronを変更しました
$ crontab -e 0 * * * * /home/admin/aws_s3.sh > /var/tmp/aws_s3.log 2>&1 # ログファイル内容を確認 $cat /var/tmp/aws_s3.log /home/admin/aws_s3.sh : line 3: aws: command not found /home/admin/aws_s3.sh : line 4: aws: command not found
ログファイルを確認すると、「aws: command not found」となっていてaws コマンドが見つからないみたいです
aws コマンドの場所を確認すると、which コマンドで確認すると「/usr/local/bin/aws」となっています
$ which aws /usr/local/bin/aws
シェルスクリプト内のaws コマンドを「/usr/local/bin/aws」と指定すれば、cronでもダウンロードできるようになりました
$ vim /home/admin/aws_s3.sh #!/bin/bash -l /usr/local/bin/aws s3 cp s3://xxxxx/test1.csv /var/tmp/ /usr/local/bin/aws s3 cp s3://xxxxx/test2.csv /var/tmp/
cron実行時に、「/usr/local/bin」のパス通っていないかだと cron実行時のパスを確認したら、「/usr/local/bin」のパスは通ってなかったです
$ vim cron_env.sh #!/bin/bash echo "PATH: $PATH" >> env_result.log # cronに登録してから env_result.log でPATHを確認 # 「/usr/local/bin/aws」のパスはありませんでした $ cat env_result.log PATH: /home/admin/.local/bin:/home/admin/bin:/usr/share/Modules/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
ディスカッション
コメント一覧
まだ、コメントがありません