capistrano
AWS
Jenkins
docker

AWS + Docker + Jenkins = 同一サーバで複数ドメインの開発環境構築

株式会社オズビジョン@smiraxです。

以前新規事業を立ち上げた際に開発環境周りでいろいろと苦労をしました。
その中でもうまくいったなーと思う一例があったのでそちらを紹介しようと思います。

課題

開発している環境で当時課題に上がっていたのが
「サーバにデプロイしたいです。12~13時の間使わせてください」
というデプロイ予約。

本番へのデプロイであれば、下手にチーム内で混乱がおきないようにするために必要な声かけかもしれません。
ですが開発環境でわざわざデプロイの予約をしなくてはいけないのはめちゃくちゃ面倒です。
さらにこの予約が混み合えば
「今日デプロイできなかったので明日にします」
こんな結果になってしまえばこれほど時間の無駄はないです。

対策

そこで対策として私が取った方法が
Dockerを使って複数ドメインの開発環境を作ること でした

環境

・AWS
・Docker
・Jenkins
・Capistrano
(※Capistranoで、AWSへのデプロイができることが肝になっています。)

サーバ側方法

EC2インスタンスにDockerをインストールします。
(色々な方が記載していると思うのでインストール方法などは割愛します)

Dockerはポートフォワーディングができるので複数のポートを開けてrunしておきます。

複数ポートで起動し、アクセスの確認をしたらAWSコンソールで、新しくELBを作ります。

Dockerで開けたポートと同じ数ELBを用意します。
このとき、ELBにもポートフォワーディングがあるので、Dockerで開けたポートと同じように設定します。

あとは作成したそれぞれのELBに起動したEC2インスタンスを接続します。

そうすることで、それぞれのELBにアクセスすれば、ポートフォワーディングされて同一インスタンスの中の別コンテナにアクセスできるようになります。

あとはAWSのRoute53を使って、それぞれのELBに対して設定をすれば終了です。

Jenkins側方法

Jenkins側ではGitHubにpushしたユーザ名を取得します。
そのユーザ名を判別し、デプロイするときに必要なファイルを書き換えます。
(当時はsymfonyを使っていたのでparameters.ymlを書き換えてました)

デプロイするサーバのディレクトリも、GitHubのユーザごとに分けて自動で作成するように設定をします。
またデプロイするときに、Dockerコンテナを自動で作り直すようにしておけば常に綺麗な状態を保てるので、自分は作り直してました。

やってみて

Jenkinsを使ったデプロイを1から構築してみて、正直わからないことばかりでしたがかなり勉強になりました。
正直もっといい方法があるような気がしなくもないですが、自分の中では結構満足しています。
EC2インスタンスを複数用意する必要もなく、少しはコストの削減もできたなーと思ってます。


次は弊社に第二新卒で入社したEngがredashについて記載してくれるようです!
弊社集計の基盤となっているものをガリガリ使っているのでどんな内容になるのか楽しみですー!