CodeDeploy のデプロイ方式に Blue/Green Deployment が追加されました

AWS CodeDeploy
107件のシェア(ちょっぴり話題の記事)
  • 2016/01/30 【修正】 ELB にインスタンスを追加するタイミング、現環境を削除するタイミングは指定可能でした

こんにちは、藤本です。

先日、CodeDeploy に Blue/Green デプロイ機能が追加されました。

早速触ってみましたのでご紹介します。

概要

CodeDeploy は今までデプロイ方式にインプレイスデプロイのみを提供していました。インプレイスデプロイは既存のインスタンスにアプリケーションを上書きすることで、高速なデプロイを実現していました。しかし、アプリケーションを上書きすることで、いざ、デプロイしたアプリケーションにバグが内在していて、前のバージョンのアプリケーションに切り戻したい時は再度アプリケーションをデプロイする必要があり、切り戻しに時間がかかっていました。デプロイメントグループを分けることで Blue/Green デプロイを実現することができていましたが、事前作業や、切替作業が必要である程度の手作業、もしくは自動化するには作り込みが必要でした。

そこで今回のリリースです。デプロイ方式に Blue/Green デプロイを選択できるようになりました。Blue/Green デプロイにより、リリース後のバグがあった際も発覚時にも早急な切り戻しが可能となりました。AutoScaling はもちろん、AutoScaling じゃないアプリケーションも Blue/Green デプロイができます。

CodeDeploy による Blue/Green デプロイ

CodeDeploy に実装された Blue/Green デプロイの方式を説明します。今回は Auto Scaling バージョンで説明します。

0. 新しいバージョンのアプリケーションをデプロイ(CodeDeploy のリリース操作)
1. 現環境の Auto Scaling Group を新環境用の Auto Scaling Group としてコピー

1(1)

2. 新環境のインスタンスがアプリケーションデプロイ処理

2

3. ELB に新環境のインスタンス追加

新環境を ELB に追加するタイミングはオプションで設定可能です。可能な設定としては、即時、時間指定(◯日◯時間◯分後形式)、という選択肢から選択することができます。ELB に追加する前に動作確認したい、という場合は後者を選択すると良いかと思います。また後者の場合、時間を待たなくても、WebGUIのボタンから任意のタイミングで開始することもできます。

3

4. ELB から現環境のインスタンスを切り離し

4

5. (オプション)現環境の Auto Scaling Group を削除

現環境のインスタンスを削除するタイミングはオプションで設定可能です。可能な設定としては、即時、時間指定(◯日◯時間◯分後形式)、削除しない、という選択肢から選択することができます。デプロイ後に本番環境で試験を実施したい場合や、万が一に備えて現環境を残しておきたい場合は 2番目、3番目の方式を選択するとよいでしょう。2番目の方式も時間を待たなくても、WebGUIのボタンから任意のタイミングで削除することができます。

5

Elastic Beanstalk を既にご利用の方は見たことある流れだと思います。Elastic Beanstalk のデプロイ方式でいう Immutable となります。Elastic Beanstalk の制約で Elastic Beanstalk を採用できない環境でも CodeDeploy で Blue/Green デプロイを実施できるようになりました。できれば、URL Swap や Route 53 切り替えも実装してほしいです。

試してみた

それでは早速、CodeDeploy の Blue/Green デプロイを試してみましょう。今回はドキュメントのワークフローを試してみます。

ワークフローでは以下の手順で CodeDeploy による Blue/Green デプロイを体験することができます。

1.Get started
2.Choose a deployment type
3.Create blue/green deployment
4.Monitor the blue/green deployment
5.Refresh the web application window
6.Clean up sample resources

1. Get started

マネジメントコンソールへ接続し、CodeDeploy の画面へ遷移します。「Get Started Now」を選択します。

AWS_CodeDeploy_Management

CodeDeploy はサンプルアプリケーションを用意しています。手元に試せる環境がない、あっても試すために CodeDeploy 用の設定をするのが非常に手間だ、という方はまずはこちらのサンプルアプリケーションで試してみるのがいいと思います。

「Sample deployment」を選択し、「Next」をクリックします。

AWS_CodeDeploy_Management のコピー

2. Choose a deployment type

「Blue/green deployment」を選択し、「Next」をクリックします。

AWS_CodeDeploy_Management 2

3. Create blue/green deployment

3.1. サンプルアプリケーションデプロイ(Blue)

サンプルアプリケーションの設定値を入力します。サンプルアプリケーションは CloudFormation によって構築されます。ここで入力した設定値は CloudFormation のパラメータに利用されます。

AWS_CodeDeploy_Management 3

パラメータ名 説明 デフォルト値
Application name 新規作成する CodeDeploy のアプリケーション名 BlueGreenDemoApplication
Deployment group name 新規作成する CodeDeploy の Deployment Group 名 BlueGreenDemoFleet
Auto Scaling group name 新規作成する Auto Scaling Group 名 BlueGreenAutoScalingGroup
Load balancer name 新規作成する ELB 名 BlueGreenLoadBalancer
Service role name 新規作成する CodeDeploy の IAM Role 名 BlueGreenCodeDeployServiceRole
Key pair name EC2 に設定するキーペアをプルダウンから選択 -

今回はキーペアだけ選択し、その他は全てデフォルト設定とします。「Launch Environment」をクリックし、サンプルアプリケーションの環境作成を開始します。

AWS_CodeDeploy_Management_4

裏では、CloudFormation Stack が作成され、IAM Roleや、VPC、ELB、AutoScaling(3つの EC2 インスタンス)、CodeDeploy が作成されます。

CloudFormation_Management_Console

サンプルアプリケーションの環境作成が完了すると、「Congratulations! Your environment is ready.」のメッセージが表示されます。

AWS_CodeDeploy_Management 5

Webブラウザから記載された URL を開き、サンプルアプリケーションに接続可能なことを確認します。

Sample_Deployment

現在は青の背景の WebUI です。

3.2. Green のリリース

続いて、Blue/Green デプロイを実行します。「Start blue/green deployment」をクリックします。

4. Monitor the blue/green deployment

デプロイが開始されます。上で記載した流れでデプロイが実施されます。

AWS_CodeDeploy_Management_11

デプロイ完了を待ちます。

新環境が作成され、

AWS_CodeDeploy_Management_13

ELB に新環境が追加され、

AWS_CodeDeploy_Management_15

ELB から現環境が切り離され、

AWS_CodeDeploy_Management_16

現環境の EC2インスタンス(Auto Scaling Group)が削除されます。

AWS_CodeDeploy_Management_17

5. Refresh the web application window

デプロイされたアプリケーションを確認します。Webブラウザを再表示します。

Sample_Deployment 2

緑の背景の WebUI に変更されました。

サンプルアプリケーションでは Blue/Green デプロイがボタン一つで実行されましたが、実際にどのようなオペレーションが必要なのかも確認してみましょう。

CodeDeploy のアプリケーション画面から、サンプルアプリケーションを開きます。既存の Deployment Group を選択し、「Action」 - 「Deploy new revision」を選択します。

screenshot_2017-01-29_14_25_37

Revision location に S3のパスを入力します。今回は最初にデプロイされた青背景のアプリケーションのzipファイルを選択します。

AWS_CodeDeploy_Management_19

その他、Deployment configuration は一括でいいと思うので、AllAtOnce を選択します。必要に応じて、Rollback の設定を修正します。「Deploy」をクリックします。

AWS_CodeDeploy_Management 21

新バージョンのデプロイを開始します。

AWS_CodeDeploy_Management 22

これだけです。簡単ですね!

6. Clean up sample resources

作成したリソースを削除します。Auto Scaling Group、CloudFormation Stack、CodeDeploy のアプリケーションを削除します。放置しているとコストが掛かり続けますので忘れずに削除しましょう。

オプション設定

最初の図で説明した 3. と 5. のオプション設定はデプロイメントグループの設定から行うことができます。

作成しているアプリケーションのデプロイメントグループの編集画面を開きます。

「Deployment settings」の「Edit deployment settings」を選択します。

AWS_CodeDeploy_Management 23

Traffic rerouting が 3. の設定になります。上は即時、下は時間指定です。Original instances が 5. の設定になります。上は時間指定(即時は全て 0)、下は削除しない設定です。

AWS_CodeDeploy_Management 24

まとめ

いかがでしたでしょうか?

CodeDeploy に Blue/Green デプロイが追加され、安全なリリースを行うことができるようになりました。個人的には CodePipeline から CodeDeploy を利用した際に Blue/Green デプロイする方法を模索中だったので、今回のリリースは嬉しいです。CodePipeline との連携も試して、ブログ化します。

  • kaojiri

    いつも参考にさせていただいております。本記事も図もあり大変わかりやすいと思います。
    ひとつ細かいところで質問なのですが、インスタンス起動時のuserdataとcodedeployのデプロイの順序性ってどうなんでしょうか?
    userdataでインスタンスのセットアップ(ミドルの設定とか)を済ませてからデプロイしたい、などのユースケースがあると思うのですが、どのように制御すればよいのでしょうか?

    • Shinji Fujimoto

      ご覧いただきありがとうございます。
      ドキュメントでは見つけられませんでしたが、userdata を処理する cloud-init より codedeploy-agent の起動スクリプトが後に処理されるため、特に制御は必要ないかと思います。
      また userdata でインスタンスのセットアップしているのであれば、セットアップ済みの AMI を利用することでアプリケーション起動までの時間を短縮することが可能となります。