気の向くままに書き綴る

勉強会参加したメモや日々の思ったことのメモ等

docker-compose.yml からwercker経由で Amazon ECS 上にコンテナを展開する

先日、AWS New Service Meet upに参加してきた。※まとめ資料

AWS ECSのサービスを聴きながら、手元で利用しているdocker-composeをそのまま本番に反映できたら、

手元の環境から本番環境まで差異がほぼなくなってすごく良いんじゃないかなと思って以下のツイートをした。

 

 

werckerを使ってやってみた。

(こっそりその日にdocker-compose.ymlを AWS ECS 用のjson形式に変換してくれるcontainer-transformを教えてもらい、試した系の記事です)

※ container-transformはAWSサポート対象外

 

pip install で以下のモジュールをインストール

awscliの設定について

 

事前準備

インスタンス、IAMのロール、Advanced Detailsの設定などキャプチャがあってわかりやすいのでこちらをご参照

 

docker-compose.ymlを用意。

$ cat docker-compose.yml

base:
  image: ubuntu 
  cpu_shares: 512
  mem_limit: 536870912b
  command: echo "hello world!"
  • 試しにjson形式に変換してみる
$ cat docker-compose.yml | container-transform 
[
    {
        "memory": 512,
        "cpu": 512,
        "image": "ubuntu",
        "command": [
            "echo",
            ""hello",
            "world!""
        ],
        "essential": true,
        "name": "base"
    }
]

このように、json形式に変換してくれる。

  • 上のjson形式をtask-definitionに登録。
  • AWS ECS は、実行するDockerコンテナをタスクというグループ単位で管理している。
  • register-task-definitionはそのタスクを登録する。
  • つまり、docker-compose.ymlに書かいた内容を登録する。
$ aws ecs register-task-definition --family your_task_definition --container-definitions "$(cat docker-compose.yml | container-transform)"
  • register-task-definition で登録したタスクを実行するにはrun-taskを使う。
  • --countを使うとdocker-composeのscaleみたいなことが出来る。
  • インスタンスのリソースが足りない場合は、起動できないって返ってくる。
$ aws ecs run-task --cluster your_cluster_name --task-definition your_task_definition_name

werckerからECSのコンテナを起動

f:id:koudaiii:20150428204958p:plain

上のコマンドを覚えて叩くのが大変なので、wercker のboxとstepを作った。

git push やGithub上でリポジトリを更新した際にAWS ECS上にコンテナを展開させることが出来る。

 

  • 処理の流れ

f:id:koudaiii:20150428213613p:plain

 

以下は簡単なSample。

Deploy設定例(wercker step)

上記の事前準備行った上で、

  • wercker.ymlを用意
  • werckerのdeploy piplineに値($AWS~~~と書かれている部分)を設定

 

sampleで作成したもの

例:wercker.yml

box: wercker/python
build:
  steps:
    - script:
        name: Hello World
        code: echo "Hello World"
deploy:
  steps:
    - koudaiii/install-container-transform:
        key: $AWS_KEY
        secret: $AWS_SECRET
        region: $AWS_REGION
        cluster: $AWS_ECS_CLUSTER
        definition: $AWS_ECS_DEFINITION
        count: $AWS_ECS_COUNT
  • werckerのDeploy piplineの設定箇所

f:id:koudaiii:20150428215353p:plain

 

 

CI用の設定例(wercker box)

同じようにの事前準備をした上で、

  • wercker.ymlを用意
  • werckerのpipline(上のDeployの設定とは違う場所)で値($WERCKER~~~と書かれている部分)を設定

 

sampleで作成したもの


例:wercker.yml

box: koudaiii/install-container-transform
build:
  steps:
    - script:
        name: Configuring based on parameters..
        code: |
          aws configure set aws_access_key_id $WERCKER_INSTALL_CONTAINER_TRANSFORM_KEY
          aws configure set aws_secret_access_key $WERCKER_INSTALL_CONTAINER_TRANSFORM_SECRET
          aws configure set default.region $WERCKER_INSTALL_CONTAINER_TRANSFORM_REGION
    - script:
        name: register task definition
        code: |
          aws ecs register-task-definition --family wercker --container-definitions "$(cat docker-compose.yml | container-transform)"
    - script:
        name: create run task
        code: |
          aws ecs run-task --cluster $WERCKER_INSTALL_CONTAINER_TRANSFORM_CLUSTER --task-definition wercker
    - script:
        name: Done.
  • werckerのpiplineの設定箇所

f:id:koudaiii:20150428215429p:plain

 

ここまで、書いて一旦終了。

 

まとめ

CI側について

これをそのままcommandをrspecコマンドに書き変えると、jsonが返っくるだけで、これ、、必ずテストがgreenになる世の中になりそうやで。。。 

また、CIを一気に回しまくるとrun-taskの実行の際に、インスタンスのリソースが足りずコンテナの展開ができないなどの事象が発生する。

もう一工夫が必要。

 

Deploy側について

コンテナの展開だけじゃなく、最終的に以下の内容も含めてwercker-stepで実装したらblue-green deploymentに近いことが出来そう。

これでDockerのホスト側の面倒を減らすことが出来るのでは?と妄想している。

  • 新規にインスタンスの起動(リソース確保のため)
  • タスクUpdateで切替

出来上がりのイメージ図

※ 実際にawscliからイメージ図の作業が出来るかは不明です><

 
現時点の課題

docker-compose.ymlで書いた構成がECSでインスタンスを超えてスケーリングしていく未来にならないかなぁー。

最初に書いたこのツイートについて、 いろいろ触ってみて現時点では、以下の点からまだまだ解決すべきものがいっぱいありそう。

  • AWS ECSがdocker-composeをサポートしていない点
  • container-transformがAWSでサポートしていない点
  • docker-compose自体がそもそもproductionの利用を推奨(以下サイト抜粋)していない点

Docker Compose Overview Compose is a tool for defining and running complex applications with Docker. With Compose, you define a multi-container application in a single file, then spin your application up in a single command which does everything that needs to be done to get it running.

Compose is great for development environments, staging servers, and CI. We don't recommend that you use it in production yet.

 

今後何らかの方法で解決していけば、

docker-composeでアプリの構成を管理しつつ、

local - development - QA/Staging - production 間の環境差異がさらになくなる。

 

それ以外に、コンテナならではの以下のようなことも出来る。

  • CI系のサービスでテストが増えて遅くなってしまっている場合に、コンテナで並列処理
  • エンジニアじゃない方(local上に環境を作って確認するのが難しい方)でちょっと文言とかCSSを変更したい場合に、直接Github上で編集してcommitしたらコンテナが起動してWeb上で確認

 

今後、どのようなUpdateが入るか楽しみです!!