概要
AWS ECSを運用するために内製で開発したデプロイツールを公開しました。
リポジトリ
何ができるのか
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に通知されます。