EC2 System Manager RunCommandを使ってAMIMOTO AMIの設定を変更する

やりたかったこと

SSHログインせずにAMIMOTO AMIの設定をゴニョゴニョする。
boto3を使えばEC2 System Managerの諸々をさわれそうな気配を感じたので、使い方覚えておけばなんやかんやを自動化できるんじゃないかと思った次第です。

なお、EC2 System ManagerとSSM(Simple System Manager)の違いがよくわかっていないのですが、AWSのドキュメントを見る限り一緒くたにされてる感じがしたのでここでは同じものとして扱います。違ったらすみません。

EC2インスタンスの起動

テストではAMIMOTO AMIを起動させました。別にAmazon Linux系のAMIであれば以降の動作は変わりないので任意のもの使って大丈夫です。

大事なのはインスタンス起動時に「インスタンスロール」を必ず設定することです。これを忘れるとインスタンスの作り直しになるので要注意です。

AmazonEC2RoleforSSMというポリシーがありますので、割り当てておきましょう。

SSMエージェントのインストール

仕組みとしては、インスタンス内で動作するエージェントに対してSSMがリクエストを投げてコマンドを実行するという形っぽいです。
ということでEC2にエージェントをインストールします。

Amazon Linux, RHEL, and CentOS 64-bitの場合

参考:Manually Install the SSM Agent on EC2 Instances

# cd /tmp
# curl https://amazon-ssm-{YOUR_EC2_REGION}.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
# yum install -y amazon-ssm-agent.rpm

statusコマンドで以下のように出力されればOKです。

# status amazon-ssm-agent
amazon-ssm-agent start/running, process 12754

Run Commandする

それではコマンドを流し込んでいきましょう。

実行コマンドを指定する

まずは実行するコマンドの種類を選択します。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-18-50-30
任意のシェルコマンドを実行する場合は「AWS-RunShellScript」を選択しましょう。

対象インスタンスを選ぶ

コマンドを実行するインスタンスを指定します。
SSMエージェントがインストールされているなど、必要条件を満たしているインスタンスのみ表示される様子です。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-18-50-46
複数選択もできるっぽいので、管理サーバをまとめて更新なんてこともできそうです。

コマンドを入力

そして実行するコマンドを入力します。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-19-11-17

テストコマンドには「Nginx と PHP-FPM もしくは HHVM を ec2-user でも動作させる」を選んでみました。

実行

実行すると以下のようなウィンドウが出ます。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-19-12-11
実行結果は「コマンド履歴」から確認できました。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-12-18-19-26-24
「出力の表示」でコマンド実行時の標準出力が見れます。

Shutting down monit: [  OK  ]
Already up-to-date.
wordpress
wordpress
Stopping php-fpm: [  OK  ]
Starting php-fpm: [FAILED]

----------ERROR-------
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100   807  100   807    0     0   2043      0 --:--:-- --:--:-- --:--:--  2043
bash: line 5: hhvm: command not found
From git://github.com/Launch-with-1-Click/lw1-amimoto
 * branch            2016.01    -> FETCH_HEAD
bash: line 24: hhvm: command not found
[18-Dec-2016 19:12:27] ERROR: An another FPM instance seems to already listen on /var/run/php-fpm.sock
[18-Dec-2016 19:12:27] ERROR: FPM initialization failed

hhvmコマンドが存在しないのに実行しようとしてエラーになっています。
これについては元のスクリプトがHVM版 / HHVM版両方に対応しようとしているために出るエラー文なので、「失敗」となっていますが気にしないで大丈夫です。

念のため確認する

心配な方はSSH接続して確認もしておきましょう。

ec-user:nginxに変わっているかを確認

# ll /var/www/vhosts/
total 52
drwxr-xr-x 5 ec2-user nginx  4096 Dec 18 18:33 i-05eae5cc80d2da546

amimoto.jsonが書き換わっているかを確認

# cat /opt/local/amimoto.json 
{
        "nginx" : { "config" : { "user" : "ec2-user" } },
        "php" : { "config" : { "user" : "ec2-user" } },
        "run_list" : [ "recipe[amimoto]" ]
    }

どちらも大丈夫ですね。

不安な方は、Run Commandで実行するコマンドを以下のようにして「出力の表示」から見れるようにしておくと良いかなと思います。

curl -L https://raw.githubusercontent.com/amimoto-ami/run-httpd-as-ec2-user/master/run-httpd-as-ec2-user.sh | sudo bash
ll /var/www/vhosts/
cat /opt/local/amimoto.json 

まとめ

インスタンス1台だけかつ仕様上Run Commandが失敗と判定してしまうサンプルスクリプトでのテストでしたが、範囲を広げるとかなり便利かなと思います。

例えばこんな感じでしょうか。

  • 管理するサーバ全てにNew RelicやLogstashなどのモニタリングツールをインストールする
  • Amazon Linuxのアップデートがあったのでまとめて更新する
  • [多分できる]boto3を使って構成変更の自動化

他にもAMIMOTO AMIの場合、amimoto.jsonを書き換えて/opt/local/provisionを実行するコマンドを流し込めば設定の更新も簡単にできます。

ということで、EC2 RunCommandを使ってみた記事やTipsがもっとネット上に集まればいいなと思います。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です