こんにちはAWSチームの柳瀬です。
先日cloudinitの簡単な使い方を書いたので、今度はAuto Scalingと組み合わせて使ってみたいと思います。
Auto Scalingはとても便利なサービスですが、実際に使う場合は以下のような課題が出てきます。
課題
- Auto Scaling構成後にアプリケーションをリリースすると、launch-configに登録したAMIのソースコードが古くなる
- 新しいアプリケーションをリリースする度にAMI作りなおすのマンドクセ('A`)
- rc.localに書いてもいいけど処理を変更するときはAMI作りなおさなきゃいけない
ミドルウェアの設定は変更が少ないとしても、プログラムは定期的に新しいバージョンに変更されたりしますよね。
今回はCloudInitとSubversionを使って起動時に最新のソースコードを設置する構成を作ってみました。
※例ではSubversionを使用しておりますが、Gitでも同じ構成にする事は可能です。
構成図
- 今回テストで使用したディストリビューションはAmazon Linuxとなります
- EC2インスタンスにはApacheと、Subversionのクライアントが動作するようにしております
CloudInitに渡すUser Dataのサンプル
EC2インスタンスの起動時に渡すUser Dataには以下のように指定します。
起動時にセキュリティアップデートを行いたくない場合は適宜"repo_upgrade: none"として下さい。
#cloud-config repo_upgrade: all runcmd: - VERSION=`svn list https://svn.example.com/sample/tags |sort -V |sed -n '$p'` - TIME=`date +%Y%m%d%H%M` - sudo -u ec2-user svn export https://svn.example.com/svn/sample/tags/${VERSION} /home/ec2-user/${TIME}program - ln -snf /home/ec2-user/${TIME}program /home/ec2-user/program - service httpd start
Apacheのコンフィグの修正点
インストールしたApacheでは以下のようにドキュメントルートを変更しています。
$ sudo diff -u /etc/httpd/conf/httpd.conf.org /etc/httpd/conf/httpd.conf --- /etc/httpd/conf/httpd.conf.org 2012-05-16 16:51:03.109505965 +0000 +++ /etc/httpd/conf/httpd.conf 2012-05-16 16:52:25.233780071 +0000 @@ -290,7 +290,7 @@ # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # -DocumentRoot "/var/www/html" +DocumentRoot "/home/ec2-user/program" # # Each directory to which Apache has access can be configured with respect
/etc/sudoersの変更点
CloudInitでtty経由でないsudoを実行しているので、以下のようにsudoの設定を変更しています。
$ sudo diff -u /etc/sudoers.org /etc/sudoers --- /etc/sudoers.org 2012-05-16 16:44:29.425746346 +0000 +++ /etc/sudoers 2012-05-16 16:44:54.933200610 +0000 @@ -53,7 +53,7 @@ # Disable "ssh hostname sudo ", because it will show the password in clear. # You have to run "ssh -t hostname sudo ". # -Defaults requiretty +#Defaults requiretty # # Refuse to run if unable to disable echo on the tty. This setting should also be
Auto ScalingでUser Dataを有効にする
Auto ScalingでUser Dataを渡すには以下のようにコマンドを実行します。
as-create-launch-config demo-launch-conf --image-id ami-xxxxxxxx --key demo-key --group demo-group --instance-type t1.micro --user-data-file /path/to/your/userdata-files.txt
User Dataを修正したい場合はlaunch-configを再作成し、as-update-auto-scaling-groupを実行すればOKです。
出来る事
- Auto Scalingから起動された段階で最新のアプリケーションをSubversionから設置出来ます
- 最新のアプリケーションが設置されてからWebサーバを起動し、ELBの分散対象にする事が出来ます
- 処理内容を変更したい場合は渡すUserDataを編集するだけなので、AMIの再作成は必要ありません
- SubversionなどのCVSを導入している方はそれを使う事が出来ます
注意点
- 起動時に最新のアプリケーションを設置しているため、ELBの分散対象になるまで少し時間がかかります
- Subversionインスタンスのtags以下はバージョンナンバーで管理されている事が前提となります
- Subversionに認証設定をしている場合は起動するAMIに設定をしておいて下さい
- Elastic Beanstalk使おうというツッコミはご遠慮くだ(ry
まとめ
基本のAMI作成後はこのようにインスタンスの外部から状態を変更出来ると柔軟に設定変更が可能だと思います。
まずはたたき台として作ってみた構成なので、AWSユーザー会などで議論が出来たらいいですね:D