cronでawsコマンドが実行されない問題

問題

22時にインスタンス停止コマンドを打つように設定

0 22 * * * aws ec2 stop-instances --region=ap-northeast-1 --instance-ids=i-xxxx

時間が過ぎた後にawsコンソールから確認してもインスタンスが起動したまま。。



確認

普通に上記のコマンドを打った時にインスタンスが停止するか確認

$ aws ec2 stop-instances --region=ap-northeast-1 --instance-ids=i-xxxx
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

結果:awsコンソールを確認するとインスタンスが停止している


cronのログを確認

$ tail -f /var/log/cron
Jul 11 00:01:22 ip-10-0-0-11 CROND[18896]: (centos) CMD (aws ec2 stop-instances --region=ap-northeast-1 --instance-ids=i-xxxx)

結果:cronさんはコマンドを叩いてくれてはいる
でも、/var/log/cronには実行ログしか書き込まれず、エラーがあってもここには出てこないらしい


エラーログを吐き出してみる

$ crontab -e
0 22 * * * aws ec2 stop-instances --region=ap-northeast-1 --instance-ids=xxxx > cron-error.log 2>&1

$ cat cron-error.log
/bin/sh: aws: command not found

結果:どうやらコマンドのパスが合ってなくてこけてるらしい



解決

awsコマンドのパスを確認する

$ which aws
~/.local/bin/aws

コマンドのフルパスを指定する

$ crontab -e
0 22 * * * ~/.local/bin/aws ec2 stop-instances --region=ap-northeast-1 --instance-ids=xxxx

インスタンスを確認すると停止してる!