EC2 System Manager RunCommandを使ってAMIMOTO AMIの設定を変更する
やりたかったこと SSHログインせずにAMIMOTO AMIの設定をゴニョゴニョする。 boto3を使えばEC2 System Managerの諸々をさわれそうな気配を感じたので、使い方覚えておけばなんやかんやを自動化で […]
目次
やりたかったこと
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する
それではコマンドを流し込んでいきましょう。
実行コマンドを指定する
まずは実行するコマンドの種類を選択します。

任意のシェルコマンドを実行する場合は「AWS-RunShellScript」を選択しましょう。
対象インスタンスを選ぶ
コマンドを実行するインスタンスを指定します。
SSMエージェントがインストールされているなど、必要条件を満たしているインスタンスのみ表示される様子です。

複数選択もできるっぽいので、管理サーバをまとめて更新なんてこともできそうです。
コマンドを入力
テストコマンドには「Nginx と PHP-FPM もしくは HHVM を ec2-user でも動作させる」を選んでみました。
実行
実行すると以下のようなウィンドウが出ます。

実行結果は「コマンド履歴」から確認できました。

「出力の表示」でコマンド実行時の標準出力が見れます。
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がもっとネット上に集まればいいなと思います。
