CodePipeline と Slack による ECS ChatOps 運用

この記事は ECS ChatOps with CodePipeline and Slack の日本語訳です

現在、Rails アプリケーションを ECS に移行する作業を進めています。現在のシステムでは Capistrano でデプロイを行っていますが、そろそろ限界が見えてきました。

EKS が使えるようになるのを待っている間、自分で Kubernetes のクラスターを管理するより ECS を採用することに決めました。当初、Lambda 関数を使って必要なタスク定義を作り、ECS サービスを更新する予定でしたが、プロジェクトの設計を開始する直前に CodePipeline の ECS デプロイの対応が発表されました 🎉。

現在のリソースは、CodePipeline と Slack を連携するためのいくつかの Lambda 関数、サービスごとに2つのCodePipeline パイプライン(本番用と検証用)、関連 ECS リソースです。

まず、デプロイするには、Slack チャンネルに deploy [environment] [service] と発言すると起動します。Slack は(API Gateway 経由で)Lambda にイベントを送信し、Lambda は CodePipeline パイプラインの実行を開始します(CodePipeline API の仕組み上、複数の同時実行は扱いにくい)。この Lambda 関数は、DynamoDB のいくつかの基本的な状態(Slack チャンネル、ユーザー、タイムスタンプ)を記録します。この情報は、返信を送信するチャンネルと、デプロイプロセスの何かがステータスが変わったり失敗した場合に通知するために使われます。

CodePipeline がまず、Docker イメージを作成する CodeBuild を起動し、タスク定義を更新するための新しい Docker イメージのタグが入った単純な JSON ファイルを生成します。

CodeBuild が終了すると、デプロイを続行する前に人の承認を要求するために「手動承認」アクションが使用されます。ここの例では検証環境用に有効にしていますが、通常は本番環境でのみ使用されます。本番環境では、まず1台のカナリアデプロイ、次に25%、残りの75%という三段階で運用しています。

残りの部分は比較的単純です。CodePipeline がイメージをデプロイするように ECS に指示します。途中でエラーが検出された場合、rollback コマンドを使用して手動で変更をロールバックします。

デプロイが完了すると、Lambda 関数がデプロイ用チャンネルにメッセージを送信します。

このようなシステムを作ることに興味があれば、弊社ではインフラおよび開発エンジニアを探しています(東京)。興味がある方はお問い合わせフォームから連絡してください。会社の詳細はこちら

.gitignore と .gitignore_global の分け方

(If you aren’t interested in my posts written in Japanese, please subscribe to the “English” feed.)

Git のレポジトリーの中の .gitignore というのは、レポジトリーにコミットしない(無視する)ファイルを定義するものです。

Git のバージョン管理システムでは、二つの gitignore ファイルがあります。一つ目の一番知られてるのはレポジトリー内の。こちらは、プロジェクトのルートダイレクトリーに置かれて、そのプロジェクトに対する無視するファイルなど定義されています。

一方、デフォルトで全てのプロジェクトに適用する gitignore ファイルも設定できます。「グローバル gitignore」と呼びます。

ターミナルで、下記のコマンドを打って

$ git config --global core.excludesfile ~/.gitignore_global

~/.gitignore_global のファイルに全てのプロジェクトに適用する gitignore コンテンツを入力します(ファイルが存在しない場合は作成する)。

こちらの使い分けについてですが、基本的には

  • プロジェクト内 gitignore ⇒ プロジェクトと直接関する定義。例えば、ビルドで作られるテンポラリーファイル、テスト時の自動で生成されるキャッシュファイル、ログファイルなど。
  • グローバル gitignore ⇒ 当ローカル環境に関する定義。例えば、 OS X なら .DS_Store のファイルなど、 vim が作る *.swp のファイルなど。

.DS_Store*.swp の定義をプロジェクト内の gitignore に入れるケースも少なくはないと思いますが、こちらは間違っています。一人一人開発環境が違うので、責任を持って自分の開発環境の無視するべきファイルをグローバル gitignore に定義した方が良いでしょう。