Help us understand the problem. What is going on with this article?

ECSデプロイツールを公開しました

概要

AWS ECSを運用するために内製で開発したデプロイツールを公開しました。

リポジトリ

https://github.com/metaps/genova

何ができるのか

Slack botに対し deploy と打つと、ECSクラスタに対象となるソースをデプロイします。またコマンドベースのデプロイやGitHubのPushをトリガーとした自動デプロイもサポートします。

機能詳細

  • サービスやタスクスケジューリングのデプロイ、タスク実行をサポート
  • YAMLベースのタスク定義
    • 環境変数に渡した秘匿値の暗号化・復号に対応 (KMS)
  • デプロイ形式
    • Slackを用いた対話形式のデプロイ
    • コマンドベースのデプロイ
    • GitHubのPushをトリガーとした自動デプロイ
  • デプロイ状況を可視化するWebコンソールの提供
  • デプロイコマンドが実行する処理
    • イメージのビルド
    • イメージのプッシュ (ECR)
    • タスクのデプロイ

図解。

Webコンソールはデプロイの状況を可視化します。「誰が」「いつ」「どこに」「何を」デプロイしたか、ひと目で把握することができます。

詳細ページからはデプロイの状況を確認できます。

設定ファイル

デプロイ設定ファイルとタスク定義ファイルを作成する必要があります。詳しくは Wiki を参照してください。

タスク定義ファイル

アプリケーションディレクトリ下に config/deploy/{services}.yml を作成します。名前は何でも構いません。ファイルにはコンテナごとのタスク仕様を定義します。指定可能なパラメータは タスク定義パラメータ と同じです。
環境変数にパスワードなどの秘匿値を渡す場合、KMSで暗号化した値を指定すると良いでしょう。値はデプロイのタイミングで復号され、環境変数として展開されます。

family: sandbox-productiton
task_role_arn: ''
network_ode: bridge
container_definitions:
- name: app
  image: ***.dkr.ecr.ap-northeast-1.amazonaws.com/sandbox-app-production:{{tag}}
  memory: 1024
  port_mappings:
  - container_port: 3000
    host_port: 0
    protocol: tcp
  essential: true
  environment:
  # Private value can be encrypted with KMS
  - name: SECRET_KEY
    value: ${***}
  readonly_root_filesystem: false
  log_configuration:
    log_driver: fluentd
    options:
      fluentd-address: ***:24224
      fluentd-async-connect: "true"
      tag: docker.sandbox-app-production

デプロイ定義ファイル

デプロイルールを定義した config/deploy.yml ファイルを作成します。clusters にアプリケーションのデプロイ先となるクラスタやサービスを定義します。

clusters:
  # クラスタ名
  - name: sandbox
    services:
      # サービス名
      production:
        # タスク定義ファイルの相対パス
        path: ./config/development.yml

        # コンテナごとのビルドファイル指定
        containers:
        - name: web
          build:
            # etc/docker/web/Dockerfileを参照
            context: ../etc/docker/web

デプロイ形式

コマンドベースのデプロイ

対象リポジトリ・クラスタ・サービス (必要があればブランチ) を指定することで、デプロイが始まります。

$ docker-compose run --rm rails thor genova:deploy service -r {repository} -c {cluster} -s {service} -b master

Slackを用いた対話形式のデプロイ

Slack Appをセットアップすることで、deploy コマンドで対話形式のデプロイが始まります。

GitHubのPushをトリガーとした自動デプロイ

Pushイベントをトリガーとして特定のサービスに対し自動デプロイが走ります。

auto_deploy:
- branch: master
  cluster: sandbox
  service: production

この設定は「masterブランチへのPushを検知した時、sandboxクラスタのproductionサービスをデプロイする」という意味になります。また実行結果はSlackに通知されます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away