Systems Manager ステートマネージャーでコマンドをスケジュール実行してみた

Systems Manager ステートマネージャーを利用しコマンドをスケジュール実行してみました
2022.12.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、望月です。
皆さんは crontab -r したことはありますか?私はあります。

ご存じの通り crontab コマンドは cron のスケジュール設定を行うためのコマンドですが変更コマンドが crontab -e で、削除コマンドが crontab -r とキーが隣り合わせのため、変更の際にうっかり削除してしまう (削除するかどうかの確認も入らない) というオペミスの話が古来よりあり、人々を苦しめてきました。 よくある回避方法としては crontab -i オプションを付けると削除時に確認が入るようになるため alias crontab="crontab -i" という形でエイリアス設定をすることでうっかり削除を防ぐことができます。

しかし、そもそも crontab を使わずにスケジュール管理し指定したコマンドを実行できればいいのでは?Systems Manager ステートマネージャーが使えないかと思ったのでやってみました。

まとめ

最初にまとめを書きますが Cron 式の注意点がいろいろとあるため crontab コマンド ( crond ) を使わなくて済むという選択肢は難しいかもしれません。 注意点を認識した上で使える場合は使っていきましょう。

気になる注意点が以下となり、AWS で管理するということで 30 分未満の間隔で設定をすることができません。 また、時刻が UTC 形式となるため、スケジュールの設定時には注意が必要です。

関連付けは、1/2、1、2、4、8、または 12 時間ごと、毎日、毎週、n 日ごと、またはその月の最後の x 曜日などの特定の時間の cron 式をサポートしています。

リファレンス: Systems Manager の Cron 式および rate 式 - AWS Systems Manager

やってみた

AWS CLI を利用し設定してみました。ここでは 30 分ごとにコマンド実行するよう設定を入れています。

aws ssm create-association \
    --region ap-northeast-1 \
    --name AWS-RunShellScript \
    --association-name crontab-temp \
    --targets Key=tag:Env,Values=cron \
    --schedule-expression 'cron(0 */30 * * * ? *)' \
    --parameters "commands='id', 'env'"

オプションの内容については以下を確認してください。

  • --region
    • 東京リージョンを指定しています
  • --name
    • 実行するドキュメントを指定します。ここでは AWS-RunShellScript を指定しています
  • --association-name
    • ステートマネージャーの関連付けの名前を指定します。ここでは例として crontab-temp を指定します
  • --targets
    • 実行するインスタンスのタグを指定しています。タグ以外も指定できますがここでは Key: Env, Value: cron で設定しています
  • --schedule-expression
  • --parameters
    • 実行するコマンドを記載します。カンマで区切ることで複数コマンドを実行することが出来ます