話題の記事

AWS Elastic BeanstalkがDockerをサポートすると何がうれしいのか

2014.05.21

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

始めに

AWS Elastic BeanstalkでDockerコンテナをデプロイできるようになりました。私は最近、Dockerを勉強し始めたのですが、いまいち何が便利なのか分からなかったので調べたことを整理してみました。

Dockerに関して

この記事をご覧になっている方はほとんどの方が知っているかと思いますがDockerは最近流行のImmutable Infrastructureを実現するソフトウェアです。Linuxのカーネルとlibcontainerという独自のライブラリでコンテナを実行し、仮想マシンのような使い方ができます。ミドルウェアなどの設定をDockerfileに記述し、アプリケーションをデプロイした状態で起動することが可能です。

AWS上でDockerを使いたい時ってどんな時?

AWS上でImmutable Infrastructureを実現したい時です。実はAWSではCloudFormationを使えば簡単にサーバを構築したり削除することは可能です。ですがDockerのようにローカルなど他の環境から構成をそのまま持ってくることはできません。

Elastic Beanstalkに関して

Elastic BeanstalkはAWSが提供するPaasになります。内部的にはEC2などのAWSリソースが使われているので、AWSサービス群のラッパーのみたいなものでしょうか。Beanstalkで新規に環境を作成する際に内部では以下のような処理が行われています。

  • EC2インスタンスの作成
  • 環境に応じてミドルウェアのインストール
  • ELB の作成
  • Auto Scaling のグループ作成
  • Security Group の作成
  • S3 のバケット作成(アプリケーションファイルとサーバーログファイル用)
  • Cloud Watch の設定

起動後は選択したプラットフォームによるのですが、例えばTomcatを選択した場合はTomcatやApacheなどはインストール済みになり、warファイルをアップロードすればすぐに使えるようになります。Paasを使うメリットとしてはサーバ構築・運用のコストを削減できることにあると思います。私はBeanstalkに初めて触ってみたのですがとても簡単でした。

Dockerを選択した場合はDockerがインストールされた状態になりますが、他の選択肢はアプリケーションの開発言語や実行環境なのでDockerだけなんか違う感じがしますね。次はDockerコンテナをデプロイできることにどのようないいことがあるのか整理していきます。

BeanstalkでDockerを利用できるメリット

現在、Beanstalkでは以下のプラットフォームを選択できます。

  • Java(Tomcat)
  • .NET(IIS)
  • Node.js
  • PHP
  • Python
  • Ruby
  • Docker

DockerをBeanstalkでデプロイするメリットとしては実行環境ごとデプロイできるため、Paasでありながら実行環境を自由に選択できることにあります。例えば、Perlで実装したい、という場合やJavaでTomcat以外のアプリケーションサーバを使いたいなどの場合です。あとサーバOSを好きなOSにできるようになります。Beanstalkを利用する場合は通常Amazon Linuxになります。デプロイのイメージとしては以下の図のような感じです。

docker-image

実際にはゲストOSや実行環境のソフトウェアはDockerfileに記述されて起動時にダウンロードされます。アプリケーションはDockerfile内でgitから取得したり、Dockerfileと一緒に渡してデプロイすることもできます。

Dockerを使いたい人の視点で見た場合でもBeanstalkを使うことによりホストOSへのDockerインストールやコンテナの作成、アプリケーションのデプロイ、ロードバランサーやAutoScalling、Security Groupの設定をしてくれる、というメリットがあります。

実際にやってみた

試しにElastic Beanstalk for Dockerを使ってCGIをデプロイしてみましょう。 Dockerコンテナのデプロイの仕方は以下のページを参考にしました。 AWS Elastic BeanstalkでDockerコンテナをデプロイしてみた

Dockerfileは以下になります。このサンプルではソースファイルをDockerfile内で生成していますが、実際はgitからcloneしたりデプロイ時に一緒に渡したりすることになると思います。

WindowsでDockerfileを作成するときの注意点ですが、Dockerfile内の改行コードが CR+LFになっているとデプロイに失敗するので注意しましょう。

FROM centos
RUN yum install -y perl httpd
RUN echo "#! /usr/bin/perl" >> /var/www/cgi-bin/hello.cgi && echo 'print "Content-type: text/html\n\n";' >> /var/www/cgi-bin/hello.cgi && echo 'print "DockerSample!\n";' >> /var/www/cgi-bin/hello.cgi
RUN chmod 755 /var/www/cgi-bin/hello.cgi

EXPOSE 80
CMD /usr/sbin/apachectl -D FOREGROUND

最後に

BeanstalkでDocker試したらロードバランサーの設定も完了しており、簡単に作成したページを見ることができました。Dockerを単体で触ったことがある方であれば、この辺を自動でやってくれるありがたみが分かると思います。超簡単でした。