Help us understand the problem. What is going on with this article?

Dockerコンテナデプロイサービスの比較 (Beanstalk Multi-container Docker/ECS)

More than 3 years have passed since last update.

概要

最近Dockerコンテナでシステムの本番運用を始めました。その際にデプロイサービスとして検証したのがBeanstalk Multi-dockerとECS。今回は実際に両方触ってみて、両者のメリット・デメリットをまとめます。
尚、調査する上で、ECSで動作するRails コンテナ (Amazon Linuxイメージ) を作りました。ソースは GitHub で公開しています。

機能比較

Beanstalk、ECS共にDockerコンテナを動かすことはできますが、機能比較するとこんな感じです。

機能  Beanstalk ECS
EC2インスタンスの作成
EC2セキュリティグループの割当 アプリケーション環境単位で生成 既存のセキュリティグループを指定可能
EC2オートスケーリング
ELB (CLB) の作成
ELB (ALB) の作成 ◯ (※1)
ローリングデプロイ
ブルーグリーンデプロイ
(OSS)
アラート通知
環境作成のエラー・ヘルスステータスの変化等を通知
ログ管理
RDSインスタンスの生成
  • ※1: CLIからのみ実行可能

Beanstalkの特徴

  • 環境構築が楽。EC2+RDSという一般的なアプリケーションであればBeanstalkコンソールでほぼ完結
  • コンテナを用いないアプリケーションも構築可能
  • Multi-container Dockerを利用すると、裏でECSが動く (ECSを意識しなくてもアプリケーションが動く)

Beanstalkはとにかく環境構築が簡単。ウィザードに従ってうっかり Create environment なんて押すもんならいきなりインスタンス起動してアプリケーションが動き出す。間違えて3回くらい押した。

beanstalk.jpg

Beanstalkは環境構築が簡単な反面、裏で何のサービスが連動しているのか分かりにくい側面もあります。障害が発生した時、問題の切り分け (コンテナが原因なのか、ECSか、それともBeanstalkの問題か) が困難となる印象です。
ちなみにBeanstalkでもELBは利用できますが、ELB利用時にセッションストレージとしてよく使うであろうElastiCacheはBeanstalkのコンソールからは連携できないようです。

あと地味に便利だと思ったのはCloudWatchへのログ転送。Lambdaのように自動で各種ログをCloudWatchに流してくれる。恐らく裏でCloudWatch Logs Agentが動いてると思われる。

Beanstalkには色々と良い面もあるのですが、個人的にはセキュリティグループが謎の命名規則によって環境ごとに生成されまくるのが嫌という理由でECSの検討を始めました。

ECSの特徴

  • Dockerコンテナのデプロイに特化
  • ALBが使える
    • CLBと比較してコストが安くパフォーマンスも高い
    • WebSocket、HTTP/2対応
    • L7ルーティング対応
    • 動的ポートマッピング対応
  • Dockerの新機能はBeanstalkより早く取り込まれる

ECSを利用する場合、Beanstalk Multi-container Dockerが裏でやってくれていた仕事 (クラスタの構築、タスクの作成、サービスの作成) を自前で準備する必要があります。これが結構面倒です。CloudFormationでテンプレート書けば良さそうですが。

またECS特有の「タスク」や「サービス」の仕組みを理解する必要がありますが、概念さえ理解してしまえば、コンテナに対するリソース制限からネットワーク設定まで幅広い制御が可能です。

もう一点、ECSの特徴としてALBが使えることは大きなメリットですが、中でも動的ポートマッピングが良い感じ。
CLBの場合、1ホスト (EC2 Container Instance) につき1コンテナしかポートマッピングできなかったのが、ALBの利用によって複数マッピング可能となりました。これによって、1ホストで複数のWebアプリケーションを動かすことが可能となります。
また、今までELB利用時は2台のインスタンスを分散配置させる必要がありましたが、ALBはポート単位でコンテナと接続するため、1ホストだけ配置しておけば、あとはよしなにリクエストを分散してくれるようになります。

ちなみにECSはいくつかデプロイツールが公開されてます。これも機能を比較してみました。

パッケージ  GitHub Watch GitHub Star GitHub Fork 特徴
aws/amazon-ecs-cli 67 491 79 AWSオフィシャル。Docker composeファイルが利用可能
silinternational/ecs-deploy 31 473 154 サービスのデプロイに特化
stormcat24/ecs-formation 8 78 9 ブルーグリーンデプロイが可能

ecs-cliはクラスタの設定を ~/.ecs/config に書き込むイマイチ仕様だったので、今回はecs-deployを採用。
最近はDocker CI環境を構築し、ecs-deployをラップしたデプロイツールでコンテナの本番運用を始めてます。
次のフェーズとしてデプロイの自動化を検討しているので、これについてはまた次回書こうと思います。

metaps
メタップスは「テクノロジーでお金と経済のあり方を変える」というミッションのもと、テクノロジーをフル活用することで人々を現実世界における様々な制約から解放し、世界中の誰もが自由に価値創造できる社会を目指しています。
https://metaps.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした