tjinjin's blog

インフラ要素多めの個人メモ

ssm-shというssmのrun commandをwrapperしたツールが便利だった

About

障害調査で使ってみたらめっちゃ便利でした。

前提

  • ec2にssmの権限のついたIAMロールをつける
  • ami-28ddc154 (ssm-agentが入っているAmazonLinux)
  • SSM エージェント は、デフォルトでは、2017 年 9 月以降の Amazon Linux の基本 AMI にインストールされます。
  • Amazon ECS 対応の AMI のようにベースイメージではないその他のバージョンの Linux では、手動で SSM エージェント をインストールする必要があります。

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文字らしいです。(未確認)

まとめ

便利そうなので使っていきます(๑•̀ㅂ•́)و✧

参考