Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ECSとEFSを組み合わせた Batchサーバー デプロイ方法の模索 / Exploring ...

ECSとEFSを組み合わせた Batchサーバー デプロイ方法の模索 / Exploring deployment methods for a Batch server using ECS and EFS

Avatar for コドモン開発チーム

コドモン開発チーム

November 10, 2025
Tweet

More Decks by コドモン開発チーム

Transcript

  1. 5 CONFIDENTIAL - © 2022 CoDMON Inc. 5 コンテナ化(EC2 →

    ECS)の取り組み • 各アプリケーションのコンテナ化(EC2 → ECS)を推進し、インフラ / デプ ロイ構成の標準化により認知負荷 / 運用負荷の改善を図っている • EC2で動くものはバッチサーバー1つに...!
  2. 6 CONFIDENTIAL - © 2022 CoDMON Inc. 6 Batch サーバーの特性

    • cron経由で、最短1分間隔で動く処理が多く存在している ◦ ほぼリアルタイムで動くことが求められる • 各バッチ処理が実行途中で中断されることは許容されない ◦ アプリケーション側で、Graceful Shutdown に対応していない ◦ サービス的に重要な処理が動いている
  3. 7 CONFIDENTIAL - © 2022 CoDMON Inc. 7 Batch EC2

    → ECS化 したいが... • cron経由で、最短1分間隔で動く処理が多く存在している ◦ EventBridge → ECS RunTask 方式だと、タスク起動時間が問題になる ◦ 1つのECS Taskの中でcronを動かせば良いのでは?
  4. 8 CONFIDENTIAL - © 2022 CoDMON Inc. 8 Batch EC2

    → ECS化 したいが... • 各バッチ処理が実行途中で中断されることは許容されない ◦ デプロイ時に新旧タスクの入れ替えが発生 ◦ 旧Taskで実行中だった処理は中断されるので、要件を満たせない...
  5. 10 CONFIDENTIAL - © 2022 CoDMON Inc. 10 解決したい課題 •

    [要件] デプロイ時に、旧タスク側で実行中だった処理が中断されないこと ◦ [認知負荷軽減] なるべく作り込みの少ないシンプルな方法で解決したい ◦ [運用負荷軽減] 手作業での運用は極力減らしたい
  6. 11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 課題解決のための構成模索 •

    EC2の場合、デプロイのタイミングで「Ansible経由でgit pull(& 各種デプ ロイコマンド実行)」という方法をとっており、実行中の処理には影響を及 ぼさなかった
  7. 12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 課題解決のための構成模索 •

    ECSで同じ方式をとることもできなくはないが... ・ECS Task停止時にコードが失われることへ の考慮 ・稼働中のコンテナに対して、各種デプロイ コマンドを実行する必要あり ・イミュータブルインフラストラクチャを保 てない
  8. 13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 課題解決のための構成模索 •

    ECS × EFS を組み合わせることで、上手くできそう! ・ECS Task停止時にコードが失われることへの考慮 → コードをEFSに外出し(永続化)することで解消 ・稼働中のコンテナに対して、各種デプロイコマン ドを実行する必要あり → コード更新用Taskを介することで解消 ・イミュータブルインフラストラクチャを保てない → 工夫次第で回避可能?(後述)
  9. 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" } } ] }
  10. 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": "/" } } ] }
  11. 17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 実装例 -

    イミュータブル性を考慮 • デプロイ時にBuild & Push • 更新したコンテナイメージから一時タスクを起動 • 日常のデプロイで更新したいファイル(アプリケーションコード / crontab) をrsyncしてEFSに配置
  12. 18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 実装例 -

    イミュータブル性を考慮 Pros ・コンテナイメージ:コンテナの中身 を一致させられる(イ ミュータブル性の確保) Cons ・コンテナイメージ作成時に各ファイルのタイムスタンプが 更新されるので、単純にrsyncするとデプロイのたびに大量の ファイルが更新される ・チェックサムの比較で更新するようにする(rsync -c)こと で回避可能だが、同期に時間がかかり、処理によってファイ ルが異なる懸念あり ・シンボリックリンク切替方式 等を利用すれば回避可能だ が、構成が煩雑になる
  13. 19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 運用時の考慮点1(Fargateの場合) •

    処理実行側Taskが起動しっぱなしだと、AWS Fargate基盤インフラストラク チャの更新により、予期しないタイミングでTask停止が発生する懸念がある • 影響のない時間帯(夜間等)で、定期的にTaskの再起動(ECS Service 強制デ プロイ)を実施する運用が必要
  14. 20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 運用時の考慮点2 •

    Dockerfile管理下を変更したい場合は、処理実行側Taskのコンテナイメージ自 体を差し替える必要があるため、何らかの手段が必要(↓一例)
  15. 22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 アーキテクチャ評価 •

    [要件] デプロイ時に、旧タスク側で実行中だった処理が中断されないこと ◦ [認知負荷軽減] なるべく作り込みの少ないシンプルな方法で解決したい ◦ [運用負荷軽減] 手作業での運用は極力減らしたい 評価 備考 要件 ⚪ デプロイ時に、旧タスク側で実行中だった処理は中断されない 認知負荷 △ イミュータブル性を確保しなければ構成は比較的シンプル イミュータブル性を確保したい場合は複雑になりそう コンテナイメージ差し替え時の考慮で一定作り込みが発生 運用負荷 ⚪ 各工程の自動化は達成できている
  16. 23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 まとめ •

    厳密なイミュータブル性を求めない(ECS化できれば恩恵を得られる)場合 は、ECS × EFS の組み合わせによって、比較的シンプルな構成でバッチサー バーのデプロイ要件を満たせる可能性がある • 厳密なイミュータブル性が求められる場合は、他構成の方がシンプルに実現 できるかも • EventBridge → ECS Task 起動 という構成が可能な場合は、そちらの方が 良い