ようへいの日々精進XP

よかろうもん

Amazon ECS と AWS Application Load Balancer の組み合わせを試しているメモ

ども、ECS は最近全然触れていないかっぱです。

追記

AWS CLI のでも操作してみた。

inokara.hateblo.jp

tl;dr

先日、AWS Application Load Balancer がリリースされて、Amazon ECS の Dynamic Port Mapping にも対応されたとのことで、ECS と 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 を指定することが出来る(ターゲットグループが生成される)

f:id:inokara:20160813103607p:plain

f:id:inokara:20160813103618p:plain

ecsServiceRole という IAM Role が付与される。この Role には AmazonEC2ContainerServiceRole というマネジメントポリシーが適用されている。

f:id:inokara:20160813103632p:plain

f:id:inokara:20160813103648p:plain

f:id:inokara:20160813103833p:plain

  • 既存の ECS Service には追加出来ない?(Service 作成時のみ ELB 定義が出来るようだ)
  • Container Instance に付ける Security Group は ALB に付与した Security Group から Container の Dynamic Port にアクセス出来るようなルールを定義しておく
source: public-access
protocol: TCP
port range: 0-65535

f:id:inokara:20160813101535p:plain

  • ルーティングのルールはロードバランサーの一覧にて該当の ALB を指定してリスナーで修正する

f:id:inokara:20160813102651p:plain

/* としておくとクライアントのリクエストをそのままバックエンドに流すような挙動になった。

  • 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% 

まとまってないけどまとめ

  • まさに産業革命
  • Dynamic Port Mapping やりくりする為に HAProxy とか入れなくても良くなったのは嬉しい
  • 後で CLI でもやってみる