AWS Systems Managerを使ってバッチスクリプトをサーバにログインせず実行する


概要

  • 社内で以下ような要件があり、AWS Systems ManagerRun Commandを利用してサーバにログインせず簡単にスクリプト実行できるようにしたので、そのときのメモです。

要件

  • バッチ処理のスクリプトを不定期に実行する必要がある
  • サーバ(EC2)に毎回ログインして実行するのは面倒くさいのでやりたくない
  • スクリプト以外の開発はやりたくない(webブラウザから実行できるとか)

AWS Systems Manager?

手順

  • 以下のような順番で設定、実行します
    1. 実行するサーバ側の設定
    2. 自動化ドキュメントの作成
    3. Run Commandの設定と実行

1. 実行するサーバ側の設定

  • 今回はVPC内に構築したEC2インスタンス(Amazon Linux)での利用を前提としています。
    • Amazon LinuxであればSSM エージェントもすでにインストール済みなので、以下にあるIAMでロールにポリシーをアタッチするだけになります。
    • それ以外の環境で利用する場合には以下にある前提条件を確認して適宜設定して下さい。

IAMによるポリシーのアタッチ

  • IAMコンソールからEC2インスタンス設定しているロールにAmazonEC2RoleforSSMポリシーをアタッチします。

2. 自動化ドキュメントの作成

  • AWS Systems Managerには実行するアクションを定義するドキュメントというものがあり、必要な処理を定義します。
  • ドキュメントは実行するアクションごとにあらかじめいくつか用意されていますが独自に作成することも出来ます。
    • スクリプトを実行するだけであれば既に用意されているAWS-RunShellScriptで要件は満たせます。
    • が、しかし。実行するたびに毎回実行コマンドを貼り付けるのも面倒なので、スクリプトのパラメータだけ設定するようにしたドキュメントを作成しました。

作成手順

  • AWS Systems Managerのコンソールからドキュメントを選択してドキュメントの作成をクリックします
  • ドキュメントのタイプでコマンドのドキュメントを選ぶとテンプレートが表示されるので、ここに実際の処理を記載していきます。
  • 今回設定したのは以下のようなシンプルなものになります。
    • parametersで実行する際に指定するパラメータを定義します
      • ここではバッチスクリプトに開始日と終了日を指定するようにしています
      • デフォルト値や値を選択させる設定も出来ます(ここでは省略しています)
    • mainStepsが実際の処理になります。
      • 受け取ったパラメータを指定したスクリプトを記載します
schemaVersion: "2.2"
description: "ほげほげスクリプト"
parameters:
 workingDirectory:
  type: "String"
  default: "/home/user/batch"
  description: "実行ディレクトリ"
 executionTimeout:
  type: "String"
  default: "36000"
  description: "最大実行時間" 
 startDate:
  type: "String"
  default: ""
  description: "開始年月日を指定"
 endDate:
  type: "String"
  default: ""
  description: "終了年月日を指定"
mainSteps:
- action: "aws:runShellScript"
  name: "hogehoge"
  inputs:
   runCommand:
   - "./bin/batch start={{startDate}} end={{endDate}}"
   workingDirectory: "{{ workingDirectory }}"
   timeoutSeconds: "{{ executionTimeout }}"

Run Commandの設定と実行

  • AWS Systems ManagerのコンソールからRun Commandを選択してコマンドの実行をクリックします
  • 先程作成したドキュメントを選択します

  • コマンドに設定するパラメータを入力します。ドキュメントで定義したパラメータが表示されています。

  • 実行するサーバを指定します。スクリプトがデプロイされているサーバを指定します。(ポリシーのアタッチがされているサーバのみ表示されます)

  • ログファイルの出力設定などを行い、最後に実行ボタンをクリックします。

  • ステータスが進行中になり、正常に完了すると成功になります。

まとめ

  • たまにしか実行しないけど、手動で実行するのは面倒だし手順とか記録しておかないと忘れちゃうみたいなやつには有効かなと思います。
  • ドキュメント自体はもっと複雑な設定も可能なので、複数ステップある処理を自動化させるなど、作業の効率化のために今後も利用していきたいと思います!