脱・踏み台サーバへの一歩 Amazon EC2 Systems Manager を使ってコマンドを実行する


Amazon EC2 System Manager というサービスの存在を今しがた知ったので、試してみました。

この機能を使えば Chef や Ansible を使わずとも、手軽に複数のサーバにてコマンドを実行することが可能です。

実行結果は S3 に保存可能です。

作業対象サーバーの台数分、手順書を作成してクロスチェック云々など、楽しくない作業が少しでもなくなれば幸いです。

使い方

Amazon EC2 System Manager とは :
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html

・・・上記の URL に沿うのが堅実な道なのですが、詳しいことはさて置き、まずは手っ取り早く試してみたいと思ってしまうのが人情でしょう。

というわけで『とりあえず何をどうすればコマンドを実行できるのか?』だけ紹介します。

0. この記事の前提

  • IAM Role を EC2 インスタンスに適用できること
  • OS は Amazon Linux
  • SSH でログイン可能
    ※ssm エージェントをインストールするため(新規作成の場合は user command でも可)

1. IAM Role の作成

まずは、コマンドを実行させる対象の EC2 インスタンスに紐付ける IAM Role を作成し、 AmazonEC2RoleforSSM ポリシーをアタッチします。

※今回は検証用の root アカウントで作業しているので、ssm 用のアカウント作成は省略しています。

※実運用では、ちゃんと ssm 用のアカウントを作成しましょう。

※IAM Role は EC2 インスタンスに紐付けないと適用されません。

2. S3バケットの作成

2500文字までならマネジメントコンソール上でも確認可能なので、この工程は省略可能です。

3. ssm エージェントのインストール

コマンドを実行させる対象のインスタンに ssm エージェントをインストールします。手順は下記の通りです。

# mkdir /tmp/ssm
# cd /tmp/ssm
# yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
# status amazon-ssm-agent
-----
amazon-ssm-agent start/running, process 2185
-----

# ps -ef|grep amazon-ssm-agent|grep -v grep
-----
root      2185     1  0 21:04 ?        00:00:02 /usr/bin/amazon-ssm-agent
-----

ssm エージェントのインストール:
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html#sysman-install-ssm-agent

4. コマンドの実行

EC2 サービスを開き、左のサイドメニューの『SYSTEMS MANAGER SERVICES』から『コマンド履歴』を開きます。

青い『コマンドの実行』というボタンを押しましょう。すると下記の画面が開きます。

『コマンドのドキュメント』は『AWS-RunShellScript』を選択し、『ターゲットインスタンス』は IAM Role を割り当て ssm エージェントをインストールしたインスタンスを選択します。

細かいことは画像を見て適宜設定していただくとして、今回実行するコマンドは下記の通りです。

一連のコマンドは root ユーザによって実行されるので、 sudo は必要ありません。

id

ss -antp

yum check-update

echo $?

これを『Commands』に貼り付けたら『実行』ボタンを押しましょう。

5. 実行結果の確認

下図のように『成功』となっているでしょうか?

『出力の表示』を開けば下図のように実行結果を確認できます。

今回は実行対象が1台だけでしたが、複数台同時に実行する際は hostname コマンドなども使った方が実行対象の特定もしやすいかもしれません。(2020/03/22 追記:うっかりhostnameを書き換えたりする恐れがあるので、個人的には uname の方が好みです)

コマンドの終了ステータスにご用心

下記は今回実行したコマンドですが、最後のコマンドが yum コマンドの終了ステータスの echo になっている事にお気づきでしょうか?

id

ss -antp

yum check-update

echo $?

yum check-update は正常に終了してもステータスは 100 を返します。

Amazon EC2 System Manager では、最後のコマンドの実行結果が 0 でないと一連の実行結果は『失敗』と判定されてしまいますので、ご注意ください。