Elastic BeanstalkのCNAME Swapを試してみる

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

ビールは常にサッポロクラシック派の佐々木です。ちなみに僕、社内ではすもけって呼ばれているんですが、たまに客先でもナチュラルにすもけって言う人(主に社長)がいるので、そろそろ本名も改名したほうがいい良いかも知れないなって思ってます。

はじめに

アプリケーションをデプロイするときの新バージョンへの切り替えは、同一サーバで上書きする場合もあれば、別環境を作成して切り替える(いわゆるBlue-Green Deployment)など、様々な手法があります。

Elastic BeanstalkにはCNAME Swapを使う手法があります。この手法では、あるバージョンのアプリケーションをデプロイ後、新しいバージョンのアプリケーションを違う環境(Environment)としてデプロイします。BeanstalkではEnvironmentごとにCNAMEによる名前が付与されます。

AWS_Simple_Icons_2_3_light_edition_pptx

CNAME Swapをすることで、Environmentに付与されたCNAMEを入れ替えることが出来ます。これで既存バージョンを残したまま、他の箇所を変更することなく、そして利用者が意識することなく、新バージョンに移行することが出来ます。

AWS_Simple_Icons_2_3_light_edition_pptx 2

ということを、実際に手を動かして試してみました!

やってみた

事前準備

Beanstalkを操作するためのawsebcliをインストールします。またBeanstalkを操作可能なIAMアカウントの認証情報もセットします。

$ pip install awsebcli
$ aws configure

Beanstalkの初期設定

アプリケーション用のディレクトリを作成し、gitの設定をしておきます。

$ mkdir ebapp
$ cd ebapp
$ git init .

eb initにてBeanstalkアプリケーションの初期設定を行います。今回はRubyアプリケーションを作ります。

$ eb init

Select an application to use
1) My First Elastic Beanstalk Application
2) [ Create new Application ]
(default is 2): 2

Enter Application Name
(default is "ebapp"): ebapp
Application ebapp has been created.

Select a platform.
1) Node.js
2) PHP
3) Python
4) Ruby
5) Tomcat
6) IIS
7) Docker
8) Multi-container Docker
9) GlassFish
10) Go
(default is 1): 4

Select a platform version.
1) Ruby 2.2 (Puma)
2) Ruby 2.2 (Passenger Standalone)
3) Ruby 2.1 (Puma)
4) Ruby 2.1 (Passenger Standalone)
5) Ruby 2.0 (Puma)
6) Ruby 2.0 (Passenger Standalone)
7) Ruby 1.9.3
(default is 1): 1
Do you want to set up SSH for your instances?
(y/n): n

最初のEnvironmentの作成

新しい、最初のEnvironmentを作成します。

$ eb create
Enter Environment Name
(default is ebapp-dev):ebapp-dev
Enter DNS CNAME prefix
(default is ebapp-dev):ebapp-dev

AWS管理コンソールで確認すると、以下のようにEnvironmentが追加されています。

Elastic_Beanstalk_Applications

以下のように、Sinatraで動くRubyアプリケーションを作成します。

$ vi config.ru
require './index'
run Sinatra::Application

$ vi Gemfile
source 'http://rubygems.org'
gem 'sinatra'

$ vi index.rb
require 'sinatra'
get '/' do
    "My First Elastic Beanstalk"
end

$ git add .
$ git commit -m "1st commit"

では、作成したRubyアプリケーションをデプロイします。

$ eb deploy
INFO: Environment update completed successfully.

ステータスを確認します。StatusがReady、HealthがGreenになっていればOKです。

$ eb status --verbose
Environment details for: ebapp-dev
  Application name: ebapp
  Region: ap-northeast-1
  Deployed Version: xxxx
  Environment ID: e-xxxxxxxx
  Platform: 64bit Amazon Linux 2015.03 v1.4.6 running Ruby 2.2 (Puma)
  Tier: WebServer-Standard
  CNAME: ebapp-dev.elasticbeanstalk.com
  Updated: 2015-08-05 04:51:56.409000+00:00
  Status: Ready
  Health: Green
  Running instances: 1
      i-xxxxxxxx: InService

eb openするとWebブラウザが開きます。

$ eb open

ちゃんと動いてますね。

502_Bad_Gateway

新バージョンのEnvironmentの作成

新しいバージョンのアプリケーション用に、Environmentを追加作成します。

$ eb create
Enter Environment Name
(default is ebapp-dev2):
Enter DNS CNAME prefix
(default is ebapp-dev2):

AWS管理コンソールでも追加されています。

Elastic_Beanstalk_Applications 2

アプリケーションのソースコードも変更しておきます。

$ vi index.rb
require 'sinatra'
get '/' do
"My Second Elastic Beanstalk"
end

$ git add index.rb
$ git commit -m "2nd commit"

変更したアプリケーションを、新しいEnvironmentにdeployします。

$ eb deploy ebapp-dev2

ステータスの確認。

$ eb status ebapp-dev2 --verbose
Environment details for: ebapp-dev2
Application name: ebapp
Region: ap-northeast-1
Deployed Version: yyyy
Environment ID: e-yyyyyyyy
Platform: 64bit Amazon Linux 2015.03 v1.4.6 running Ruby 2.2 (Puma)
Tier: WebServer-Standard
CNAME: ebapp-dev2.elasticbeanstalk.com
Updated: 2015-08-05 06:13:14.618000+00:00
Status: Ready
Health: Green
Running instances: 1
i-yyyyyyyy: InService

では開いてみましょう。

$ eb open ebapp-dev2

新しいバージョンのアプリケーションになっていますね(FirstがSecondになっています)

ebapp-dev2_elasticbeanstalk_com

CNAME Swapする

ここが本題。eb swapします。

$ eb swap
INFO: swapEnvironmentCNAMEs is starting.
INFO: Swapping CNAMEs for environments 'ebapp-dev' and 'ebapp-dev2'.
INFO: 'ebapp-dev2.elasticbeanstalk.com' now points to 'awseb-e-r-AWSEBLoa-hoge-1234.ap-northeast-1.elb.amazonaws.com'.
INFO: Completed swapping CNAMEs for environments 'ebapp-dev' and 'ebapp-dev2'.

AWS管理コンソールを見ると、それぞれのURLが入れ替わってます。

Elastic_Beanstalk_Applications_1

Webブラウザでアクセスすると、もちろん結果も入れ替わってます!

ebapp-dev2_elasticbeanstalk_com_と_ebapp-dev_elasticbeanstalk_com

さいごに

実は初めてElastic Beanstalkを触ったんですけど、これは確かに簡単ですね。スケールする環境をサクサク作れるのはとても魅力的だと思いました。

参考文献