Amazon EC2のUser Dataにシバンを指定してスクリプトを実行する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

シバンとは?

UNIXのスクリプトの1行目に最初に出てくる謎の文字「#!」。その名も「シバン」。2行目以降のスクリプトを読み込むインタプリタ(bashとかperlとか)を指定するおまじないです。

User Data指定時にスクリプトを実行する

Amazon EC2の起動時のUser Dataを指定するところで、このシバンを指定することによって記述された文字列をスクリプトとして実行することができます。

Apache+PHP+MySQL環境を構築する

User Dataでスクリプトを指定して、Apache+PHP+MySQLをインストールしたいと思います。以下をUser Dataに指定してインスタンスを起動してみます。簡単ですね。

#!/bin/bash
sudo yum update -y
sudo yum install httpd-devel httpd -y
sudo yum install mysql-server mysql-devel mysql -y
sudo yum install php-devel php -y
sudo service mysqld start
sudo service httpd start
sudo chkconfig mysqld on
sudo chkconfig httpd on

User Dataスクリプトのデバッグ

記述したスクリプトが正しく実行されているか確認したい場合、また、途中でスクリプトが落ちているかデバッグしたい場合、以下のように記述することでログで確認ができます。

#!/bin/bash -ex
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1

User Dataの制限

スクリプトなら何でも記述できそうですが、いくつか制限があります。スクリプトのサイズ制限です。16KBとなっています。もし、これ以上大きいスクリプトを実行したければ、スクリプト内でS3やSimpleDBから長いスクリプトをダウンロードして実行する必要があります。

User Dataのセキュリティ

User Dataのスクリプトには、インスタンス毎に設定したパラメータなどを記述しますが、ここにパスワードを書くべきではありません。なぜならば、インスタンスにログインさえできれば、以下のURLからUser Data情報が取得できてしまうからです。

http://169.254.169.254/latest/user-data

もっと本格的にスクリプトを組みたい

User Dataに書くのでは足りず、複数のインタンスやサービスが連携するスクリプトをゴリゴリと書きたい場合は、AWS CloudFormationをおススメします。この説明については別の機会にて。

まとめ

今回は、EC2インスタンスを起動する際に指定できるUser Dataにシバン指定することで、スクリプトとして起動時に自動実行できることを学びました。

参考資料

Automate EC2 Instance Setup with user-data Scripts