AWS Systems Manager ドキュメントを使うときに知っておきたいこと

こんにちは、望月です。

不定期にEC2にSSHログインし、実行しているコマンドをログインせずに実行するため、 Systems Manager のオートメーションを使おうと思いましたが、使う前にいろいろ確認したいことがあったので、確認してみました。

AWS Systems Manager ドキュメントの作り方について、下記ブログでわかりやすく書かれているため、省きたいと思います。

AWS Systems Manager のドキュメントを作って、使ってみた。

やってみた

確認内容

知っておきたい情報として、以下を確認したいと思います。

  • 実行ユーザはどうなってるの?
  • カレントディレクトリはどこなの?
  • suできるの?
  • コマンドへの引数はつけれるの?
  • 戻り値 1 にしたらエラーになるの?

実行するドキュメントは以下となります。

---
description: "Automation Document runCommand"
schemaVersion: "0.3"
parameters:
  InstanceId:
    type: "StringList"
    description: "(Required) InstanceIds to run command"
  Argument:
    type: "String"
    description: "(Required) Command Argument"
mainSteps:
- name: "testcommand"
  action: "aws:runCommand"
  inputs:
    DocumentName: "AWS-RunShellScript"
    InstanceIds: "{{ InstanceId }}"
    Parameters:
      commands:
      - echo 1.
      - id
      - echo 2.
      - whoami
      - sudo su - ec2-user
      - whoami
      - echo 3.
      - pwd
      - cd /etc
      - pwd
      - echo 4.
      - su - ec2-user -c "id"
      - echo 5.
      - su - ec2-user -c "whoami; pwd; cd /home; pwd; whoami"
      - echo 6.
      - echo {{ Argument }}
      - echo 7.
      - exit 1

確認

実行するドキュメントを選択し、実行するインスタンスのID及びコマンド実行の引数を入力し、オートメーションを実行します。

結果はエラーで終了しました。確認内容を見ていきましょう。

  • echo 1.
    • 実行ユーザの確認
1.
uid=0(root) gid=0(root) groups=0(root)

root ユーザにて実行されていることがわかります。権限が強いため、実行するコマンドには注意しましょう。

  • echo 2.
    • su できるか確認
root
Last login: Thu Jun  6 10:53:48 UTC 2019
root

su して、ログインできているように見えますが ec2-user になれず、root のままでした。実行するスクリプトなどによっては、su することもあるかと思うので注意しましょう。

  • echo 3.
    • カレントディレクトリの移動確認
3.
/usr/bin
/etc

カレントディレクトリの移動は問題なくできています。スクリプトのカレントディレクトリで実行したいといったことも問題なくできそうです。

  • echo 4.
    • 実行ユーザを指定したコマンド実行
4.
uid=1000(ec2-user) gid=1000(ec2-user) groups=1000(ec2-user),4(adm),10(wheel),190(systemd-journal)

先程、su でユーザ変更はできませんでしたが、実行ユーザの変更はできました。ユーザを変更してのコマンド実行には、この方法を使うのが良いかと思います。

  • echo 5.
    • 実行ユーザを指定した複数のコマンド実行
5.
ec2-user
/home/ec2-user
/home
ec2-user

コマンド1; コマンド2といった方法で、複数コマンドの実行を行うことができました。su でユーザ変更ができないため、ある程度のコマンド数であれば、このようにまとめたほうがいいかと思います。

  • echo 6.
    • コマンドへ引数をつけれるか確認
6.
123456

コマンドの引数を指定することは可能でした。自動化のため、なるべく人の手を排除したほうがよいですが、どうしても引数の入力が必要などの場合には、こちらの方法が使えるかと思います。

  • echo 7.
    • 戻り値 1 にした場合の確認
7.

----------ERROR-------
failed to run commands: exit status 1

エラーが出力され、オートメーションのステータス上でも失敗として扱われました。ちょっと手を加えることで、コマンド実行の出力を見て処理の完了を確認するのではなく、オートメーションのステータス上で処理の完了を確認できるように作れるので大変便利そうです。

まとめ

用途によっては「su - (username) -c」コマンドでユーザ指定を行ったり、実行結果の戻り値をSSM側に返し、ちゃんとステータスコントロールを行うとよさそうです。

EC2で頑張っている環境であれば、SSMを利用することでサーバにログインせずに決まったコマンドを実行できるため、オペレーションミスを減らすことができるかと思います。

また、固定のインスタンスで実行する場合は、インスタンスを指定することでより安心かと思います。

この記事が日々の運用のお役に立てばと思います。