Amazon ECS デプロイツール、ecspresso v2.6.0 をリリースしました。
新機能
ECS Blue/Green デプロイ対応
これまで ECS では CodeDeploy と連携する形での Blue/Green デプロイがサポートされていましたが、先日 ECS deployment controller でのネイティブな Blue/Green がサポートされました。その対応が入っています。
使い方としては特にこれまでと変わらず、サービス定義ファイルに B/G 用の属性を追加して ecspresso deploy
するだけで使えるようになります。READMEを参照してください
実装は実は何も大変ではなかったので(ほぼSDKのバージョンを上げただけ) 即日 nightly バージョンをリリースしたところ、早速検証記事を書いていただけました。助かります! kakakakakku.hatenablog.com
rollback コマンドが進行中のデプロイメントを停止するように
2025年5月に、ECS 自体にロールバックのための仕組み(進行中のデプロイメントを停止する)が導入されました。ecspresso rollback
は可能な場合にはその API を利用してロールバックを行うようになりました。
これまでの ecspresso rollback
は、以下のような実装になっていました。
- 現在動作している ECS サービスに設定されているタスク定義を見つける
- そのタスク定義の「直前のリビジョン」(削除/無効化されていない、現在のリビジョンより小さく一番近い値のもの)を見つける
- 「直前のリビジョンのタスク定義」を使って、デプロイと同じ処理をする
そもそもロールバックするための 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)
が追加されています。これはコントリビューションいただいた機能です。
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 の紹介でした。どうぞご利用ください。