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とEFSを組み合わせた Batchサーバー デプロイ方法の模索 / Exploring ...
Search
コドモン開発チーム
November 10, 2025
170
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ECSとEFSを組み合わせた Batchサーバー デプロイ方法の模索 / Exploring deployment methods for a Batch server using ECS and EFS
コドモン開発チーム
November 10, 2025
More Decks by コドモン開発チーム
See All by コドモン開発チーム
AI時代のPHP開発にASTクエリツール で コードベースの地図を作る / ast-query-tool-php-codebase-map
codmoninc
0
18
コネクションをピン留めさせずに SELECTクエリのタイムアウトを設定した話
codmoninc
0
31
コドモンに入社してAI活用により、 設計がより重要だと感じた背景
codmoninc
0
37
実装・設計だけでなく、運用・保守にもAIを広げてみた / We Took AI Beyond Coding and Into Operations and Maintenance
codmoninc
0
26
AIが無かった頃の素敵な出会いの話
codmoninc
1
390
5分で問診!Composer セキュリティ健康診断
codmoninc
0
910
アラート疲れからの脱却 - リソースタグで仕分けるSlack通知戦略 / Breaking Free from Alert Fatigue – A Slack Notification Strategy Using Resource Tags for Routing
codmoninc
0
45
SREに優しいTerraform構成 modulesとstateの組み方 / terraform-modules-state-for-sre
codmoninc
0
400
モノリスなプロダクトの「ほどよい」リプレイス戦略 / A "Just Right" Replacement Strategy for Monolithic Products
codmoninc
0
290
Featured
See All Featured
Context Engineering - Making Every Token Count
addyosmani
9
1k
Designing for humans not robots
tammielis
254
26k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
Un-Boring Meetings
codingconduct
0
380
My Coaching Mixtape
mlcsv
0
210
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Scaling GitHub
holman
464
140k
Documentation Writing (for coders)
carmenintech
77
5.4k
Navigating Team Friction
lara
192
16k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Writing Fast Ruby
sferik
630
63k
WENDY [Excerpt]
tessaabrams
11
39k
Transcript
ECSとEFSを組み合わせた Batchサーバー デプロイ方法の模索 2025年11月07日 株式会社コドモン 小西達大 JAWS-UGコンテナ支部 x ストレージ支部コラボ会
2 経歴 1996年生まれ。 前職でアプリケーションエンジニアとして従事後、株式会社コドモン のSREチームに昨年ジョイン。 自己紹介 小西 達大 こにし たつひろ
3 目次 ECS × EFS に取り組むことになった発端 課題解決のための構成模索 具体的な実装例 まとめ 1
2 3 4
4 ECS × EFS に取り組むことになった発端 課題解決のための構成模索 具体的な実装例 まとめ 1 2
3 4
5 CONFIDENTIAL - © 2022 CoDMON Inc. 5 コンテナ化(EC2 →
ECS)の取り組み • 各アプリケーションのコンテナ化(EC2 → ECS)を推進し、インフラ / デプ ロイ構成の標準化により認知負荷 / 運用負荷の改善を図っている • EC2で動くものはバッチサーバー1つに...!
6 CONFIDENTIAL - © 2022 CoDMON Inc. 6 Batch サーバーの特性
• cron経由で、最短1分間隔で動く処理が多く存在している ◦ ほぼリアルタイムで動くことが求められる • 各バッチ処理が実行途中で中断されることは許容されない ◦ アプリケーション側で、Graceful Shutdown に対応していない ◦ サービス的に重要な処理が動いている
7 CONFIDENTIAL - © 2022 CoDMON Inc. 7 Batch EC2
→ ECS化 したいが... • cron経由で、最短1分間隔で動く処理が多く存在している ◦ EventBridge → ECS RunTask 方式だと、タスク起動時間が問題になる ◦ 1つのECS Taskの中でcronを動かせば良いのでは?
8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 Batch EC2
→ ECS化 したいが... • 各バッチ処理が実行途中で中断されることは許容されない ◦ デプロイ時に新旧タスクの入れ替えが発生 ◦ 旧Taskで実行中だった処理は中断されるので、要件を満たせない...
9 ECS × EFS に取り組むことになった発端 課題解決のための構成模索 具体的な実装例 まとめ 1 2
3 4
10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 解決したい課題 •
[要件] デプロイ時に、旧タスク側で実行中だった処理が中断されないこと ◦ [認知負荷軽減] なるべく作り込みの少ないシンプルな方法で解決したい ◦ [運用負荷軽減] 手作業での運用は極力減らしたい
11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 課題解決のための構成模索 •
EC2の場合、デプロイのタイミングで「Ansible経由でgit pull(& 各種デプ ロイコマンド実行)」という方法をとっており、実行中の処理には影響を及 ぼさなかった
12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 課題解決のための構成模索 •
ECSで同じ方式をとることもできなくはないが... ・ECS Task停止時にコードが失われることへ の考慮 ・稼働中のコンテナに対して、各種デプロイ コマンドを実行する必要あり ・イミュータブルインフラストラクチャを保 てない
13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 課題解決のための構成模索 •
ECS × EFS を組み合わせることで、上手くできそう! ・ECS Task停止時にコードが失われることへの考慮 → コードをEFSに外出し(永続化)することで解消 ・稼働中のコンテナに対して、各種デプロイコマン ドを実行する必要あり → コード更新用Taskを介することで解消 ・イミュータブルインフラストラクチャを保てない → 工夫次第で回避可能?(後述)
14 ECS × EFS に取り組むことになった発端 課題解決のための構成模索 具体的な実装例 まとめ 1 2
3 4
15 CONFIDENTIAL - © 2022 CoDMON Inc. 15 実装例 •
ミドルウェアはDockerfileで宣言的に定義 & コンテ ナイメージに梱包 • 日常のデプロイで更新したいファイル(アプリケー ションコード / crontab)はEFSに配置 & ECSにマウ ント { "containerDefinitions": [ { "mountPoints": [ { "sourceVolume": "src-volume", "containerPath": "/var/www/src" }, { "sourceVolume": "crontab-volume", "containerPath": "/var/spool/cron/crontabs" } ] } ], "volumes": [ { "name": "src-volume", "efsVolumeConfiguration": { "fileSystemId": "fs-xxxxxxxxxx", "rootDirectory": "/var/www/src" } }, { "name": "cron-volume", "efsVolumeConfiguration": { "fileSystemId": "fs-xxxxxxxxxx", "rootDirectory": "/var/spool/cron/crontabs" } } ] }
16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 実装例 -
デプロイ時 • デプロイ時にコード更新用の一時Taskを起動し、各 種デプロイコマンドを実行してEFSを更新 • 実行中の処理はそのままで、処理実行側Taskのコー ドは自動更新される。 { "containerDefinitions": [ { "entryPoint": [ "bash", "/root/entrypoint/deploy.sh" ], "mountPoints": [ { "sourceVolume": "efs-volume", "containerPath": "/mnt/efs" } ] } ], "volumes": [ { "name": "efs-volume", "efsVolumeConfiguration": { "fileSystemId": fs-xxxxxxxxxx", "rootDirectory": "/" } } ] }
17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 実装例 -
イミュータブル性を考慮 • デプロイ時にBuild & Push • 更新したコンテナイメージから一時タスクを起動 • 日常のデプロイで更新したいファイル(アプリケーションコード / crontab) をrsyncしてEFSに配置
18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 実装例 -
イミュータブル性を考慮 Pros ・コンテナイメージ:コンテナの中身 を一致させられる(イ ミュータブル性の確保) Cons ・コンテナイメージ作成時に各ファイルのタイムスタンプが 更新されるので、単純にrsyncするとデプロイのたびに大量の ファイルが更新される ・チェックサムの比較で更新するようにする(rsync -c)こと で回避可能だが、同期に時間がかかり、処理によってファイ ルが異なる懸念あり ・シンボリックリンク切替方式 等を利用すれば回避可能だ が、構成が煩雑になる
19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 運用時の考慮点1(Fargateの場合) •
処理実行側Taskが起動しっぱなしだと、AWS Fargate基盤インフラストラク チャの更新により、予期しないタイミングでTask停止が発生する懸念がある • 影響のない時間帯(夜間等)で、定期的にTaskの再起動(ECS Service 強制デ プロイ)を実施する運用が必要
20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 運用時の考慮点2 •
Dockerfile管理下を変更したい場合は、処理実行側Taskのコンテナイメージ自 体を差し替える必要があるため、何らかの手段が必要(↓一例)
21 ECS × EFS に取り組むことになった発端 課題解決のための構成模索 具体的な実装例 まとめ 1 2
3 4
22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 アーキテクチャ評価 •
[要件] デプロイ時に、旧タスク側で実行中だった処理が中断されないこと ◦ [認知負荷軽減] なるべく作り込みの少ないシンプルな方法で解決したい ◦ [運用負荷軽減] 手作業での運用は極力減らしたい 評価 備考 要件 ⚪ デプロイ時に、旧タスク側で実行中だった処理は中断されない 認知負荷 △ イミュータブル性を確保しなければ構成は比較的シンプル イミュータブル性を確保したい場合は複雑になりそう コンテナイメージ差し替え時の考慮で一定作り込みが発生 運用負荷 ⚪ 各工程の自動化は達成できている
23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 まとめ •
厳密なイミュータブル性を求めない(ECS化できれば恩恵を得られる)場合 は、ECS × EFS の組み合わせによって、比較的シンプルな構成でバッチサー バーのデプロイ要件を満たせる可能性がある • 厳密なイミュータブル性が求められる場合は、他構成の方がシンプルに実現 できるかも • EventBridge → ECS Task 起動 という構成が可能な場合は、そちらの方が 良い
None