はじめに
RHELの古いEC2インスタンスをリプレースする際に、AWS CLIコマンドを含むスクリプトがエラーになる事象がありました。
原因はPATHが通っていないことによるコマンド実行エラーだったのですが、cron側のPATH設定で少し手間取ったので、最終的な実装方法などを紹介したいと思います。
前提
今回はRHEL 7のEC2インスタンスをRHEL 8に変更するため、新規EC2インスタンスを構築していました。
併せて、ミドルウェア等も最新化していたため、AWS CLIがv1からv2に変更になっていました。
この環境には内部処理を行うスクリプトがあり、これを専用ユーザーのcronで実行させていました。
# crontab -l -u batch 00 10 * * * sh /opt/batch/batch_1.sh 1> /dev/null
問題点
内部処理を行うスクリプトのcron実行に失敗していました。
以下はエラー内容の抜粋です。
ERROR error occured. java.io.IOException: Cannot run program "aws": error=2, そのようなファイルやディレクトリはありません
スクリプトのテストとして手動実行した際には問題無かったのですが、cron実行の際には上記のエラーになる、という事象でした。
原因
cronで実行していたスクリプトの一部に、AWS CLIのコマンドでCloudFrontのキャッシュ削除を実行していました。
aws cloudfront create-invalidation --distribution-id XXXXXXXXXXXXX --paths /xxxxx
AWS CLIのコマンドになりますが、このaws
コマンドを実行するために必要なPATHが設定されていなかったことが原因でした。
旧環境はAWS CLIのv1で、/user/binの下に入っていました。
$ which aws /usr/bin/aws
新環境はv2をインストールした際に、/usr/local/binの下に入っていました。
$ which aws /usr/local/bin/aws
cronで実行する際のPATHは/etc/crontab
に記載があります。
$ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
このPATH設定では、v1のインストール先/usr/bin
にはPATHが通っていますが、v2のインストール先/usr/local/bin
にはPATHが通っていませんでした。
これが原因で、対象のスクリプトをcron実行させたときに、awsコマンドが見つからないというエラーになっていました。
解決策
解決策はいくつか考えられますが、対象ユーザーのみPATHが通ればよいので、対象ユーザーのcrontab設定内にPATHを追加します。
# crontab -e -u batch PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 00 10 * * * sh /opt/batch/batch_1.sh 1> /dev/null
/etc/crontab
に記載のPATHに、AWS CLIv2のPATHを追加したものを追記しています。
これで保存したところ、対象のスクリプトが正常に動作するようになりました。
おわりに
移行のために新しい環境を構築していたので起きた事象ですが、cronのPATH設定方法を学ぶ良い機会になりました。
大きなアップデートを行う際は、必要なPATH設定の変化にもご注意ください。
参考
- AWS CLIの最新バージョンのインストールまたは更新(AWSドキュメント) https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html