Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ECSの辛いところ
Search
YAMASAKI Masahide
December 19, 2018
3
2.6k
ECSの辛いところ
ECSを使ってJob Observerパターンを実践した時の苦労話
YAMASAKI Masahide
December 19, 2018
Tweet
Share
More Decks by YAMASAKI Masahide
See All by YAMASAKI Masahide
Macのすすめ
masahide
0
81
SSH!SSH!
masahide
0
220
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Optimizing for Happiness
mojombo
376
70k
How STYLIGHT went responsive
nonsquared
95
5.2k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.4k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
What's new in Ruby 2.0
geeforr
343
31k
Transcript
ECSの辛いところ
自己紹介 @yamasaki0 github.com/masahide 職: インフラ屋 趣味: golang 好きなAWSサービス: SQS, S3,
KMS
ECSとは Amazon Elastic Container Service (Amazon ECS) は、クラスターで Docker コンテ
ナを簡単に実行、停止、管理できる非常にス ケーラブルで高速なコンテナ管理サービスで す。 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html
ECSに期待するもの(理想) https://www.youtube.com/watch?v=vPjCL3BXTSw
ECSに期待するもの(理想) https://www.youtube.com/watch?v=vPjCL3BXTSw Amazon ECS: コンテナの自動スケーリング(日本語字幕) ECSのデベロッパーアドボケイトの方曰く 「ECSでは全てが自動で処理されるため まったく手間がかかりません」
実現したい処理 Job Observerパターン http://aws.clouddesignpattern.org/index.php/CDP:Job_Observerパターン キューに積み上る メッセージ数に応じて スケーリング SQS ECS Claster
Instance/Task
• スケーリング周り • ECS側の問題 ECSのつらみ(現実)
スケーリング周りが辛い • タスク数とインスタンス数の制御 • ドレイニング
本日伝えたいこと! • デーモンサービススケジューラは良い • Fargateは良い • 自分でAutoScaling APIを叩く方がマシ
タスク数と インスタンス数の制御
タスクとは • 複数のコンテナを1つにまとめたもの
タスクとインスタンスの関係 Task Task Task Task ECS Cluster
ECSのスケールの制御はタスク数 Task Task Task Task ECS Cluster
料金はEC2インスタンス数で決まる ECS Cluster
タスク数とインスタンス数の制御担当 タスク数 ECS インスタンス数 Auto Scaling
AWSが言うお手軽ECS AutoScaling https://aws.amazon.com/jp/blogs/news/automatic-scaling-with-amazon-ecs/ Amazon ECS で Auto Scaling
AWSが言うお手軽ECS AutoScaling https://aws.amazon.com/jp/blogs/news/automatic-scaling-with-amazon-ecs/ Amazon ECS で Auto Scaling タスク数をアラームで制御
AWSが言うお手軽ECS AutoScaling https://aws.amazon.com/jp/blogs/news/automatic-scaling-with-amazon-ecs/ Amazon ECS で Auto Scaling インスタンス数をアラームで制御
2種類のスケールイン/アウトの閾値 合計4つの閾値調整が必要 • タスク数スケールアウト/イン • インスタンス数スケールアウト/イン
インスタンスの起動は遅い タスクの起動は速い • インスタンス数は常に余裕が必要 • インスタンスの起動が遅れると ◦ タスク渋滞が発生
タスク渋滞対応の難しさ • スケールアウトポリシーを強める • インスタンス過多 • スケールインポリシーに引っかかりインスタンス が少なくなる • → 再びタスク渋滞へ
そこで現れた救世主
None
Fargate • インスタンスの管理から解放される • 課金の単位がタスク
え!? https://aws.amazon.com/jp/fargate/ > Fargate を使用すると、数秒で数万個のコンテナ を起動して、最もミッションクリティカルなアプリケー ションを実行するために簡単にスケールできます。
欠点 ちょっと高い https://dev.classmethod.jp/cloud/aws/aws-fargate-pricing/ クラスメソッドさんが試算してくれてます。 (1年前だけど) >$0.0033816 * 60 = $0.202896/hourとなります。
m4.large EC2の料金($0.1/hour)
現実的なworkaround
デーモンスケジューリング https://aws.amazon.com/jp/about-aws/whats-new/2018/06/amazon-ecs-adds-da emon-scheduling/ https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_service s.html#service_scheduler 1インスタンスに1タスクだけ起動する設定 • タスクを増やしたい場合はインスタンスを増やすだけ • タスクを減らしたい時はインスタすを減らすだけ
デーモンスケジューリング インスタンス数の調整でだけで よくなる!
デーモンスケジューリングで実現! Job Observerパターン http://aws.clouddesignpattern.org/index.php/CDP:Job_Observer パターン キューに積み上る メッセージ数に応じて スケーリング SQS ECS
Claster Instance/Task
オレオレベストプラクティス • デーモンスケジューリングを使う • 1つのECSクラスタに1種類のタスク • 1タスクがインスタンスリソースを使い切るように
ドレイニング
ECS スケールインの問題 • AutoScalingによるインスタンス停止はECSのタ スクの状態を考慮しない ◦ https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-instance-termination.html# default-termination-policy ◦ 処理中でもお構い無し無慈悲なTerminate
ECSのドレイニングとは AutoScalingでスケールインする際に、安 全にタスクを停止させる (graceful- stopのようなもの)
ドレイニングを実現するための構成 https://aws.amazon.com/jp/blogs/news/how-to-automate-container-instance-draining-in-amazon-ecs/ Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法
ECS ドレイニング用 Lambda https://github.com/aws-samples/ecs-cid-sample/blob/master/cform/ecs.yaml#L421-L490 Pythonのサンプルコードがある
ECS ドレイニング用 Lambda https://github.com/aws-samples/ecs-cid-sample/blob/master/cform/ecs.yaml#L421-L490 サンプルコードがある ただ、落とし穴があって・・
サンプルLambdaの落とし穴 Lambda内でAPIスロットリング によりエラーが発生
サンプルLambdaの落とし穴 Lambda内でAPIスロットリング によりエラーが発生 エクスポネンシャルバックオフ https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html
エクスポネンシャルバックオフ https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html • API呼び出しのリトライ処理 • 指数関数的にリトライ間隔を調整 • 実はほとんどのAWS SDKで実装されてるが・・・ ◦
呼び出し側のリソース不足などのエラーに対応してない ので自前実装がおすすめ ◦ ググればライブラリは色々出てくる
しかし、このピタゴラ装置感 https://aws.amazon.com/jp/blogs/news/how-to-automate-container-instance-draining-in-amazon-ecs/ Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法
しかし、このピタゴラ装置感 https://aws.amazon.com/jp/blogs/news/how-to-automate-container-instance-draining-in-amazon-ecs/ Amazon ECS におけるコンテナ インスタンス ドレイニングの自動化方法 マネージドなのにlambda を自前実装させるサービ ス・・・
Workaround タスク内から自分でAPIを叩く!
Workaround タスク内から自分でAPIを叩く! • APIを叩いてインスタンスの状態を確認 ◦ 終了待ち状態だったら処理を終了
Workaround タスク内から自分でAPIを叩く! • APIを叩いてインスタンスの状態を確認 ◦ 終了待ち状態だったら処理を終了 • メリット ◦ タスクの都合が良いタイミングで終了処理を行える
◦ 全体の構成がシンプル ▪ Lambda, SNSが不要
実装方法詳細 • AutoScaling groupにライフサイクルフックを設定 https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/lifecycle-hooks.html • DescribeAutoScalingInstances で自インスタンスの LifecycleState が
"Terminating:Wait" か確認する https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_DescribeAutoScalingInstances.html • "Terminating:Wait"の場合は終了処理に入る • CompleteLifecycleAction でパラメータとしてライフサイク ルフック名と "ABANDON" 送る https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_CompleteLifecycleAction.html
Auto scaling group のライフサイクルフックの設定はこんな感じ Ec2InstanceAutoScalingGroup: Type: AWS::AutoScaling::AutoScalingGroup Properties: AutoScalingGroupName: !Sub
${AWS::StackName} VPCZoneIdentifier: !Ref SubNets LaunchTemplate: LaunchTemplateId: !Ref Ec2InstanceLaunchTemplate Version: !GetAtt Ec2InstanceLaunchTemplate.LatestVersionNumber MinSize: !Ref Ec2AutoscaleMinSize MaxSize: !Ref Ec2AutoscaleMaxSize DesiredCapacity: !Ref Ec2AutoscaleDesiredCapacity LifecycleHookSpecificationList: - LifecycleTransition: autoscaling:EC2_INSTANCE_TERMINATING LifecycleHookName: !Sub ${AWS::StackName}-lc-hook HeartbeatTimeout: 3600 DefaultResult: ABANDON 実装方法詳細
やっと理想のシンプルな構成に・・・ Job Observerパターン http://aws.clouddesignpattern.org/index.php/CDP:Job_Observer パターン キューに積み上る メッセージ数に応じて スケーリング SQS ECS
Claster Instance/Task
オレオレベストプラクティスまとめ • デーモンスケジューリング • 1ECSクラスタ=1種類タスク • 1タスクでインスタンスリソースを使い切る • タスクからAutoScaling APIを叩く
• エクスポネンシャルバックオフ • CloudFormaiton
ありがとうとざいました。