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

# 概要

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

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

# AWS Systems Manager？

- 詳細は以下のリンクを参照してもらったほうが良いですが、サーバをいい感じに管理してくれるサービスです。
    - [AWS Systems Manager とは](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html)
    - [AWS Systems Manager を試してみた](https://qiita.com/yi7027/items/4c4f6cf12ffa2f4b6b0c)
- ちなみに今回はRun Commandしか利用していないです。。

# 手順

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

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

- 今回はVPC内に構築したEC2インスタンス(Amazon Linux)での利用を前提としています。
    - Amazon LinuxであればSSM エージェントもすでにインストール済みなので、以下にあるIAMでロールにポリシーをアタッチするだけになります。
    - それ以外の環境で利用する場合には以下にある前提条件を確認して適宜設定して下さい。
        - [Systems Manager の前提条件](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-prereqs.html)

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

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

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

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

### 作成手順

- AWS Systems Managerのコンソールからドキュメントを選択して**ドキュメントの作成**をクリックします
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/fc4af62d-0b54-3585-4fd2-25e74f87c5f5.png)
- ドキュメントのタイプで**コマンドのドキュメント**を選ぶとテンプレートが表示されるので、ここに実際の処理を記載していきます。
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/887d07da-2a36-9d5e-e564-4975acb391b5.png)
- 今回設定したのは以下のようなシンプルなものになります。
    - **parameters**で実行する際に指定するパラメータを定義します
        - ここではバッチスクリプトに開始日と終了日を指定するようにしています
        - デフォルト値や値を選択させる設定も出来ます(ここでは省略しています)
    - **mainSteps**が実際の処理になります。
        - 受け取ったパラメータを指定したスクリプトを記載します

```yaml
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 }}"
```

- より詳細な設定も可能なので、以下のリンクを参照して下さい。
    - [SSM ドキュメントの構文](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-doc-syntax.html#documents-schema-twox)
    - [Systems Manager 自動化ドキュメントのリファレンス](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html#automation-action-runcommand)

- **ドキュメントの作成**で保存されます。

## Run Commandの設定と実行

- AWS Systems ManagerのコンソールからRun Commandを選択して**コマンドの実行**をクリックします
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/41e67fef-44d8-1aa9-89a0-1733717aa92b.png)
- 先程作成したドキュメントを選択します
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/1bc28fa0-5143-d6c3-4c09-8f9d45b7da39.png)

- コマンドに設定するパラメータを入力します。ドキュメントで定義したパラメータが表示されています。
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/cb184f29-98c1-a434-ec33-1c3c1f3e4657.png)
- 実行するサーバを指定します。スクリプトがデプロイされているサーバを指定します。(ポリシーのアタッチがされているサーバのみ表示されます)
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/51778/f6eda0d3-d556-30ee-8a91-12ec27a51731.png)
- ログファイルの出力設定などを行い、最後に**実行**ボタンをクリックします。
- ステータスが**進行中**になり、正常に完了すると**成功**になります。

# まとめ

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