CloudInitを使ってアプリケーションの自動デプロイを構成してみる(たたき台)

記事タイトルとURLをコピーする

         

こんにちは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