ecspressoってなに?


### はじめに
Amazon ECS をヘビーに使う現場では、「タスク定義の登録」「サービス更新」「リビジョン管理」「ロールバック」など日常運用の細かな作業が *手間* になりがちです。  
**ecspresso** は KAYAC Inc. が OSS として開発する Go 製 CLI で、こうした ECS のオペレーションを **シンプルかつ宣言的** にまとめてくれます。2025 年 3 月に最新安定版 **v2.4.6** が公開され、Service Connect や VPC Lattice などの新機能にも対応しました。  

---

## ecspresso とは
* 「espresso ☕」のように発音し、AWS CLI/API をラップして ECS ワークロードをデプロイ／管理するツール。  
* **YAML / JSON / Jsonnet** で “構成ファイル + サービス定義 + タスク定義” をコード化し、`ecspresso deploy` でワンコマンド反映。  
* `diff`・`verify` で変更内容とリソース整合性を事前チェック、`rollback` で安全に巻き戻し。  
* CodeDeploy を経由した **Blue/Green デプロイ**、Auto Scaling、Fargate／Fargate Spot、EBS Volume、Service Connect など最新機能をフルサポート。

---

## コア機能と強み

| 機能 | ひとことで | 運用メリット |
|------|-----------|--------------|
| **deploy** | サービス作成/更新、タスク定義登録を一括実行 | `create` と `update‐service` の手動分離が不要 |
| **diff / verify** | リモートとの差分チェック & 各種リソース検証 | 誤リリース防止・事前 QA |
| **rollback** | タスク定義の *n* 世代戻し & サービス切替 | 即時の障害回避 |
| **exec / tasks** | ECS Exec & タスク一覧操作 | デバッグ/ポートフォワードまで一本化 |
| **render / template** | ENV 変数・SSM・SecretsManager 等をテンプレ展開 | GitOps らしい宣言的管理 |
| **プラグイン** | tfstate / CloudFormation / SSM / SecretsManager … | IaC と ECS の橋渡し |
| **CI 連携** | Homebrew, asdf, aqua, GitHub Actions, CircleCI Orb | マルチプラットフォームで簡単導入 |

---

## v2 系で変わったこと（抜粋）
* `deploy` が **サービス作成** も兼ねるようになり `create` コマンドを廃止。  
* AWS SDK を Go v2 へ全面移行しパフォーマンス向上。  
* Jsonnet による **構成ファイル記述** と **ネイティブ関数** をサポート。  
* `rollback --deregister-task-definition` がデフォルト **true**＝不要リビジョンを自動整理。  
* `diff --unified` を既定で有効化し読みやすさ向上。  

---

## クイックスタート（既存サービスをコード化）
```bash
# 既存サービスを取り込み
ecspresso init \
  --region ap-northeast-1 \
  --cluster default \
  --service mysvc \
  --config ecspresso.yml

# 生成された ecspresso.yml / ecs-service-def.json / ecs-task-def.json をコミット
git add .
git commit -m "Manage mysvc via ecspresso"

# 次回リリース
IMAGE_TAG=2025-04-21 ecspresso deploy --config ecspresso.yml
```
`diff` と `verify` を挟めば、ECR イメージ存在や IAM ロールの Assume 権限まで自動チェックしてくれるため “壊れたタスクをデプロイしてしまう事故” を大幅に低減できます。  

---

## CI/CD 例（GitHub Actions）
```yaml
name: deploy
on:
  push:
    branches: [main]
jobs:
  ecs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: kayac/ecspresso@v2  # v2 系最新を取得
        with:
          version: v2.4.6
      - run: ecspresso diff --config ecspresso.yml
      - run: ecspresso deploy --config ecspresso.yml --no-wait
```
CI で差分確認だけ行い、`--no-wait` で非同期デプロイにするか、CodeDeploy による Blue/Green を待機するかは好みに合わせて調整できます。

---

## 最新リリース v2.4 系の注目ポイント
* **Service Connect** & **VPC Lattice**: サービスディスカバリ/サービスメッシュ連携を CLI 一発で反映。  
* **EBS Volume**: Fargate でも EBS 永続ボリュームを扱えるように。  
* **外部 diff**: `ecspresso diff --external "difft --color"` で好きな差分ツールを活用。  
* **Application Auto Scaling 操作**: `scale --auto-scaling-min/max` で Min/Max を同時更新。  
* **Jsonnet 関数**: `env()`, `ssm()`, `cfn_output()` などテンプレ関数が Jsonnet でも利用可能。  

---

## 他ツールとの使い分け
| ツール | 特徴 | ecspressoを選ぶ判断軸 |
|--------|------|------------------------|
| **AWS Copilot** | App レベルで抽象化、高速な初学者体験 | 既存 ECS 運用に部分導入しやすいか |
| **Terraform/CDK** | フル IaC、一括スタック管理 | ECS 周辺だけを *小さく* デプロイしたい |
| **ECS CLI v2** | (旧)AWS 公式 CLI、機能限定 | Blue/Green・差分表示・rollback が必要か |
| **GitHub Actions `aws-actions/amazon-ecs-deploy-task-definition`** | CI と相性◎ | テンプレート展開・多彩なサブコマンドが欲しいか |

実際には「インフラ枠＝Terraform、サービス更新＝ecspresso」のハイブリッド構成が定番です。  

---

## まとめ
* ecspresso は **ECS 運用定番 CLI** として着実に進化を続けており、v2.4 系で最新 AWS 機能と運用 DX を強化。  
* GitOps フレンドリーな宣言的デプロイ、強力な差分＆検証、豊富なプラグインが大きな魅力。  
* 既存サービスでも `init` → `deploy` の 2 ステップで導入できるため、**低コストで安全な ECS デリバリー** をすぐに体験できます。  

日々のデプロイが「コマンド一杯」「GUI ぽちぽち」になっているチームは、ぜひ一度 ecspresso を試してみてください。☕🚀  

---

### 参考リンク
- [ecspresso GitHub README](https://github.com/kayac/ecspresso)
- [v1 と v2 の違い](https://github.com/kayac/ecspresso/blob/v2/docs/v1-v2.md)
- [公式ドキュメント（Plugins / Jsonnet / diff など）](https://github.com/kayac/ecspresso/tree/v2/docs)
- [Releases — v2.4.6 (2025‑03‑01)](https://github.com/kayac/ecspresso/releases/tag/v2.4.6)
- [Improving ECS Deployment Efficiency with ecspresso (Medium, 2025‑04)](https://medium.com/@yoshiyuki.watanabe/improving-ecs-deployment-efficiency-with-ecspresso-f08397879a35)