ssm-shというssmのrun commandをwrapperしたツールが便利だった
About
障害調査で使ってみたらめっちゃ便利でした。
前提
- ec2にssmの権限のついたIAMロールをつける
- ami-28ddc154 (ssm-agentが入っているAmazonLinux)
Linux インスタンスで SSM エージェント をインストールし設定する - AWS Systems Manager
何ができるか
ssmの機能にあるrun commandをターミナル上でshellを叩いているかのように利用できるツールです。
インストール
GitHub Releaseから取得するか、go getで取ってきます。
Releases · itsdalmo/ssm-sh · GitHub
go get -u github.com/itsdalmo/ssm-sh
インストールしたらhelpを叩いてみましょう。
$ ssm-sh -h Usage: ssm-sh [OPTIONS] <list | run | shell> Application Options: -v, --version Print the version and exit. AWS Options: -p, --profile= AWS Profile to use. (If you are not using Vaulted). -r, --region= Region to target. (default: eu-west-1) Help Options: -h, --help Show this help message Available commands: list List managed instances. (aliases: ls) run Run a command on the targeted instances. shell Start an interactive shell. (aliases: sh)
list/run/shellという3つのサブコマンドが用意されています。それぞれ使ってみます。
できること
list コマンド実行対象の一覧を取得
ssm-shはrun commandを利用しているので複数のインスタンスに対しコマンドを実行することが可能です。なのでまずはターゲットの情報を取得します。
$ ssm-sh list --profile default --region ap-northeast-1 Instance ID | Name | State | Image ID | Platform | Version | IP | Status | Last pinged i-00e1d6b19b3927e85 | master | running | ami-28ddc154 | Amazon Linux AMI | 2018.03 | 172.31.20.38 | Online | 2018-04-26 15:55 i-0476897ffb9318a31 | ecs-cluster | running | ami-28ddc154 | Amazon Linux AMI | 2018.03 | 172.31.12.208 | Online | 2018-04-26 15:55 i-0ae912f13a4b81f36 | ecs-cluster | running | ami-28ddc154 | Amazon Linux AMI | 2018.03 | 172.31.22.49 | Online | 2018-04-26 15:55
ここで取得したinstance idを使って次からのコマンドを叩いていきます。
--output
オプションを使うことでインスタンスの情報をJSONに保存でき、他のコマンドで利用することが可能です。
$ ssm-sh list --profile default --region ap-northeast-1 --output instances.json
--filter
を使うとTagで絞込が可能です。
$ ssm-sh list --profile default --region ap-northeast-1 --filter Name=master Instance ID | Name | State | Image ID | Platform | Version | IP | Status | Last pinged i-00e1d6b19b3927e85 | master | running | ami-28ddc154 | Amazon Linux AMI | 2018.03 | 172.31.20.38 | Online | 2018-04-26 15:55
run
runは1回だけ指定コマンドを実行します。
$ ssm-sh run --profile default --region ap-northeast-1 --target-file instances.json df Initialized with targets: [i-00e1d6b19b3927e85 i-0476897ffb9318a31 i-0ae912f13a4b81f36] Use ctrl-c to abort the command early. i-00e1d6b19b3927e85 - Success: Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 495052 56 494996 1% /dev tmpfs 505584 0 505584 0% /dev/shm /dev/xvda1 8123812 1070752 6952812 14% / i-0476897ffb9318a31 - Success: Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 495052 56 494996 1% /dev tmpfs 505584 0 505584 0% /dev/shm /dev/xvda1 8123812 1070736 6952828 14% / i-0ae912f13a4b81f36 - Success: Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs 495052 56 494996 1% /dev tmpfs 505584 0 505584 0% /dev/shm /dev/xvda1 8123812 1070712 6952852 14% /
多少時間がかかることもありますがすぐに終わります。AWSのコンソールのrun commandを確認するとコマンドが実行されたログが残っています。
shell sshしているかのようにコマンドを実行する
次にshellを実行してみます。
$ ssm-sh shell --profile default --region ap-northeast-1 --target-file instances.json Initialized with targets: [i-00e1d6b19b3927e85 i-0476897ffb9318a31 i-0ae912f13a4b81f36] Type 'exit' to exit. Use ctrl-c to abort running commands. » free i-0476897ffb9318a31 - Success: total used free shared buffers cached Mem: 1011172 189916 821256 56 8128 123644 -/+ buffers/cache: 58144 953028 Swap: 0 0 0 i-00e1d6b19b3927e85 - Success: total used free shared buffers cached Mem: 1011172 189940 821232 56 8600 123892 -/+ buffers/cache: 57448 953724 Swap: 0 0 0 i-0ae912f13a4b81f36 - Success: total used free shared buffers cached Mem: 1011172 189092 822080 56 8100 123472 -/+ buffers/cache: 57520 953652 Swap: 0 0 0 »
ちょっとわかりにくいですが(gif化は面倒だったので止めました。。。)、freeコマンドを実行したあとも連続でコマンドを実行できます。簡易的な調査には使えそうですね。
» export TEST=aaa i-00e1d6b19b3927e85 - Success: i-0476897ffb9318a31 - Success: i-0ae912f13a4b81f36 - Success: » echo $TEST i-0476897ffb9318a31 - Success: i-0ae912f13a4b81f36 - Success: i-00e1d6b19b3927e85 - Success:
あたり前ですが、terminalとは違うので環境変数を引き継いだりはできません。ステートレスなコマンドを心がけると良いと思います。
おまけ
コマンドの出力が長すぎると途中で出力が切られてしまいますが、--extend-output
を指定することでS3にコマンドの結果を送ることができるようです。制限は2500文字らしいです。(未確認)
まとめ
便利そうなので使っていきます(๑•̀ㅂ•́)و✧