どうも、cloudpack の デプロイ王子の弟子(のつもり)のデプロイ市民の かっぱ(@inokara)です。
はじめに
先日の re:Invent 2014 で発表になった数多の新サービスの中で AWS CodeDeploy / AWS CodeCommit / AWS CodePipeline というデプロイツール三兄弟(Code 三兄弟)が華々しくデビュー致しました。詳細については以下のブログ記事を御覧ください。
そんな中、三兄弟の長男である AWS CodeDeploy が Preview として利用出来るようになっていますので、手元のアプリケーション(Play Framework)でデプロイを試してみたいと思います。
ということで…でぷろーい!
参考
- 【AWS発表】コードの管理とデプロイのための新しいAWSのサービス群
- AWS CodeDeployで簡単デプロイ(CLI編)
- AWS CodeDeployでコマンドラインでGitHubからデプロイする方法
- AWS CodeDeployをさっそく試してみる
- AWS CodeDeploy を使って Rails アプリケーションをデプロイしてみた
AWS CodeDeploy とは
ドキュメントにとても解りやすい図があったので引用させて頂きます。
出典: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
には上記のように BeforeInstall
や AfterInstall
と ApplicationStart
以外にも ValidateService
等も定義することが出来るようです。下記の図もドキュメントからの拝借で恐縮ですが、デプロイのプロセスは下記のような流れになっており、各 hooks
はそれぞれのポイントで動作するようです。
出典: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-app
は play clean stage
で生成される起動スクリプトです。
新しいアプリケーション
Create New Application
でデプロイするアプリケーションとデプロイ先(アプリケーショングループ)を作成しておきます。作成方法についてはこちらとこちらに詳しく解説頂いているので御覧ください。
新しいアプリケーションとアプリケーショングループを作成したら Deploy New Revision をクリックしてリポジトリ(S3 バケット)の指定等を行います。
設定が終わったら Deploy Now
をクリックしましょう。
デプロイ完了!(ここまでに何度失敗したことか…)
アプリケーションにアクセスしてみる
とりあえず…
CodeDeploy を触ってみました…。
既存のアプリケーションをほとんど修正せずにデプロイ出来たのは嬉しいですね!
ただ、codedeploy-agent を再起動させるとプロセスが起動するまでにしばらく時間が掛かってしまうのはちょっとナゾでした…。
ということで、そのうち利用出来るようになる CodeCommit や CodePipeline とどのような連携が出来るのかを楽しみにしつつ、ドキュメントを読み込みながら CodeDeploy を触ってみたいと思います。
元記事はこちらです。
「PlayFramework – AWS 白帯シリーズ(23)祝:新サービス! CodeDeploy で俺のサービスをデプロイしてみよう(PREVIEW)」