どうも、cloudpack の デプロイ王子の弟子(のつもり)のデプロイ市民の かっぱ@inokara)です。

はじめに

先日の re:Invent 2014 で発表になった数多の新サービスの中で AWS CodeDeploy / AWS CodeCommit / AWS CodePipeline というデプロイツール三兄弟(Code 三兄弟)が華々しくデビュー致しました。詳細については以下のブログ記事を御覧ください。

そんな中、三兄弟の長男である AWS CodeDeploy が Preview として利用出来るようになっていますので、手元のアプリケーション(Play Framework)でデプロイを試してみたいと思います。

ということで…でぷろーい!

参考

AWS CodeDeploy とは

新サービス AWS CodeDeploy を試してみる: AWS CodeDeploy とは?(1)

ドキュメントにとても解りやすい図があったので引用させて頂きます。
新サービス AWS CodeDeploy を試してみる: AWS CodeDeploy とは?(2)
出典:What is AWS CodeDeploy?

上図のように EC2 インスタンスに codedeploy agent をインストールする必要があるのがちょっち注意が必要ですが、既存の GitHub のリポジトリや S3 のバケットに保存されたソースコードを取得して展開しアプリケーションの起動まで行ってくれるツール(という認識)です。尚、デプロイするソースコードと一緒に appspec.yml というデプロイの定義が書かれた YAML ファイルを同梱しておく必要があります。

サンプルアプリケーションを動かしてみましたがとても簡単にサンプルアプリケーションを動かすことが出来ました。

オリジナルのアプリケーションを動かしてみる

俺のアプリ

サンプルアプリケーションもソコソコに俺のアプリケーションをデプロイしてみたいと思います。
尚、俺のアプリは Play Framework の検証で最近お世話になっている以下のアプリケーションです。

アクセスするとアクセス元の IP 等のリクエストヘッダを出力するアプリケーションです。

appspec.yml 等を以下のように用意しました。

version: 0.0
os: linux
files:
  - source: /
    destination: /path/to/
hooks:
  BeforeInstall:
    - location: scripts/cleanup.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/install.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start.sh
      timeout: 300
      runas: root

hooks には上記のように BeforeInstallAfterInstallApplicationStart 以外にも ValidateService 等も定義することが出来るようです。下記の図もドキュメントからの拝借で恐縮ですが、デプロイのプロセスは下記のような流れになっており、各 hooks はそれぞれのポイントで動作するようです。

新サービス AWS CodeDeploy を試してみる: デプロイのプロセス
出典:AWS CodeDeploy AppSpec File Reference

尚、location には各 hook で実行するスクリプトを定義していて、今回の俺のアプリケーションでは scripts/ 以下のスクリプトを用意しています。

supervisorctl stop play-test-app
rm -rf /path/to/prod/*

アプリケーションの起動と指定は Supervisord 経由でコントロールすることにしました(理由は後述)。

cd /path/to/prod
play clean stage
touch installed

touch installed はちゃんと play clean stage が動いたかを確認したかったので実行させてます。

supervisorctl start play-test-app

アプリケーションをバックグラウンドで起動させると ApplicationStart で固まってしまったので、とりあえず今回は Supervisord 経由で起動するようにしています。

インスタンスの準備

Amazon Linux を起動して codedeploy-agent を以下のようにインストールします。

sudo yum -y update
sudo yum -y install aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
chmod +x ./install
sudo ./install auto

codedeploy-agent は init スクリプトになっており service コマンドで起動、停止することが出来ますが、起動するとしばらく反応が返ってきません。(どうやら codedeploy-ageent 自体のアップデートチェックを行っているように見えます…)

アプリケーションは先述の通り Supervisord 経由で起動するように設定する。

[program:play-test-app]
command = /path/to/target/universal/stage/bin/play-test-app
process_name = play-test-app
user = root
autostart   = false
autorestart = false

/path/to/target/universal/stage/bin/play-test-appplay clean stage で生成される起動スクリプトです。

新しいアプリケーション

Create New Application でデプロイするアプリケーションとデプロイ先(アプリケーショングループ)を作成しておきます。作成方法についてはこちらこちらに詳しく解説頂いているので御覧ください。

新しいアプリケーションとアプリケーショングループを作成したら Deploy New Revision をクリックしてリポジトリ(S3 バケット)の指定等を行います。
新サービス AWS CodeDeploy を試してみる: 新しいアプリケーションの作成(1)

以下のように設定します。
新サービス AWS CodeDeploy を試してみる: 新しいアプリケーションの作成(2)

設定が終わったら Deploy Now をクリックしましょう。

しばらくすると…
新サービス AWS CodeDeploy を試してみる: 新しいアプリケーションの作成(3)

デプロイ完了!(ここまでに何度失敗したことか…)

アプリケーションにアクセスしてみる

新サービス AWS CodeDeploy を試してみる: 動作確認
おお、ちゃんとアプリケーションが起動してまっせ!!

とりあえず…

CodeDeploy を触ってみました…。

既存のアプリケーションをほとんど修正せずにデプロイ出来たのは嬉しいですね!
ただ、codedeploy-agent を再起動させるとプロセスが起動するまでにしばらく時間が掛かってしまうのはちょっとナゾでした…。

ということで、そのうち利用出来るようになる CodeCommit や CodePipeline とどのような連携が出来るのかを楽しみにしつつ、ドキュメントを読み込みながら CodeDeploy を触ってみたいと思います。

元記事はこちらです。
PlayFramework – AWS 白帯シリーズ(23)祝:新サービス! CodeDeploy で俺のサービスをデプロイしてみよう(PREVIEW)