【AWS】CodePipelineでRailsのCI/CD環境を構築。CodeBuildも!

aws

こんにちは!

エンジニアのオオイシ(@mako_0705)です!

前回に引き続き、AWSでRailsのサーバーレス環境を構築していきます。

全体の流れのうちの本記事では、

  1. Railsのコンテナ作成
  2. ECRにコンテナpush
  3. データベース(Amazon RDS)の作成
  4. ECS + Fargate の構築
  5. CodePipeline で CI/CD 環境を作る ←今ここ

と言った位置付けです。

AWS CodePilelineCodeBuildとは、継続的インテグレーション(CI)と継続的デリバリー(CD)をするためのマネージドサービスです。

平たく言うと、ソース取得→コンパイル→テスト→リリース を自動でやります。

Jenkins(Pipeline)が有名ですがそのAWS版だと考えて置くと良いでしょう。

詳しくはAWS Black Beltを一読することをオススメします。

RailsのDockerイメージを作成していない場合やECRクラスタを作成していない場合は、

こちらの記事を参照してみてください。

CodePipelineでRailsのコンテナイメージをどのようにデプロイするか

AWS Codeシリーズは、

  1. CodeCommit(プライベートGitリポジトリ)
  2. CodeBuild(コードのコンパイルとテスト実行)
  3. CodeDeploy(デプロイ自動化)
  4. CodePileline(上記のプロダクトなどを連続に繋ぎ合わせて視覚化)

があります。

これらは全て使う必要はなく、必要に応じて使い分けます。

今回は、ソース管理はGitHub、CodeBuildでDockerイメージを作成、CodePilelineで手順化する構成することにしました。

なお、CodeDeployではBlue-Green Deploymentが可能ですが別の機会に紹介したいと思います。

デプロイの流れ

繰り返しになりますが、CI/CDの全体の流れは次のようにシンプルな構成です。

  1. プログラムを作成または修正してGitHubにPush
  2. CodePilelineが自動に検知してCodeBuildを起動
  3. CodeBuildはDockerイメージを作成してECRへPush
  4. CodePilelineはECSを更新

のような流れになります。

CodePilelineの構築手順

手順を解説していきます。

(STEP1)buildspec.ymlを作成する

buildspec.ymlは、CodeBuildを使ってプログラムやDockerイメージなどのリリース物を作成する手順を記載するものです。

アプリケーションのルートディレクトリに設置します。

AWSのドキュメントに詳しい解説があります。

AWSのサンプルそのままですが今回はこのように記述しました。

buildspec.yml:

GitHubへpushしておきます。

(STEP2)CodeBuildのプロジェクトを作成する

dockerイメージを作成するためのビルドプロジェクトを作成します。

プロジェクト名は任意です。

ソースプロバイタはプログラムの保存場所のことです。

今回はGitHubを指定して対象のリポジトリを登録します。

ウェブフックはCodeBuildを起動するトリガーを記述します。

今回はgit pushのときにCodePilelineが起動しますが、pull requestやmergeのタイミングなど詳細に指定できます。

環境コードビルドを実行する環境を指定します。

マネージド型はEC2でUbuntu一択。任意のDockerイメージも指定できます。

通常はマネージド型でよいでしょう。

Dokerイメージを作成する場合はrootを仕様するため特権付与をチェックしてください。

環境変数buildspec.ymlへ渡すための情報を記述します。

「パイプラインを作成する」をクリックします。

CodeBuildの設定は以上です。

(STEP3)CodePipelineを作成する

「パイプライン名」は任意です。

わかりやすい名前をつけましょう。

ソースステージ(プログラムのソースの取り扱い)ではGitHubを指定します。

GitHubのリポジトリとブランチを指定。

本番またはテスト環境毎のブランチを指定するとよいでしょう。

ビルドステージでは、Dockerイメージを作成してECRへPushするためのプロジェクトを指定します。

デプロイ先は別記事のECR作成編で紹介したクラスタを指定します。

イメージ定義ファイルはbuildspec.ymlで定義したjsonを指定してください。

imagedefinitions.jsonはDockerイメージの保存先が記述された情報です。

「パイプラインを作成する」をクリックすると完了です。

簡単ですね!?

CodePipelineでリリースしてみる。

実際にリリースできるか実行してみましょう。

「変更をリリースする」をクリックします。

動き出しました!

各ステージで緑色になれば、次のステージに進みます。

この画像はCodeBuildが実行中の状態でDockerイメージを作成しているところです。

「詳細」をクリックした状況を見てみましょう。

このように、buildspec.ymlにしたがってdockerイメージが作成されている状態が確認できます。

デプロイステージまで進むとECRへのデプロイが開始されている状態です。

ECRのタスクの状態を見てみましょう。

この例では、新たなイメージがデプロイされいる状況がわかります。

しばらくするとECの機能により新たなコンテナに切り替わります。

GitPushしてCodePileラインを起動してみよう

詳細は割愛しますが、GitHubへpushすると自動的にCodePileラインが実行され流ので試してみましょう。

次にすべきこと

CodePipelineを使ってCI/CD環境を簡単に作る方法について紹介しました。

今回は、git push してから自動的にリリースする方法についての解説ですが、実際には、

自動テストでNGの場合はビルドさせないようにしたり、上長承認しないと先に進めないようにしたり、Slack通知させたりとカスタマイズ可能です。

実運用で使えるように色々試してみましょう!