ecspresso v1.4.0 をリリースしました - 酒日記 はてな支店

ecspresso v1.4.0 をリリースしました

Amazon ECS のデプロイツール、ecspresso の v1.4.0 をリリースしたのでお知らせです。

github.com

今回はそこまで大きな機能追加はないのですが、地味に嬉しい機能が入っております。どうぞご利用ください。

run コマンドに --overrides-file が追加

単体タスクを実行する run コマンドに、--overrides-file オプションが追加されました。

タスク実行時に上書きするコマンドや環境変数は、これまで --overrides オプションでJSON文字列として渡す必要がありましたが、これが結構複雑な構造をしているので組み立てが面倒でした。

{
    "containerOverrides": [
        {
            "name": "foo",
            "command": ["my-command"]
        }
    ]
}

こんな構造なので、CLI で渡すのはだいぶ煩雑です。ということで、あらかじめファイルとして JSON を記述しておいて、それを --overrides-file で指定することができるようになりました。また、このファイルは他の ecspresso の定義ファイルと同様、テンプレートとして解釈されます。

{
    "containerOverrides": [
        {
            "name": "foo",
            "command": ["{{ must_env `COMMAND` | json_escape }}"]
        }
    ]
}

このように環境変数COMMAND という値を展開するように定義しておけば、コマンドだけを変更したい場合に以下のように実行できます。便利!

$ COMMAND="echo hoge" ecspresso run --overrides-file overrides.json ...

verify コマンドに --no-get-secrets オプションが追加

ecspresso verify でのタスク定義の検証時に、これまでは secrets の値が SSM パラメータストアや SecretsManager に存在して読み取れる必要がありました。権限的に読み取れない場合は verify が失敗してしまいますが、値によっては verify を行う環境からは読ませたくない、という要望がありました。

--no-get-secrets オプションを指定すると、secrets が読み取れるかどうかの検証をskipします。

--envfile オプションが追加

ecspresso の各種定義ファイルでは環境変数を展開できる機能があり、動作のカスタマイズには欠かせない機能です。

しかし、複数の環境に対するデプロイを1つの定義ファイルで行う場合には ecspresso 実行環境変数を定義し直す必要があります。これはちょっと面倒な場合があるため、あらかじめ環境変数を定義した envfile を指定できるようにしました。

指定できるファイルは一般的な .env 形式で、export は付いていてもいなくても同様に動作します。

export FOO=foo
BAR=bar

envfile のパースには hashicorp/go-envparse を使用しています。hashicorp のライブラリ、いつもながら渋いけど便利ですね。

github.com

init コマンドに --force-overwrite オプションが追加

指定すると、init コマンドでの定義ファイル出力時に、既にファイルが存在していても確認なしで上書きします。

ecspresso の構成管理ファイルをバックアップ目的でリポジトリ管理していて、それを自動化する場合には確認なしで上書きしたいことはありますね。

テンプレート関数に tfstatef が追加

Terraform state file をテンプレートから参照する機能で tfstate 関数がありますが、tfstatef という関数が追加されました。これは要するに print に対する printf です。resource.name["foo"].id のような参照を行う場合に、部分的に文字列を変数から組み立てたい場合に便利です。

例えば環境変数 AZ を使用して aws_subnet.public['$AZ'].id というリソース名を tfstate から参照したい場合、従来は printf で組み立てた文字列を tfstate 関数で渡す、という若干のテンプレート芸が必要でした。

{{ printf `aws_subnet.public['%s'].id` (must_env `AZ`) | tfstate }}

これが、以下のように分かりやすく記述できます。

{{ tfstatef `aws_subnet.public['%s'].id` (must_env `AZ`) }}

verify 時にタスク実行ロールに assume できない場合の警告を warning から info に変更

verify コマンド実行時、ecspresso はタスク実行ロールに assume role を試みて、成功したらタスク実行ロールで、失敗したら現在の権限で検証を行います。

タスク実行ロールに assume することでより確実な検証が行えるのですが、assume role できる設定をわざわざ行わない場合は毎回以下のような警告が(黄文字で)出力されてしまいます。

WARNING: failed to assume role to taskExecutuionRole.

実際にはこれは害があるとまでは言い切れない警告だったため、ログレベルを INFO に変更しました。

作者の周囲でも、この警告が出ていてもほとんど全員が無視するという結果が観測されたため、WARNING を無視させる習慣を付けてしまうのは望ましくない、という理由もあります。

リリースバイナリを Go 1.16 でビルド

Go 1.15 から Go 1.16 に変更しました。今回から、M1 macdarwin むけ arm64 バイナリも同時にビルドしています。


ecspresso handbook も改訂予定です

zenn.dev

v1.4.0 で追加、変更された機能については、ecspresso handbook でも順次改訂予定です。