痒い所に手が届く!Step Functions によるトイル削減

はじめに

この記事は メドレー夏のブログリレー 2025 21 日目の記事です。

医療プラットフォーム本部 プラットフォーム開発室 SRE グループの山田です。 医療機関向け SaaS である CLINICS の安定稼働とシステム信頼性の向上に取り組んでいます。

SREグループは開発組織全体の中でも比較的少人数のチームです。 そのため、腰を据えて事業やプロダクトに中長期的な価値を生む時間を作るためにも、トイルの削減に力を入れています。

繰り返し作業や自動化が可能なタスクを効率化する上で、AWS Step Functionsは非常に強力なサービスです。

本記事では、AWS Step Functions を活用し、1000を超えるデータベースのマイグレーション作業を自動化した事例を題材に、Step Functionsの 実践的な活用方法(tips) についてご紹介します。

メンテナンス作業のおおまかなワークフロー

  1. DBのバックアップ(スナップショットを作成)
  2. DBマイグレーションを実施
  3. マイグレ後のDBスキーマチェック
  4. ECS Task(アプリケーション)のデプロイ
  5. 完了/失敗通知を飛ばす

更新手順としてはごく一般的なワークフローかと思います。 しかし、手順2で大量のデータベースをどのようにして夜間で更新しきるのかが課題となりました。

プロダクトの成長とともにデータベースの数が増えていくという特性上、なるべく変更管理の手間がかからない仕組みを導入しなくてはなりません。

Step Functions を用いたアプローチ

SREチームでは上述した課題に対して Step Functions によるメンテナンスを自動化することにしました。

AWS Step Functions とは?

ここでは、詳細な説明は割愛しますが、AWS Step Functions は複数のAWSリソースやサービスを統合してワークフローを構築するためのサービスです。 lambda で実装するには処理が複雑だったり処理時間が15分以上かかる場合、Step Functionsが選択肢となります。 (AWS Step Functions は最大1年実行が可能)

1. Map ステートを活用する

Mapステートを用いた実装例

Map ステートは同一ワークフローに異なる入力を与えてタスクを並列実行する(動的並列処理)機能です。 Map ステートに与える入力を増やす/減らすことでワークフローを変更することなく並列実行するタスクをスケールさせることができます。

これにより、大量のDBマイグレーションを同時に実行しメンテナンス時間の短縮をしただけでなく、変更に強いワークフローを構築することができました。

ワークフローの処理内容

  1. 各ブランチのマイグレーションタスクがどのDBのマイグレーションを実施するのかリストを作成(画像では3並列なので1 Taskあたり約333DBのマイグレーションを実行するように振り分け)
  2. 複数のECS Taskを立ち上げてマイグレーションを実施
  3. DBスキーマをチェックして問題ないか確認

※各ステートごとにlambdaを用意すると管理しづらくマイグレーション処理も15分以上かかるため、メンテナンス作業用のコンテナイメージを別途、用意しています。

2. .sync を用いてDBマイグレーション完了まで待機させる

Step Functions では通常サービスを呼び出すと次のステートへ遷移しますが、.syncを用いることでジョブが完了するまで状態遷移を待機させることができます。

"更新対象のDBリストを作成": {
  "Type": "Task",
  "Next": "DBマイグレーションを実行",
  "Resource": "arn:aws:states:::ecs:runTask.sync",
  "Arguments": { /* 省略 */ },
  "Catch": [
    {
      "ErrorEquals": [
        "States.ALL"
      ],
      "Next": "更新処理の失敗を通知"
    }
  ]
},

上記のように記述することで、更新対象のデータベースリストを作成するECS Taskが終了しないと、次のステート「DBマイグレーションを実行」へ遷移しないようになります。

ジョブ完了状態のポーリングは DescribeTasks, ChoiceState, WaitState の組み合わせでも可能ですが、Step Functions は状態遷移回数によってサービス利用料が計算されるため、コスト的に優しくありません。

ただし、すべてのAWSサービスで.syncが利用できるわけではないので注意が必要です。

参考:最適化されたサービスと Step Functions の統合

実装時に意識したこと

1. ビジュアルエディタを活用する

AWS Step Functions のワークフローはJSON形式で定義する宣言型の Amazon States Language (ASL) で記述します。

シンプルなワークフローであればASLで書かれたワークフローを読むのもそこまで苦ではありませんが、分岐が複数あったり複雑なワークフローだと辛くなってきます。 そこで、役立つのがビジュアルエディタです。

Step Functions のビジュアルエディタにはデザインモードとコードモードが存在します。 デザインモードを活用することで、ワークフローの構造をビジュアルで確認することができます。

デザインモード

デザインモードの画面

  • ドラッグ&ドロップでアクションやフローを配置してワークフローの構築ができます。
  • コードを書く必要がなく直感的に操作することができます。

コードモード

コードモードの画面

  • ASLでワークフローを編集することができます。
  • 他のStep Functionsワークフローをコピペして組み込んだりする時には便利です。
  • ASLの構文エラーはエディタから確認することができるので、間違いに気がつくことはできます。

2. TestState API を使い倒す

TestStateAPI画面

ワークフローを構成する各ステートはTestState APIで単体テストが可能です。 特に参照系APIの戻り値をテストしたりJSONataのような書き慣れないクエリ構文のチェックに利用します。 ただし、処理完了するまで待機する .sync やコールバックが返却されるまでStep Functionsが待機する .waitForTaskToken といったステートはTestState APIをサポートしていないため、その場合は.sync.waitForTaskToken を外して検証します。

まとめ

本記事では、Step Functions を活用した運用トイル削減の取り組みとそこで得たTipsについて紹介しました。 少人数のSREチームにおいて、手作業による運用コストの削減は重要な課題です。

Step Functions を使用することで、以下の成果を得ることができました:

  • 定量的効果: 月6時間、年間72時間の工数削減
  • 定性的効果: ヒューマンエラーの排除と心理的負荷の軽減
  • 組織的効果: より価値の高い業務への時間投入が可能

特に、視覚的なワークフロー管理機能により、チーム全体での理解と保守性が向上したことは、持続可能な運用自動化において重要な要素でした。

今後も、運用業務の中で反復的に実施している作業を見つけ出し、Step Functions をはじめとしたAWSサービスを活用した自動化に取り組んでいきます。 これにより、SREとしてのCLINICSの安定性と信頼性をさらに向上させていきたいと考えています。

次回は、医療プラットフォーム本部 桶谷さん・小島さんの、「生成AI時代に向けて、開発効率10xを支えるリリース戦略の見直し」です。お楽しみに。

メドレーではエンジニアを積極採用中です!

メドレーでは、SREをはじめ「医療ヘルスケアの未来」を共に創っていくエンジニアを大募集中です!少しでもご興味をお持ちいただけましたらぜひ、ご応募お待ちしております!

※カジュアル面談も大歓迎です!ご希望の際は、「その他の項目(希望記入欄)」にてその旨をご記載ください。