notebook

都内でWEB系エンジニアやってます。

EC2起動時にスクリプトを実行する

EC2起動時にサービス投入までに定型作業がある場合など、毎度同じコマンドを打つのが面倒になってきたので調べました

User Dataというのを使えば出来る模様

Linuxインスタンスでの起動時のコマンドの実行

Amazon LinuxのCloudInitによって起動時に実行されるスクリプトを定義できるようです

下記3通り

今回は「テキストで直にコマンドを入力」する方法をやってみます

起動スクリプトの登録

気づきにくいけど「Advanced Detail」ってところに入力します

User Data欄に入力を行います

f:id:swfz:20151015202044p:plain

#!/bin/bash
sh /root/setup.sh

#!/bin/bashを一行目に入れないとちゃんと動いてくれませんでした

この箇所に入力したものをスクリプトとして実行してくれるっていう感じかと思われます

後は起動時に実行されるのを待つだけ

実行されている時にプロセス見たら下記のようになりました

root       843  0.0  0.3 115396  1936 ?        Ss   18:16   0:00 /bin/bash /etc/rc.d/rc 3
root      1352  0.0  0.3 115396  1836 ?        S    18:17   0:00  \_ /bin/bash /etc/rc3.d/S99cloud-init-user-scripts start
root      1353  0.1  2.5 214692 15380 ?        S    18:17   0:00      \_ /usr/bin/python2.6 /usr/bin/cloud-init-run-module once-per-instance user-scripts execute run-parts /var/lib/cloud/data/scripts
root      1354  0.0  0.2 115128  1568 ?        S    18:17   0:00          \_ /bin/bash /usr/bin/run-parts /var/lib/cloud/data/scripts
root      1358  0.0  0.2 115128  1244 ?        S    18:17   0:00              \_ /bin/bash /var/lib/cloud/data/scripts/part-000
root      1360  0.0  0.2 115128  1444 ?        S    18:17   0:00              |   \_ sh /root/setup.sh
root      1359  0.0  0.1 113428   972 ?        S    18:17   0:00              \_ awk -v progname=/var/lib/cloud/data/scripts/part-000 progname {?????   print progname ":\n"?????   progname="";????       }????       { print; }

/var/lib/cloud/data/scripts/part-000の中身を見てみると

#!/bin/bash
sh /root/setup.sh

User Dataで定義したスクリプトが記述してありました

ここから読み込んで実行しているようですね

setup.shの中にサービス用のスクリプトを書いてAMI化しておけば毎回同じ作業をしなくて済みます

text直で書くと16kbまでの制限があるようですがその制限にも掛からないです

そもそもそんなに自動作業増えるならAMI作り直せっていう話でもありそうですが...

主に揮発性ディスクに対する操作などが入っている場合はこういう形で実行するのは有効なのかなと思います

あとはこの一連の流れをコマンドラインから実行できるようにしておけば簡単にサービスへの投入が出来ますね