ECS

ECS (EC2 Container Service)

Cluster (EC2 instance集合体)を管理した上で、スケジューリングして docker run の手間を省いていくれる Docker container 群管理サービス。

  1. IAM role 作成
  2. ECS cluster 作成
  3. container instance 作成
    3-1. ecs-agent 最適化済みの AmazonLinux AMI を起動 (container instance の登録) すると Cluster に自動アタッチ
  4. task 定義 (docker pull)
    4-1. 1つ以上の container を起動するための定義を記述
    4-2. 同一Task definition 内の container 間は通信が可能
    4-3. revision 管理されている
  5. task 実行 (docker run)

Task Definition は複数の container をセットにしたものであり、同じ Task Definition に含まれる container は同一 node で動作する。継続運用の観点から Service が存在し、どのTask Definition を幾つ起動させ、どのELB/ALBと関連しているかを設定可能。Service は指定した Task Definition 数を維持する。Service は関連LB に対し EC2 node を自動登録する。Task終了時、自動で LB をデタッチする。

container instance

  • ECS Agent
  • Docker container で動く
  • go言語で記述されている

Service

  • Task definition の起動数を定義する。
  • 機能単位。
  • resource が競合する container は同一 instance で起動しない。
  • Service として起動している Docker contaner へ新しくデプロイする場合、Task definition の image を更新 -> Task definition を更新という流れになるが、新 container は ポート 80 を利用しようとして古い container と競合するため、起動できずリトライが繰り返される
    • deployment_minimum_healthy_percent=0, maximum=100 にすることでinstance1台でport番号を考慮せず新バージョンのコンテナを動かせる

Task

instance 上で実行されている container。サービスの分類。API Task, Front task等。

cluster

  • task が実行される instance 群。

メリット

  • immutable image(作成後変更不可, stateless(scalabilityの観点から各interactionでrequestに応えられる)
  • 開発速度の向上
  • ALB との併用で動的ポートマッピング可能
  • Service Auto Scaling で AWS へ Autoscaling を任せられる
  • Task 単位で IAM role を利用して権限管理
  • CloudWatch で Cluster のメトリクスも扱える
  • Docker container の起動方法、連携方法を定義可能
  • Docker container の起動状態を確認、変更可能
  • 古い container から新しい container へのコンテナへ Blue Green Deployment が可能

デメリット

  • statefull なシステムには向かない
  • ファイルは揮発性
  • ディスクI/Oが遅い
  • host毎ではなくtask毎にリソースを食う
  • Container に task 定義が当たらないときなど Management console にエラーが吐かれるが、何のエラーか分かり辛い。links 連携されていない場合、STOPPED (CannotCreateContainerError: API error 等。

ecs-cli のインストール

$ sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-darwin-amd64-latest
$ sudo chmod +x /usr/local/bin/ecs-cli

$ ecs-cli configure --region ap-northeast-1 --access-key xxx --secret-key zzz --cluster dev-001

Cruster 起動

ECS Cluster に所属させる EC2 instance の起動を行う前に、instance 内の ECS Container Agent が ECS API へのアクセス権限を持っているか (IAM Role) や Security Group (アクセスコントロール) を適切に設定する必要がある。


// Cluster の設定 $ ecs-cli configure --region ap-northeast-1 --cluster dev-001 // コンテナの起動 $ ecs-cli up --keypair xxx --capability-iam --instance-type t2.medium --security-group sg-xxx --vpc vpc-xxx --subnets subnet-xxx --force --no-associate-public-ip-address --region ap-northeast-1 --size 1 // compose.yml の反映 $ ecs-cli compose --file docker-compose.yml up // 起動確認 $ ecs-cli ps // service の削除 $ ecs-cli compose --file ./docker-compose.yml service rm // Cluster の停止 $ ecs-cli down --force $ ecs-cli down --force --cluster dev-001 // scaling $ ecs-cli scale --capability-iam --size 2

task 定義

ecs-cli compose コマンドによるタスク定義。

$ ecs-cli compose --project-name hello-world --file hello-world.yml create

IAM Policy

Amazon ECS コンテナインスタンスの IAM ロール

http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/launch_container_instance.html

ECR

  • 少ない手順で private repositry を作成可能
  • IAM policy でアクセス制御可能
  • 同 region 内の ECR と EC2 データ転送量無料

トラブルシューティング

Amazon ECS のトラブルシューティング

参考サイト

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です