JenkinsとAmazon ECSで
お手軽コンテナCI
Shigeyuki Azuchi
HAW International, Inc
2015.12.12
JAWS-UG 福岡ちょっと濃い目にAWSの話をしてみよう
コンテナとは?
コンテナとは?
ユーザ空間
ハイパーバイザー(Xen)
EC2(カーネル空間)
ユーザプロセス
ユーザプロセス …
ユーザ空間
ユーザプロセス
ユーザプロセス
… …
ユーザ空間
EC2(カーネル空間)
ユーザプロセス
ユーザプロセス
…
ユーザ空間
ユーザプロセス
ユーザプロセス
… …
● VMと違って、起動するプロセスはホストOS上で直接起動するため、VMよりオーバヘッドが少
なく軽量。
● 通常のプロセスと違ってプロセスの一部がグループ化されてて(Linuxカーネルのcgoupとか使っ
て)、グループ外から隔離されたユーザ空間で動作する。
※chrootに似てるけどchrootはネットワークやプロセスの制限はできない。
● 既に起動済みのOSの上で動作するのでプロビジョニングも高速。
コンテナの実装いろいろ
● LXC(Linux Container)
Linuxカーネル2.6.29から利用可能になったcgroupを利用した
コンテナ。
● Herokuのdyno
Herokuのアプリケーションが実行されるプラットフォーム。
LXCをベースにしたコンテナ。
● Docker
多分一番シェアがあるコンテナ。
初期はLXCに依存していたが、現在はlibcontainerに刷新。
Amazon ECSとは?
Amazon EC2 Container Service
EC2クラスタ上にDockerのコンテナ群を
管理できるサービス
EC2
・・
EC2
・・
EC2
・・
ECS Cluster
ローカルマシンや1台のサーバ上でDockerコンテナを起動するのは簡単で
運用もシンプルだけど、複数のサーバでの運用や特定のスペックを必要と
するコンテナの管理をしようとすると専用のオーケストレーションツール
が必要になる。
→Amazon ECSで簡単管理!
ECSでできること
ECSでできること
● Dockerサポート
Amazon ECS-Optimized Amazon Linux AMIを利用するこ
とでDockerコンテナの環境を自前で用意する必要無し。
● マネージドクラスタ
クラスタ管理をするのに専用のオーケストレーションツー
ルは不要で、ECSが全てのクラスタを管理。
● タスクの定義
使用するDockerイメージや、メモリ量、CPUユニット、デ
ータボリューム等を定義したタスクをJSONで定義。
● プログラマブルなAPI
他のAWSサービスと同様APIを使ってECSの管理が可能。
ECSでできること
● スケジューリング
リソースの使用状況(CPU、メモリとか)に応じてコ
ンテナを配置するスケジューラが存在。
● コンテナの自動復旧
コンテナに異常が発生しても、指定された数のコンテ
ナが常時稼働するよう自動調整。
※タスクに定義されたリソース消費量を超えるとkillされたりするので。
● コンテナのロードバランシング
ELBと合わせてトラフィックをコンテナ全体に分散。
タスク定義でELBを指定するとスケジューラによって
自動的にコンテナがELBに追加・削除される。
(Auto Scaleする訳ではない)
ECSでできること
● コンテナの自動アップデート
タスク定義を新しいバージョンにするとスケジューラ
が自動的に更新されたイメージを展開。
● モニタリング
タスク、サービス、クラスタ毎にタスクのCPUとメモ
リをCloudWatchでモニタニング可能。
● リポジトリのサポート
Docker Hub以外に任意のプライベートDockerレジス
トリをサポート。またAmazon EC2 Container
Registryが使えるようになるはず。
(EC2 Container Regstryが年内リリースのはず)
ECSのコンポーネント
ECS Cluster
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
Task Definition Service
EC2 Container
Service
ECS Cluster
【ECS Cluster】
1つ以上のコンテナインスタンスを集約したグ
ループ
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
ECS Cluster
Task Definition Service
EC2 Container
Service
Container Instance
【ECS Container Instance】
● ECSクラスタに登録されているEC2インスタンス。
● コンテナインスタンス用のAMIを使って起動する
ECSクラスタを指定して起動するか、AutoScallingによって
起動。
● 起動するとデフォルトでDockerとECS Agentが起動し、
クラスタに登録される。
● 課金も基本的にはEC2の使用料。
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
ECS Cluster
Task Definition Service
EC2 Container
Service
ECS Agent
【ECS Agent】
● ECSインスタンス上で稼働するAgent。
● サポートしてるのはEC2インスタンスのみなので、ローカルマ
シンとかにインストールしてもクラスタに参加はできない。
● クラスタにインスタンスを参加させたり、クラスタで定義され
たタスクやサービスをインスタンス上にコンテナを起動して実
行する。
● Agent自体もDocker ImageでDocker Hub上で公開されてる。
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
ECS Cluster
Task Definition Service
EC2 Container
Service
Task Definition
【Task Definition】
以下のようなECSコンテナとして動作する
アプリケーションの定義を設定。
● 使用するDockerイメージ
● 各コンテナで使用するCPUユニット、メモリ量
● コンテナインスタンスとのポートマッピング
● コンテナ内のデータ領域のマウントポイント
● リンクするコンテナ
● 永続化するデータボリューム
● etc..
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
ECS Cluster
Task Definition Service
EC2 Container
Service
Service
【Service】
バッチジョブのように動作ののち停止するタイプ
のタスクとはことなり、ずっと起動するアプリケ
ーションの場合、Serviceとして作成。
Desired number of Tasksで設定した数のコンテナ
が常時起動する状態になる。
Container Inctance
EC2
ECS Agent
Task
container
container
Container Inctance
EC2
ECS Agent
Task
container
container
・
・
・
ECS Cluster
Task Definition Service
EC2 Container
Service
Task
【Task】
Task Definitionを元にコンテナインスタンスで起動
するコンテナアプリケーション。
1つのTaskDefinitionから複数のTaskが生成される。
CI環境でECSを利用
CI環境でよくある問題
● Slow Test
コードベースが大きくなると、それに合わせてテストコー
ドも肥大化してテストの実行にかかる時間が増えていく。
テストが完了するのに20,30分かかると気軽にテストやデ
プロイしにくい。
● カオスな実行環境
プロジェクトによって言語や実行環境が異なるとテスト環
境も異なる。
複数のプロジェクトのCIを同じ環境で実行しようとすると
バージョンの異なるソフトウェアのインストールや管理が
ツラい。
そんな悩みを
コンテナで解決!
Jenkins meets Docker
ECSのDockerコンテナをSlaveノードとして、Jenkinsの各ジョブを実行できる
Plugin
※現状、リージョンの選択ができない(us-east-1のみ)ので東京リージョンで
稼働させたい場合は、リージョン指定できるようフォークしたので↓からどうぞ。
https://github.com/azuchi/amazon-ecs-plugin/tree/support-region-setting
Jenkinsのシステム設定
EC2 Container Service
Create Task Definition
Task Definitionの作成とRun Taskを行えるパーミッ
ションのアクセスキーとシークレットアクセスキー
を設定。
ジョブの設定
ジョブの実行ノードをシステム設定画面で設定した
スレーブテンプレートを指定するだけ。
ジョブを実行すると
EC2 Container Service
Run Task
container
注意点
● リポジトリへアクセスする際の鍵
○ コンテナインスタンスに配置し鍵を共有
コンテナインスタンス起動時のuser dataでコンテナインスタンス上
に鍵を配置し、コンテナからはその鍵を参照する。
○ ビルドパイプラインの有効利用
リポジトリからソースを取得するだけのJobを作成し、成果物を保
存→下流ジョブでコンテナを起動し、成果物(ソース)をコピーし
てジョブ実行。
● コンテナのリンクは設定できない
ECSのTask Definitionではリンクするコンテナを設定できるけど、
amazon-ecs-pluginではスレーブの実行に使えるのは単一コンテナのみ。
まとめ
● 並列実行でテストスピード向上
各コンテナは独立して動作するのでDBまで含めたテストの
並列実行も簡単に。
● クリーンな実行環境
各ジョブの実行環境をDocker Imageで提供することで
Jenkinsのマスターノードへの必要なソフトウェアのインス
トールが不要に。
● テストリソースはECSがよろしく管理
ECSに適切なスペックのコンテナインスタンスを登録して
おけば、テスト実行時のコンテナの配備や調整といったメ
ンドクサイことをECSが肩代わり。

Jenkinsとamazon ecsで コンテナCI