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

 

スポンサーリンク

0
0