Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

RHEL 8でAWS CLI(v2)を含むスクリプトをcron実行する時のPATH設定

はじめに

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設定の変化にもご注意ください。

参考

  1. AWS CLIの最新バージョンのインストールまたは更新(AWSドキュメント) https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html