ECS on EC2 やってみた

aws
ECS とは

ECS(Elastic Container Service)とは、なんでしょうか?

今まで webサービスを公開するときは、EC2 を立ち上げてやっていたと思うのですが、

ひとことで言えば、docker containerで webサービスを公開しよう、というのが ECS ですね。

container の実行環境

ECS では container の実行環境が2種類あります。

・従来の EC2
・マネージドサービスの fargate

これを組み合わせて

ECS on EC2
ECS on fargate
ECS on EC2 and fargate (混在もできます)

概念図

ECS の概念は複雑なので、図が欲しいところですね。

と思って探したら、ちょうどよい図を公開されている方がいました。

Amazon EC2 Container Service(ECS)の概念整理
https://qiita.com/NewGyu/items/9597ed2eda763bd504d7

ECS on EC2

通常のプロダクションのサービスでは

ロードバランサを使うと思うんですが、

ECS では、ECS のサービスにロードバランサを設定します。

ロードバランサ下に、EC2 のインスタンスが auto scaling で増減しながらぶら下がっているんですが、

基本、1 コンテナインスタンス(=EC2 インスタンスに)に、1 コンテナ(=ECS のタスク) なんですが、

どうやら、1コンテナインスタンスに複数の同一コンテナを持つこともできるようです(後述)

ASG = Auto Scaling Group

REPLICA or DAEMON

サービスを追加するときに、REPLICA か DAEMON を選ぶように言われます。

REPLICA
クラスター全体で必要なタスクの実行数を指定する。クラスター全体に対して何個のタスクを実行するか。

DAEMON
ホストの増減に合わせて、タスクの実行数を制御する。EC2のコンテナ1つに対して1つのコンテナ。

DAEMON はわかりやすいですね。

DAEMON の場合、コンテナインスタンスを増やすと連動してコンテナも増えるようです。

REPLICA の場合、例えばタスク数を2に設定したとしてもコンテナインスタンスが1つしかなければ、1つのタスクしか起動しません(例外あり、後述)。

コンテナインスタンスが3つあったとすれば、2つのコンテナが起動するだけです(1コンテナインスタンスに1コンテナが動く、よって1つのコンテナインスタンスが余る)。

Amazon ECS にデーモンスケジューリングが追加 – Jun 12, 2018
https://aws.amazon.com/jp/about-aws/whats-new/2018/06/amazon-ecs-adds-daemon-scheduling

Amazon ECS の DAEMONタイプ
https://qiita.com/leomaro7/items/3b928b6eea7fc333f460

1コンテナインスタンス = 1コンテナ?

例えば80番ポートを使うコンテナがあるとしましょう。

1つのコンテナインスタンスで、同時に2つ以上のコンテナが80番ポートを使うことはできないので、普通は1コンテナインスタンス = 1コンテナになります。

ただし、違うポートを使えばできます。

あるコンテナインスタンにおいて、

webサービスコンテナ1, 80番ポート -> コンテナインスタンスの1500番ポート
webサービスコンテナ2, 80番ポート -> コンテナインスタンスの1600番ポート

のように、コンテナインスタンス側の違うポートにマッピングします。

ロードバランサから見れば、外部からの80番ポートアクセスを、このコンテナインスタンスの1500番と1600番に振り分ければよいだけです。

これをいちいち設定するのは面倒なので、ALB+ECSに動的ポートマッピングという仕組みがあります。

以下の記事によると、コンテナ定義を作るときに以下のように、ホストポートを0に設定すると、動的マッピングになるようです。

ポートマッピング
紐付けを行うEC2ホストのポートと、コンテナ側のポートを指定します。ホストポートを0にすることで、エフェメラルポートが動的に割り当てられます。

今後は ECS on EC2 よりも ECS on Fargate が主流になり、fargateではこのような動的マッピングのテクニックは必要なくなりますが(ECSが裏側でやってくれるので)、EC2を使う場合は覚えておきたいテクニックですね。

Dockerコンテナの作成からECSの動的ポート+ALBでロードバランスするまで【cloudpack大阪ブログ】
https://qiita.com/taishin/items/eb759a8ec0c583fc5ebd

Amazon ECSのELB構成パターンまとめ(ALB対応) – DevelopersIO
https://dev.classmethod.jp/articles/ecs-elb-recipes

強力なAWSプラットフォームの特徴、コンテナ向けに
https://aws.amazon.com/jp/blogs/news/powerful-aws-platform-features-now-for-containers

ローリングアップデート

ローリングアップデートは、

サービスの更新で、新しいデプロイの強制をチェックするとできる。

Amazon ECSへのDockerイメージのデプロイ方法(Latest運用簡易版)
http://honeplus.blog50.fc2.com/blog-entry-221.html

ALB + 2台のDAEMONタイプのコンテナインスタンスでローリングアップデートしたら、

数十秒間(けっこう長い!)
503 Service Temporarily Unavailable
が出ていました。

ローリングアップデートでは、本来ダウンタイムが発生しないはずですが、おかしいです。

ちょっと調査中です。

ALB + ECSの動的ポートマッピングでローリングアップデートをする
https://qiita.com/mochizuki-pg/items/138de08e7a9ea03f241d

ECSでローリングアップデートを行う場合
Desired countと、Minimum percent、Maximum percentを
設定する必要がある。

その他関連リンク

ESC もいろいろアップデートされているようなので、もう少し理解してから整理しようと思います。

Amazon ECS クラスターの Auto Scaling を深く探る
https://aws.amazon.com/jp/blogs/news/deep-dive-on-amazon-ecs-cluster-auto-scaling

AWS ECSを1インスタンス1タスク構成でスケールするための工夫
https://devlog.atlas.jp/2021/01/22/3503

ロマサガRSの大規模負荷を処理するAmazon ECS & Docker運用知見
https://pages.awscloud.com/rs/112-TZM-766/images/I3-04.pdf

新機能 – AWS ECS Cluster Auto ScalingによるECSクラスターの自動スケーリング
https://aws.amazon.com/jp/blogs/news/aws-ecs-cluster-auto-scaling-is-now-generally-available

AWS ECS Cluster Auto ScalingがGAになったのでやってみた – 2019.12.04
https://dev.classmethod.jp/articles/aws-ecs-cluster-auto-scaling

Amazon ECS がコンテナ単位でのスワップ領域パラメータのサポートを開始 – Aug 19, 2019
https://aws.amazon.com/jp/about-aws/whats-new/2019/08/amazon-ecs-now-supports-per-container-swap-space-parameters

Amazon ECSを安定運用するためにやっていること
コンテナインスタンス、ログ、モニタリングにおける工夫 – 2018年11月28日
https://logmi.jp/tech/articles/320723

Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法 – 27 JAN, 2017
https://aws.amazon.com/jp/blogs/news/how-to-automate-container-instance-draining-in-amazon-ecs

コメント

タイトルとURLをコピーしました