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
Cookpad Tech Kitchen #20 Amazon ECS の安定運用 / Bui...
Search
Kohei Suzuki
November 28, 2018
Technology
1
3.2k
Cookpad Tech Kitchen #20 Amazon ECS の安定運用 / Building a steady ECS infrastructure
Cookpad Tech Kitchen #20
https://cookpad.connpass.com/event/106913/
Kohei Suzuki
November 28, 2018
Tweet
Share
More Decks by Kohei Suzuki
See All by Kohei Suzuki
東京Ruby会議12 Ruby と Rust と私 / Tokyo RubyKaigi 12 Ruby, Rust and me
eagletmt
3
5.2k
少人数でも運用できるインフラ作り / Operating infrastructure with less effort
eagletmt
1
3.2k
Cookpad Lounge #4 SRE 座談会 コンテナ中心の構成からサーバーレスへの展望 / From containers to serverless
eagletmt
0
730
クックパッドでの Webアプリケーション開発 2017 / Web application development in Cookpad 2017
eagletmt
20
11k
ECS を利用したデプロイ環境
eagletmt
12
6.9k
ActiveRecord 3.2 -> 4.1
eagletmt
3
2k
クックパッドにおける Rubyの活用
eagletmt
0
540
複数DBとRails
eagletmt
14
7.1k
R/W Splitting in Rails
eagletmt
2
1.5k
Other Decks in Technology
See All in Technology
猫でもわかるKiro CLI(AI 駆動開発への道編)
kentapapa
0
220
Sansanでの認証基盤内製化と移行
sansantech
PRO
0
490
PMとしての意思決定とAI活用状況について
lycorptech_jp
PRO
0
130
今のWordPress の制作手法ってなにがあんねん?(改) / What’s the Deal with WordPress Development These Days?
tbshiki
0
460
DevOpsエージェントで実現する!! AWS Well-Architected(W-A) を実現するシステム設計 / 20260307 Masaki Okuda
shift_evolve
PRO
3
820
[JAWSDAYS2026][D8]その起票、愛が足りてますか?AWSサポートを味方につける、技術的「ラブレター」の書き方
hirosys_
3
180
JAWS DAYS 2026 ExaWizards_20260307
exawizards
0
430
ランサムウエア対策してますか?やられた時の対策は本当にできてますか?AWSでのリスク分析と対応フローの泥臭いお話。
hootaki
0
140
内製AIチャットボットで学んだDatadog LLM Observability活用術
mkdev10
0
120
Kubernetesにおける推論基盤
ry
1
390
Dr. Werner Vogelsの14年のキーノートから紐解くエンジニアリング組織への処方箋@JAWS DAYS 2026
p0n
1
140
JAWSDAYS2026_A-6_現場SEが語る 回せるセキュリティ運用~設計で可視化、AIで加速する「楽に回る」運用設計のコツ~
shoki_hata
0
3k
Featured
See All Featured
The SEO identity crisis: Don't let AI make you average
varn
0
420
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
480
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.1k
Navigating Team Friction
lara
192
16k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
63
51k
Paper Plane (Part 1)
katiecoart
PRO
0
5.6k
Exploring anti-patterns in Rails
aemeredith
2
290
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
220
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Typedesign – Prime Four
hannesfritz
42
3k
Transcript
Amazon ECS の安定運用 Kohei Suzuki
アウトライン - コンテナインスタンスの管理 - スポットインスタンス対応 - コンテナインスタンスのオートスケーリング - ログ -
配送、保存、検索 - モニタリング
規模感 - ほとんどのアプリケーションが ECS 上で動いている - hako (自作ツール) を使ってデプロイやバッチジョブの起動を行っている -
ECS クラスタ数: 40 - 合計 ECS サービス数: 500 - 1日あたりの RunTask 数: 80,000
コンテナインスタンスの管理
コンテナインスタンスの管理 - オンデマンドインスタンスは AutoScaling Group - ECS クラスタと AutoScaling Group
が一対一対応 - スポットインスタンスは Spot Fleet - ECS クラスタと Spot Fleet が一対一対応 - オンデマンド・スポット比: 1:4
Fargate? - 一部では Fargate も使っているが、基本は自前管理のインスタンス - スポットインスタンスを使ったほうが安い - Fargate だと起動が遅い、起動までの時間が安定しない
- Web アプリではそこまで困らない - そこそこの頻度で起動するバッチジョブだとつらい - Fargate を使うケース - ECS クラスタ自体を操作するジョブ (ECS クラスタのオートスケーリング等 ) - 特別に大きな CPU、メモリリソースを必要とするジョブ
オンデマンドクラスタ - 全クラスタで共通の AMI から起動 (※GPU クラスタを除く) - オートスケールは自前 (後述)
- AutoScaling Group の役割 - 「desired capacity を上下するだけで ECS クラスタの増減ができる」状態にする - インスタンス障害からのオートヒール
AutoScaling Group でのサービスアウト - スケールアウトは簡単だが、スケールインをするには事前にサービスアウトして おく必要がある - lifecycle hook の
Terminating:Wait の間にコンテナインスタンスを DRAINING 状態にしてサービスアウト
スポットクラスタ - オンデマンド同様、共通の Ubuntu ベースの AMI から起動 - Spot Fleet
で管理 - こちらもオートスケールは自前 (後述) - Spot Fleet の役割 - 「target capacity を上下するだけで ECS クラスタの増減ができる」状態にする - スポット価格上昇やインスタンス障害からのオートヒール
Spot Fleet でのサービスアウト - Spot Fleet の target capacity を下げてスケールインするときも、スポット価格上
昇で terminate されるときと同じように interruption notice が通知される - interruption notice を CloudWatch Events から SQS キュー経由で受け取り、 デーモンがサービスアウト処理を行う
Spot Fleet でのサービスアウト - AutoScaling Group とは異なり、通知がきてから2分以内にサービスアウトしき る必要がある - バッチジョブは諦めて
StopTask API で止める - スポットクラスタでバッチジョブを動かすときはアプリケーション側に冪等性を要求する - DRAINING 状態にして ECS に任せるだけでは間に合わない可能性がある
Spot Fleet でのサービスアウト - 先に自前で ELB の target group から
deregister する - 先に DeregisterTargets してしまえば新規のリクエストはそのタスクにはこなくなる - DeregisterTargets し終わったら StopTask で止める - ECS や ELB に邪魔されないように deregistration_delay.timeout_seconds を一定 以上にしておく - 突然一部のタスクが停止しても問題無いようにやや過剰なキャパシティを常に 確保しておく - そうしてもスポットインスタンスのほうが安い
Spot Fleet でのサービスアウト (w/o ELB) 1. interruption notice Terminator 3.
StopTask 2. UpdateContainerInstancesState (DRAINING)
Spot Fleet でのサービスアウト (w/ ELB) 1. interruption notice Terminator 5.
StopTask 2. UpdateContainerInstancesState (DRAINING) 3. DeregisterTargets 4. DescribeTargetHealth
オートスケーリング
オートスケーリング - オンデマンドクラスタとスポットクラスタの間で戦略に差は無い - AutoScaling Group の desired capacity を調整するか、Spot
Fleet の target capacity を調整するかの違いだけ - 3種類のスケールアウトと1種類のスケールイン
スケールアウト - クラスタの CPUReservation、MemoryReservation を見て閾値を超えてたらス ケールアウト - 各 service の
desired_count、running_count、pending_count を チェックして足りてなさそうだったらスケールアウト - hako oneshot (バッチジョブの起動) がリソース不足で RunTask に失敗した らスケールアウト
スケールアウト (1) - CloudWatch に入っている CPUReservation、MemoryReservation を定期的に チェックして、閾値を超えていたらスケールアウト - スポットクラスタの場合はオンデマンドクラスタより閾値を低くしている
スケールアウト (2) - 各 service の desired_count、running_count、pending_count を定 期的にチェックして、desired_count >
running_count + pending_count となっていたらリソースが足りずにデプロイが停滞している可 能性があるので、スケールアウトする
スケールアウト (3) - hako oneshot (バッチジョブの起動) がリソース不足で RunTask に失敗した ときに
SNS トピックに通知するので、それを SQS 経由で受け取ってスケールア ウト
スケールアウト (3) AutoScaler Hako 1. RunTask (failed) 2. Publish 3.
ModifySpotFleetRequest 3. SetDesiredCapacity
スケールイン - クラスタの CPUReservation、MemoryReservation を見て閾値を下回っていた らスケールイン - スポットクラスタの場合はオンデマンドクラスタより閾値を低くしている
ログ
ログ - コンテナの stdout/stderr に出たログをどこにどう保存するか - 現在のクックパッドでは Docker の fluentd
logging driver から fluentd を経由 して Amazon S3 に保存し、Amazon Athena で簡易検索できるようにしている
CloudWatch Logs? - マネージドなログの保存、検索、閲覧サービス - しかしログの量が膨大すぎてピークタイムでは CloudWatch Logs にリアルタイ ムに入りきらない
- 入っても検索したり取り出したりするのが遅い - ログを入れるときの料金 (ingestion) だけでもかなり高価に - 閲覧できるまでのラグや検索の柔軟性をやや犠牲にして、スケーラブルで安価 な S3 をログストレージとして選択
ログ配送 Container instances service logs task logs S3 Event ecs-logs-router
fluentd aggregator
ログ配送 Container instances service logs task logs S3 Event ecs-logs-router
fluentd aggregator
ログ配送 - コンテナインスタンスのホスト側に fluentd を起動し、Docker の logging driver の設定でそこへ送信 -
各コンテナインスタンスから fluentd の集約ノードへと転送する - 集約ノードには大量のログが送信されてくる - fluentd v1.0 からは複数プロセスで処理できるようになっているので、それを利用してがんばっ て処理しきる - https://docs.fluentd.org/v1.0/articles/multi-process-workers
ログ配送 Container instances service logs task logs S3 Event ecs-logs-router
fluentd aggregator
ログ配送 - 集約ノードの fluentd が1分毎に s3://service-logs/${task_definition_family}/${container _name}/%Y/%m/%d/%Y%m%d%H%M_%{index}_%{flush_uuid}.gz に ログを出力する -
タスクを横断して、service 毎 (task definition 毎) に閲覧するためのログ
ログ配送 Container instances service logs task logs S3 Event ecs-logs-router
fluentd aggregator
ログ配送 - s3://service-logs に置かれたログを ecs-logs-router がタスク ID 毎に分 解して s3://task-logs/${task_definition_family}/${container_na
me}/${task_id}/ 以下に置く - タスク単位で閲覧するためのログ
ログ検索 - Amazon Athena で検索できるように、AWS Glue でカタログを日次で更新して いる - ${task_definition_family}_${container_name}
というテーブル名 - 日付でパーティションを切っている - 例: my-awesome-app の app コンテナの今日のログから ERROR を探す - select time, log from "my_awesome_app_app" where year = 2018 and month = 11 and day = 28 and log like '%ERROR%' order by time
モニタリング
モニタリング - CloudWatch に service 単位のメトリクスは存在しているが、タスク単位、コンテ ナ単位でのメトリクスは存在していない - したがって RunTask
で起動した場合はメトリクスが一切存在しない - アプリケーション開発者にとって、主に見たいのはアプリケーションコンテナだけ のメトリクス - サイドカーとして起動している fluentd や Envoy 等は要らない
モニタリング - cAdvisor でメトリクスを取得し、Prometheus からそれを scrape し、Grafana で 可視化することにした -
cAdvisor 自体に Prometheus 用のメトリクスを返すエンドポイントがあるので、 これが一番簡単そうだった - cAdvisor は ECS の daemon scheduling を使って各コンテナインスタンスに配 置した
モニタリング
モニタリング
まとめ
まとめ - ECS で様々なサービスを動かすためにやってることの一部を紹介した - オンデマンドインスタンス管理、スポットインスタンス対応 - オートスケーリング戦略 - ログ配送
- モニタリング - 今回話さなかったトピック - ECS API の rate limit を回避するための工夫 - コンテナインスタンス側の問題を調査するためのロギング
今後 - センシティブな値を環境変数に入れる機能がついにきたので移行したい - https://aws.amazon.com/about-aws/whats-new/2018/11/aws-launches-secrets-support-f or-amazon-elastic-container-servic/ - AutoScaling Group でスポットインスタンスを管理できるようになったので移行し
たい - https://aws.amazon.com/jp/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instan ce-types-purchase-options/