ECS Blue/Green に対応した ecspresso v2.6.0 をリリースしました

Amazon ECS デプロイツール、ecspresso v2.6.0 をリリースしました。

github.com

新機能

ECS Blue/Green デプロイ対応

これまで ECS では CodeDeploy と連携する形での Blue/Green デプロイがサポートされていましたが、先日 ECS deployment controller でのネイティブな Blue/Green がサポートされました。その対応が入っています。

aws.amazon.com

使い方としては特にこれまでと変わらず、サービス定義ファイルに B/G 用の属性を追加して ecspresso deploy するだけで使えるようになります。READMEを参照してください

実装は実は何も大変ではなかったので(ほぼSDKのバージョンを上げただけ) 即日 nightly バージョンをリリースしたところ、早速検証記事を書いていただけました。助かります! kakakakakku.hatenablog.com

rollback コマンドが進行中のデプロイメントを停止するように

2025年5月に、ECS 自体にロールバックのための仕組み(進行中のデプロイメントを停止する)が導入されました。ecspresso rollback は可能な場合にはその API を利用してロールバックを行うようになりました。

aws.amazon.com

これまでの ecspresso rollback は、以下のような実装になっていました。

  1. 現在動作している ECS サービスに設定されているタスク定義を見つける
  2. そのタスク定義の「直前のリビジョン」(削除/無効化されていない、現在のリビジョンより小さく一番近い値のもの)を見つける
  3. 「直前のリビジョンのタスク定義」を使って、デプロイと同じ処理をする

そもそもロールバックするための API が ECS には長らく存在しなかったため、このようにしてロールバック処理をエミュレートしていました。今回は ECS 自体に API が追加されたため、それに対応したということになります。

(ちなみに、DeploymentControllerが CodeDeploy の場合は以前から CodeDeploy 自体の APIロールバックを行っていました)

なお、デプロイが完全に完了してしまった場合は ECS でのロールバックができません。その状態で実行すると、以前と同様のアルゴリズムロールバックを行います。

tfstate参照で for_each / count で定義されたリソースをまとめて参照できるように

tfstate-lookup v1.7.0 で使えるようになった機能です。

これまで ecspresso での tfstate 参照では、for_each / count で定義されたリソースのアドレスを aws_subnet.private["az-a"] のようにindexまで指定する必要がありました。今回のアップデートで for_each で定義されたリソースは Object で、count で定義されたリソースは List で取得できるようになりました。

例えば subnet を for_each で定義する例を考えます。

resource "aws_subnet" "private" {
  for_each = {
    a = 1,
    b = 2,
    c = 3,
  }
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.${each.value}.0/24"
  availability_zone = "ap-northeast-1${each.key}"
}

このように定義したリソースは ecspresso から

  • {{ tfstate `aws_subnet.private["a"]` }}(テンプレート記法の場合),
  • tfstate('aws_subnet.private["a"]')(Jsonnetの場合)

などとして参照できますが、新たに aws_subnet.private というアドレスで object (key が index, value がそれぞれのリソース) として参照できるようになりました。

これを利用すると、例えば Jsonnet では以下のように std.objectValues で全ての value (リソース) を取得してループを回すような記述が可能になります。

local tfstate = std.native('tfstate');
{
  subnets: [
    subnet.id for subnet in std.objectValues(tfstate('aws_subnet.private'))
  ],
}

参照先の tfstate によってリソースの数やkeyが違うような場合にも、共通の定義ファイルで対応できますね。

挙動の変更

ecspresso deploy --wait-until deployed がデフォルトに

v2.5.0 での新機能で、deploy オプションに --wait-until=(deployed|stable) が追加されています。これはコントリビューションいただいた機能です。

www.estie.jp

v2.6 では、デフォルトで --wait-until=deployed が指定されるようになりました。

実は、最近のマネージメントコンソールでは --wait-until=deployed 相当(実行したデプロイメントが完了した時点) のタイミングで「デプロイが完了した」と報告されます。

以前のデフォルトである --wait-until=stable は新しいデプロイメントが完了した後、古いデプロイメントが完全に停止するまで待たされてしまうので、マネージメントコンソールでの体感と異なる状態になっていました。今回の変更で同一になります。

なお ecspresso には他にも --wait-until を持つコマンドがあります(scale, rollback, wait)が、それらのデフォルトは stable のままです。

不具合修正

ECS サービスに紐づいている LoadBlancer や ServiceConnect の設定をサービス定義から削除しても、実際には紐付けが削除されない問題を修正しました。


ということで、ecspresso v2.6.0 の紹介でした。どうぞご利用ください。