作るべきものと向き合う ── ecspressoに見る、「やらないこと」を決める技術選定のトップ画像

作るべきものと向き合う ── ecspressoに見る、「やらないこと」を決める技術選定

投稿日時:
藤原 俊一郎(fujiwara)のアイコン

さくらインターネット株式会社 / ソフトウェアエンジニア

藤原 俊一郎(fujiwara)

Xアカウントリンク
本記事では、2026年2月26日に開催されたオンラインイベント「技術選定を突き詰める Online Conference ――逆境を乗り越える意思決定プロセス」内のセッション「作るべきものと向き合う」の内容をお届けします。

同セッションでは、さくらインターネット株式会社のfujiwara(@fujiwara)さんが登壇。Amazon ECSのデプロイツールecspressoの8年間にわたる開発を題材に、技術選定における設計判断の積み重ねと失敗からの改善プロセスについてお話しいただきました。ぜひ本編のアーカイブ動画とあわせてご覧ください。


fujiwara:これからお話しする「ecspresso」は、Amazon ECSのデプロイツールです。2017年11月に開発を始めてから、8年間ずっとメンテナンスを続けています。

今回のタイトルは「作るべきものと向き合う」ですが、このトークには前編にあたるものが2つあります。1つは昨年の設計ナイトで発表した「設計思想に至る道」、もう1つはYAPC::Fukuokaで発表した「正しい抽象の探求」です。

今回はこの2つの続編、そして完結編として技術選定についてお話しします。

ecspressoの特徴と設計思想

ecspressoの特徴は、ECSのサービスとタスク定義のみを管理する点にあります。

ECSのサービスが動くためには、ネットワークのVPCやロードバランサー、データストアも必要になりますが、それらはあえて管理しません。ECSのサービスとタスク定義だけに集中して操作できるようにしています。

この設計思想の背景には、以前のEC2環境での課題がありました。アプリケーション開発とインフラ管理が分かれている環境では、1つのEC2上で動作しているNginxやFluentdのようなミドルウェアをどちらが管理するかが難しく、作業が衝突することがあったのです。これを避けるため、ECSを導入した際に責任分界点を明確に分けました。ECSの上はすべてアプリケーションのデプロイ担当者が行うようにし、この時につくられたのがecspressoです。

ツールが責任を分担し、「ここはやらない」と決まっている方が、変更頻度の高いアプリケーションをデプロイする際に都合が良いと感じています。インフラを誤って変更する事故を防げるためです。

ecspressoの設計思想

正しい抽象化の探求

次に、「正しい抽象化の探求」というテーマについてお話しします。IaCツールとしてどのような抽象化レベルを選択するかという話です。

対比として挙げたいのが、AWS公式のECSデプロイツールである「AWS Copilot CLI」です。AWS Copilot CLIは独自の概念でECSや周辺リソースを一括で作成してくれるツールですが、5年間運用された後、2025年2月にメンテナンスが終了しました。

AWS Copilot CLIの抽象化がもたらした制約

AWS Copilot CLIは1つのYAMLファイルを書くだけでデプロイできるオピニオネイテッドな設計で、裏側でCloudFormationが自動生成されます。しかし、抽象化されているがゆえの制約がありました。

たとえば、ECSは1つのサービスに内部用と外部用の複数のロードバランサーを付けられます。しかしAWS Copilot CLIのDSL構造は、1アプリケーションにつき1ロードバランサーと強く結びついていたため、最後まで複数ロードバランサーをサポートできませんでした。また、対応していないリソースを使いたい場合はCloudFormationのテンプレートを自分で書く必要があり、複雑なことをやろうとすると制約が大きくなってしまいます。

世の中のあらゆるアプリケーションパターンを1つのYAMLファイルで網羅することは非常に難しいです。結果的にAWS Copilot CLIはメンテナンスが止まってしまいました。AWSが発表したサポート終了の記事でも、独自構文による学習コスト、可視性や拡張性の制約、トラブルシューティングの難しさについて触れられています。

ecspressoが採用した抽象化レベル

対照的に、ecspressoは抽象化レベルを意図的に絞っています。ECSのデプロイという操作は抽象化しており、複数のAPIを順番に実行する処理を1つのコマンドで実行できるようにしています。また、ロールバック機能のエミュレートや、変更差分を確認するdiff機能、デプロイ前に外部リソースの権限などを検証するverify機能といった便利な操作も抽象化して組み込んでいます。

ecspressoが採用した抽象化レベル

一方で、構造の抽象化は意図的に行っていません。AWS SDKのJSONをそのまま扱えるようにしています。これにより、ECSに新しい機能が追加されてAPIの構造が変更されても、ツールを大きく更新することなくそのまま新機能に対応できるというメリットがあります。ドキュメントもAWS公式のものを読めばそのまま使えるため、更新追従のコストが非常に低いです。

抽象化は難しく、「漏れのある抽象化の法則」という有名な概念がある通り、すべての非自明な抽象化には必ず漏れが生じます。AWS Copilot CLIのように高度に抽象化すると、隠された機能にアクセスするために結局ユーザーがCloudFormationを書かなければならない事態が起きてしまいます。

この記事のつづきを読もう
新規登録/ログインしたらできること
  • すべての記事を制限なく閲覧可能
  • 限定イベントに参加できます
  • GitHub連携でスキルを可視化
ログイン
アカウントをお持ちでない方はこちらから新規登録