ども、ECS は最近全然触れていないかっぱです。
追記
tl;dr
先日、AWS Application Load Balancer がリリースされて、Amazon ECS の Dynamic Port Mapping にも対応されたとのことで、ECS と Application Load Balancer の組み合わせを試行錯誤している。内容な認識等に誤りがあるかもしれないのでご容赦下さい。
- https://aws.amazon.com/jp/blogs/aws/powerful-aws-platform-features-now-for-containers/
- https://aws.amazon.com/jp/blogs/aws/new-aws-application-load-balancer/
試した環境
手元の環境
% sw_vers ProductName: Mac OS X ProductVersion: 10.11.6 BuildVersion: 15G24b % ecs-cli --version ecs-cli version 0.4.2 (9159726)
ECS
- amzn-ami-2016.03.f-amazon-ecs-optimized (ami-ed26e78c)
- ECS のクラスタは ecs-cli で作成済み
- マネジメントコンソールより ECS の Service を作成していく
- Service 内で起動する Task はコンテナ自身のホスト名を返す Sinatra アプリケーション(コンテナ内で 4567 ポートで Listen する)
memo
以下、殴り書き。(後で整理するかも)
- 事前に Application Load Balancer を作っておく(以後、Application Load Balancer を ALB と記す)
- ALB 作成の際にはターゲットグループを一つ作る必要がある(ターゲットにインスタンスを登録する必要は無い)
ターゲットグループを消す時にはALB を消してからターゲットグループを削除した方が良さそう(リスナーの定義を先に消せば良い)- 下図のように ECS の Service 作成時に ALB を指定することが出来る(ターゲットグループが生成される)
ecsServiceRole という IAM Role が付与される。この Role には AmazonEC2ContainerServiceRole というマネジメントポリシーが適用されている。
- 既存の ECS Service には追加出来ない?(Service 作成時のみ ELB 定義が出来るようだ)
- Container Instance に付ける Security Group は ALB に付与した Security Group から Container の Dynamic Port にアクセス出来るようなルールを定義しておく
source: public-access protocol: TCP port range: 0-65535
- ALB からはコンテナはインスタンスとして見えている
- ルーティングのルールはロードバランサーの一覧にて該当の ALB を指定してリスナーで修正する
/*
としておくとクライアントのリクエストをそのままバックエンドに流すような挙動になった。
- ALB に登録されたコンテナにアクセスしてみる
% curl -v alb-ecs-demo-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/hostname * Trying 54.xx.xxx.xxx... * Connected to alb-ecs-demo-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com (54.xx.xxx.xxx) port 80 (#0) > GET /hostname HTTP/1.1 > Host: alb-ecs-demo-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com > User-Agent: curl/7.43.0 > Accept: */* > < HTTP/1.1 200 OK < Date: Sat, 13 Aug 2016 01:39:01 GMT < Content-Type: text/html;charset=utf-8 < Content-Length: 12 < Connection: keep-alive < X-XSS-Protection: 1; mode=block < X-Content-Type-Options: nosniff < X-Frame-Options: SAMEORIGIN < * Connection #0 to host alb-ecs-demo-xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com left intact 59294f32f412
- 当たり前だのクラッカーだけど Task のスケールアウトにも追随してくれる
# # Task を 3 つに増やした後にアクセス # % curl alb-ecs-demo-1930795025.ap-northeast-1.elb.amazonaws.com/hostname 79a796b62150% % curl alb-ecs-demo-1930795025.ap-northeast-1.elb.amazonaws.com/hostname 68cb8177a441% % curl alb-ecs-demo-1930795025.ap-northeast-1.elb.amazonaws.com/hostname 59294f32f412%