woshidan's blog

そんなことよりコードにダイブ。

ECSのタスク、サービス、クラスタ、コンテナインスタンスの意味についてまとめました

ECSのタスク、サービス、クラスタ... といった言葉の意味がいまいちよくわからなかったので、それぞれの言葉が指すインスタンスを作成するときに何を設定するかに基づいてまとめたメモです。

もとの説明をいい感じに引用して... とかの時間がなかったのでひとまずポスト。

クラスタ

  • ネットワークとか、リソース管理の仕方(EC2使う or Fargate*1, EC2の調達の仕方)とか*2
  • リソースの管理の仕方 => クラスタに属する EC2 の設定も管理している*3。特定のインスタンスタイプのEC2を決まった台数、特定のネットワーク内に調達することに関心がある*4

ECSのコンテナインスタンス

タスク定義

  • クラスタが所定の台数Dockerの動くEC2のインスタンスを確保してくれているはずなので、そこにdocker-composeで投げるdocker-compose設定ファイル的なもの*6*7
  • docker-composeの内容を書く = その内容は docker-compose 投げた 先のEC2インスタンスがどういう性能を持っていないといけないか知っている
    • タスク配置の制約事項*8 => データベースのコンテナは複数availavility zoneに配置されるようにしてくれませんか? このタスクはちょっとした雑用だけなので安いEC2インスタンスタイプ使ってくれませんか?
    • タスクサイズ*9 => 画像変換処理のタスクはCPU食うのでたくさんCPU持ってるEC2インスタンスで実行するようにしてくれませんか?
    • サービスを利用してタスクの実行スケジュールを管理することで、並行していくつ稼働するのか、といった管理も可能*10

ECSタスクのスケジューリング *11

  • 長期実行するステートレスサービスおよびアプリケーション用(要するにrailsのフロントとか)を常に指定した台数起動したい => サービススケジューラを使う
    • サービススケジューラがタスクの実行台数を管理する単位がサービス
    • service taskはサービスで管理されてるタスク
    • タスク = docker-composeで動く一連のコンテナの単位 の数をスケーリング != EC2インスタンスの数(こっちに対して課金)をスケーリング
  • その場で実行する => 単発で実行されるバッチジョブとか RunTask

*1:この起動タイプはタスクを作成するときにも設定できる

*2:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_clusters.html#cluster_concepts

*3:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/create_cluster.html

*4:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/scale_cluster.html 2015 年 11月24日以降に作成したクラスターなら、 AWS CloudFormation スタックに関連付けた Auto Scaling グループを作成すると管理画面から何台起動させるか、といったことが変更できる

*5:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_agent.html AMIで指定する単位だからほぼEC2だろう

*6:クラスタが何台分、と決めている枠の中でタスクを割り振る。クラスタの中にコンテナインスタスタンスが5台起動していて、タスクが3つなら、そのタスクで定義されたプロセスは3つしか動かないし、逆にクラスタの中にコンテナインスタンスが3台でタスクが5つなら複数のタスクが動くコンテナインスタンスが出てくる?

*7:同じタスク定義の中で定義されているコンテナは必ず同じインスタンスで動く http://www.slideshare.net/AmazonWebServicesJapan/aws-blackbelt-2015-ecs の36ページ

*8:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html#constraints (インスタンスタイプの指定はdockerで元になるOSが入ったimageを指定イメージに近い)

*9:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size

*10:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_services.html

*11:https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_services.html