Elastic BeanstalkでExpressアプリケーションをBlue-Green Deploymentをやってみた

2019.12.30

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

こんにちは。さかいです。 ホワイトペーパーでBlue-Green Deployment について読みました。特徴については各種ドキュメントなどを読んでなんとなくの理解はありましたが、実際に手を動かして実施したことがないなぁと思ったので、実際に環境を構築してみることにしました。 今回は、Elastic Beanstalkを利用してBlue-Green Deploymentを実際に構築してみます。

構築する環境

今回デプロイするアプリケーションは、Node.js + ExpressでWebアプリケーションをデプロイします。

  • Blue環境を構築しアプリケーションを稼働させる
  • アプリケーションを更新し、Green環境を構築する
  • DNSの向き先をGreen環境に変更する
  • Blue環境にロールバックする

なお、ドメインは独自に取得したドメインを利用し、DNSはRoute53を利用します。

引用:Blue/Green Deployments on AWS

バージョン

$ node --version
v10.15.3
$ express --version
4.16.1
$ eb --version
EB CLI 3.17.0 (Python 3.7.4)

アプリケーションを作成

Node.js + Expressのプロジェクトを作成します。アプリケーションはexpressコマンドを利用して、アプリケーションのスケルトンを作成します。 今回は作成したアプリケーションをアップロードできる形式(zip圧縮)にして、マネジメントコンソールからElastic Beanstalkのアプリケーションを作成します。 また、Elastic Beanstalkのコマンドラインインターフェイス(EB CLI)もあり、EB CLIでアプリケーションの作成、更新、モニタリングすることも可能です。

Node.js + Expressプロジェクトを作成

以下のコマンドを実行し、アプリケーションのスケルトンを作成し、必要に応じてGitリポジトリを初期化します。 なお、Gitリポジトリを初期化しておくことで、EB CLIを利用する際は、Gitにコミットしたリソースをデプロイできるようになるので、管理が楽になります。

$ express && npm install
$ git init

作成されてアプリケーションは、GET /GET /usersが作成されています。アプリケーションの違いがわかりやすいように、GET /のソースを少し書き換えます。

routes/index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Blue Express' });
});

module.exports = router;

Node.jsの起動コマンドを設定

作成したアプリケーションを起動するには、npm startコマンドを実行する必要があります。Elastic Beanstalkでは設定ファイル(.ebextensions)を利用して、環境のカスタマイズをすることができるので、以下の通り設定ファイルを作成します。また、各種オプションの指定方法は複数あり、同じオプションを指定した場合は、適用の優先順位がありますので、設定したのに反映されないなどありましたら、確認してみてください。

.ebextensions/nodecommand.config

option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"

プロジェクトをアップロードできる形式に変換

今回はプロジェクトのソースをマネジメントコンソールからアップロードするので、アップロードできる形式に変換します。 ZIPまたはWAR形式でアップロードできるのですが、今回はプラットフォームがNode.jsですので、ZIP形式で作成します。

$ zip -r sample_express.zip ./

Elastic Beanstalkにアプリケーションを作成

マネジメントコンソールで、Elastic Beanstalkにアクセスし、今すぐ始めるをクリックしてアプリケーションの設定画面に遷移します。 必要な情報を入力・選択し、アプリケーションコードに先程作成した、ZIPファイルを指定し、アプリケーションの作成をクリックしてアプリケーションを作成します。

アプリケーションの作成が始まると、実行中のコマンドが表示され、作成が完了すると、以下のようにダッシュボードが表示されます。自分の環境では、数分で作成されました。

作成されたアプリケーションのURLをクリックすると、アプリケーションが起動していることを確認できます。

Route53でDNSを設定

作成したアプリケーションへのアクセスを独自ドメインを利用してアクセスするために、Route53を利用して、DNSの設定をします。 ドメインのホストゾーンを作成し、作成したアプリケーションのエンドポイントに対して、ALIASレコードを追加します。

設定したドメイン経由でアプリケーションにアクセスできることが確認できます。

Greenをデプロイ

これまでで、独自ドメインでアクセス可能なアプリケーションを作成することができました。今回検証したかった内容はここからが本番です。 まずは、Green環境を作成するためにアプリケーションを更新します。

routes/index.js

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Green Express' });
});

module.exports = router;

更新したアプリケーションを利用して、アプリケーションを作成した時と同様にGreen環境を新たに作成します。

Green環境を作成したことで、現状は1アプリケーション内に2環境作成済みとなります。

  • sample_express(アプリケーション)
  • SampleExpress-env-1(Blue)
  • SampleExpress-env-2(Green)

BlueとGreenのURLを入れ替える

Green環境が作成できたので、Blue環境からGreen環境へ向き先を入れ替えます。 環境URLのスワップをクリックし、入れ替える環境を選択し、スワップします。

スワップ後、ドメインでアクセスするとGreen環境に入れ替わっていることが確認できます。

スワップ後の環境を確認すると、Blue環境とGreen環境のエンドポイントが入れ替わっていることが確認できました。 DNSの設定は、Blue環境のエンドポイントに向くように設定済みですので、URLを入れ替えることでドメイン経由のアクセスでもGreen環境が表示されることになるようです。

Blueにロールバック

Blue-Green Deploymentのメリットでもある、ロールバックも試してみます。 ロールバックについても上記同様にURLを入れ替えるのみとなります。 ドメインでアクセスしてみると、ロールバックしていることを確認できました。

注意事項

これまでElastic Beanstalkを利用して、Blue-Green Deploymentを実行してみました。 実施した範囲だと、ダウンタイムも少なく、手順もシンプルでとても簡単に思えますが、アプリケーションによっては注意事項もありますので、 合わせてご確認ください。 以下の弊社ブログがとても参考になると思うのでご確認ください。

Blue-Green Deploymentにおける注意点

さいごに

アプリケーションにもよりますが、デプロイ作業は、できるだけアプリケーションを停止しないこと、時間内に完了させることが求められます。 デプロイ後にロールバックする時は、なんらかの不具合やバグが合った場合に、迅速に作業する必要があります。 そういった時にわずか数クリックでデプロイ、ロールバックをできるのが非常に強力だと感じました。 どなたかの参考になれば幸いです。