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
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
360
Building Flexible Design Systems
yeseniaperezcruz
327
38k
How STYLIGHT went responsive
nonsquared
95
5.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
42
2.2k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Visualization
eitanlees
145
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
RailsConf 2023
tenderlove
29
890
GraphQLとの向き合い方2022年版
quramy
43
13k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
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
ありがとうとざいました。