ecspresso で設定ファイル生成と CodeDeploy による Blue/Green デプロイに対応した

ecspresso は筆者が開発している Amazon ECS 用のデプロイツールです。

github.com

最近 AWS DevDay Tokyo 2019 の「第1回 AWS Fargate かんたんデプロイ選手権」でも紹介していただいて、気をよくして最近あれこれ機能追加をしていたのでそのご紹介です。

speakerdeck.com

分かりやすい導入記事をクラスメソッドさんの blog で書いていただきましたのでこちらもどうぞ。

dev.classmethod.jp

設定ファイル生成機能

ecspresso init で、既存の ECS サービスの情報を引っこ抜いて定義ファイルを生成し、そのまま ecspresso deploy できるようになりました。(v0.11)

README の Quick Start にもあるように、region, cluster, service, config を指定して (適切な credential がある状態で) 実行すると、以下の3ファイルをカレントディレクトリに生成します。

  • ecspresso の設定ファイル
  • ECS サービスの定義ファイル
  • サービスに設定されているタスク定義ファイル

特に動作しているサービスに影響はしないので、稼働中のサービスに対して実行しても問題ありません。

$ ecspresso init --region ap-northeast-1 --cluster default --service myservice --config config.yaml
2019/10/12 01:31:48 myservice/default save service definition to ecs-service-def.json
2019/10/12 01:31:48 myservice/default save task definition to ecs-task-def.json
2019/10/12 01:31:48 myservice/default save config to config.yaml

その後、そのまま deploy を行うと、新しいタスク定義を登録してサービスを更新し、デプロイが行われます。簡単!

$ ecspresso deploy --config config.yaml

実運用するには、タスク定義ファイルに {{ must_env "IMAGE_TAG" }} のような記法でデプロイごとに更新されるであろう部分に環境変数を展開するように記述しておき、実行時の環境変数設定でタスクを更新するのがお勧めです。

他のツールや、AWSコンソールからポチポチで作ってしまった ECS サービスやタスク定義を、簡単にコードによる管理に落とし込むことができます。もし ecspresso の使用をやめるとしても特に何も起こらないので、気軽にお試しいただけます。

CodeDeploy による Blue/Green デプロイに対応

これまで ECS の機能によるローリングデプロイのみに対応していましたが、Blue/Green デプロイを行いたいという要望があったので、AWS CodeDeploy によるデプロイにも対応しました。(v0.12)

{
  "deploymentController": {
    "type": "CODE_DEPLOY"
  },

サービス定義で deploymentController.type = "CODE_DEPLOY" となっている場合、ecspresso deploy を実行すると CodeDeploy に新しい Deployment を作成します。その後の進行は CodeDeploy 側で行われます。

$ ecspresso deploy --config config.yaml --rollback-events DEPLOYMENT_FAILURE
2019/10/15 22:47:07 myService/default Starting deploy
Service: myService
Cluster: default
TaskDefinition: myService:5
TaskSets:
   PRIMARY myService:5 desired:1 pending:0 running:1
Events:
2019/10/15 22:47:08 myService/default Creating a new task definition by ecs-task-def.json
2019/10/15 22:47:08 myService/default Registering a new task definition...
2019/10/15 22:47:08 myService/default Task definition is registered myService:6
2019/10/15 22:47:08 myService/default desired count: 1
2019/10/15 22:47:09 myService/default Deployment d-XXXXXXXXX is created on CodeDeploy
2019/10/15 22:47:09 myService/default https://ap-northeast-1.console.aws.amazon.com/codesuite/codedeploy/deployments/d-XXXXXXXXX?region=ap-northeast-1

ログはこんな感じになり、最後に CodeDeploy の AWS Console の URL が出力されています。端末で実行していて、かつ open コマンドが存在する場合には、open $url を実行することでブラウザの画面が開きます。

ecspresso create でサービスを新規作成する場合には、CodeDeploy のリソース (Application, DeploymentGroup) は特に作成はしないので、なんらかの方法で (コンソールポチでも aws cli でも Terraform でも CloudFormation でもお好みで) 各自作成してください。

ecspresso deploy 時にはサービスに対応する CodeDeploy Application / DeploymentGroup を自動的に見つけて、それに対して新規デプロイを発行します。


ということで、ecspresso の最近の新機能の紹介でした。ECS のデプロイ、タスク定義管理に悩んでいる方がいらっしゃいましたら、どうぞご利用ください。