ecspresso で CloudFormation のリソース読み込みに対応 + その他機能追加した v1.3.0 をリリースしました

あけましておめでとうございます。Amazon ECS デプロイツール ecspresso の v1.3.0 をリリースしたのでお知らせです。

[2021-01-16 追記] v1.3.0 は init コマンドでクラッシュする問題があります。v1.3.1 をご利用ください。

今回は機能追加が盛り盛りなので、まとめて紹介します。

Release v1.3.0 · kayac/ecspresso · GitHub

【新機能】 cloudformation プラグインを追加

これまで ecspresso は Terraform tfstate を読み込んでそのリソース名から属性値を解決できる機能を持っていましたが、CloudFormation でも同様の処理ができるようになりました。

README に例がありますが、次のように Output と Export を定義したテンプレートで構築された、Stack 名が ECS-ecspresso という CloudFormation stack がある場合に

Outputs:
  SubnetAz1:
    Value: !Ref PublicSubnetAz1
  SubnetAz2:
    Value: !Ref PublicSubnetAz2
  EcsSecurityGroupId:
    Value: !Ref EcsSecurityGroup
    Export:
      Name: !Sub ${AWS::StackName}-EcsSecurityGroupId

ecspresso の設定ファイルで cloudformation plugin を指定すると

plugins:
  - name: cloudformation

定義ファイルで cfn_outputcfn_export という関数が使用可能になります。cfn_output スタック名 OutputKey で Outputs の値を名前で解決できます。cfn_export エクスポート名 で、エクスポートされた値を名前で解決できます。

サービス定義での使用例は次のようになります。

{
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "{{ cfn_output `ECS-ecspresso` `SubnetAz1` }}",
        "{{ cfn_output `ECS-ecspresso` `SubnetAz2` }}"
      ],
      "securityGroups": [
        "{{ cfn_export `ECS-ecspresso-EcsSecurityGroupId` }}"
      ]
    }
  }
}

ご意見をくださった @torics さん、@hamako9999 さん、@_sisisin さん、ありがとうございました!

【新機能】scale コマンドを追加

これまでサービスのタスク数を変更するためには deploy --no-update-service --skip-task-definition --tasks タスク数 を指定していましたが、これをショートカットにした scale コマンドを追加しました。

$ ecspresso --config config.yaml scale --tasks 10

これで ecspresso --config config.yaml deploy --no-update-service --skip-task-definition --tasks 10 とおなじ意味になります。

タスク数だけを変えたい場合でも指定するオプションが多いため、うっかりサービスやタスクを更新してしまう事例がありました。scale コマンドを使用すると必要なのは --tasks のみ(必須) になるため、事故を防げます。

【新機能】tfstate plugin が URL を直接読み込めるようになりました

これまで tfstate plugin はローカルファイルの読み込みのみが可能でしたが、直接 s3, http(s) URL からも読み込めるようになりました。デプロイする環境に terraform.tfstate が存在していない場合、これまではわざわざ aws s3 cp などでローカルにコピーする必要がありました。

plugins:
  - name: tfstate
    config:
      url: s3://my-bucket/terraform.tfstate

tfstate-lookup コマンドも v0.1.0 で URL からの tfstate 読み込みをサポートしています。 https://github.com/fujiwara/tfstate-lookup/releases/tag/v0.1.0

【新機能】設定ファイルで required_version が使用可能に

特定のバージョン以降で追加された機能を要求する場合など、ecspresso のバージョンに制約を持たせたい場合に設定ファイルで使用できる機能です。

required_version: ">= v1.3.0, < v2"

このように semver で指定することで、条件を満たしていないバージョンの ecspresso で実行しようとするとエラーになります。hashicorp/go-version を使用しています。

この機能をサポートしていない v1.3.0 未満のバージョンでは無視されるため、v1.3.0 がリリースされた時点では指定する意味はありません。将来新しいバージョンがリリースされ、その時点で入った機能や修正に依存した処理があるためそれ未満のバージョンでは実行させたくないような場合に役に立つ予定です。

PR を送ってくださった mashiike さん (同僚) ありがとうございました!

【新機能】run コマンドでタスクにタグが付けられるように

ecspresso run --tags Foo=Bar で、実行するタスクに Foo という名前のタグが Bar という値で設定されます (複数指定可能)。

ecspresso run --propagate-tags=(SERVICE|TASK_DEFINITION) で、実行するタスクに付けるタグをサービス定義もしくはタスク定義から引き継ぐことができます。

実は現状では、ecspresso でタスク定義を登録する際にはタグを附与することができません。これは定義ファイルを SDKecs.TaskDefinitionマッピングしていて、この構造体にはタグの定義がないためです。(サポート方法を悩みつつ、具体的な需要が今のところないので何もしていません)

その他修正いろいろ

  • [Fix] Unable to update platformVersion and networkConfiguration for CodeDeploy services. #209
    • CodeDeploy でデプロイする際に、--update-service を付けていても platformVersion と networkConfiguration が変更できなかった問題を修正しています。
  • [Fix] diff command becomes to compare local task definition and remote task definition. #218
    • diff コマンドが比較するタスク定義のリモート(ECS)側が、これまで latest (一番リビジョンが大きい) のものになっていましたが、サービスが現在使用しているリビジョンのものと比較するようになりました。
  • [Fix] Support to Docker Registry V2 API. Enables to read any public image repository using V2 API. (public.ecr.aws, gcr.io, ghcr.io and etc.) #214 #213
    • ECR Public repo など、一般の公開 image を verify できなかった問題を修正しています。Docker Registry API V2 を利用している任意の公開リポジトリの image が存在検証できます。
    • この修正に伴って、verify に 必要な IAM 権限から ecr:ListImages が不要になりました。

ecspresso handbook も改訂予定

昨年末に公開した ecspresso handbook ですが、こちらも v1.3.0 の新機能へ追従して近日改訂予定です。ご購入の方はそのままお読みいただけます。まだの方は是非この機会にお求めください。

zenn.dev