CodeBuild/CodeDeployをCodePipelineで繋げてデプロイを自動化する


はじめに

複数のアプリケーションを作っているとアプリケーションごとにビルド・デプロイ環境があると思います。
弊チームでは各アプリケーションごとにビルド・デプロイ環境がEC2だったりローカル環境だったりと異なり、個人によってはインストールされているバージョンが違うことによりビルド・デプロイに失敗することがあり、デプロイ作業が属人化しかけ問題に感じていました。
また、新しいメンバーが増えた際に環境を整えてもらう必要があります。
1度環境を整えてしまえば問題はありませんが、CodeBuildとCodeDeployをCodePipelineで繋げてデプロイを自動化しました。

CodeBuild

CodeBuildにbuildspec.ymlが必要になります。

buildspec.yml

CodeBuildがビルド時にどのように動作するかを記述したファイルになり、プログラムのルートディレクトリに配置します。
buildspec.ymlの書き方は、CodeBuild のビルド仕様に関するリファレンスを参考にしてみてください。

設定

ビルドプロジェクトを作成してみます。
プロジェクトを設定します。

ビルドするソースを選択します。

ビルドする環境を選択します。
AWSが用意したマネージド型イメージとDockerイメージを使うカスタムイメージを選択できます。
今回はマネージド型イメージを選択し、OS・ランタイム・イメージ・バージョンを選択します。

VPC内の特定のSubnet内でビルドしたい場合はVPC・Subnetを選択できます。VPCエンドポイントによる接続もできるようになります。
環境変数を渡すこともできます。

ビルドの仕様を選択します。

ビルドしたソースの出力先を選択します。

ビルドしたログをCloudWatchLogsに出力できます。

CodeDeploy

CodeDeployにはCodeDeploy Agentappspec.ymlが必要になります。

CodeDeploy Agent

デプロイ対象のEC2インスタンスにCodeDeploy Agentをインストールされ、サービスが起動している必要があります。

###CodeDeploy Agentのインストール
# wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
# chmod +x ./install
# ./install auto

###自動起動設定確認
# systemctl list-unit-files -t service | grep codedeploy-agent.service 
codedeploy-agent.service                      enabled 

appspec.yml

CodeDeployがデプロイ時にどのように動作するかを記述したファイルになり、プログラムのルートディレクトリに配置します。
appspec.ymlの書き方は、CodeDeploy AppSpec File リファレンスを参考にしてみてください。

設定

アプリケーションとデプロイグループを作成してみます。
まずアプリケーションを作成します。

デプロイグループを作成します。

インスタンス名が『deploy』というインスタンスにデプロイしたい場合は以下のように選択し、デプロイ設定を選択します。

CodePipeline

上記で作ったCodeBuildのビルドプロジェクトとCodeDeployのアプリケーションをCodePipelineで繋げます。

設定

パイプラインを作成し、上記で作成したCodeBuildのビルドプロジェクトとCodeDeployのアプリケーション・デプロイグループを繋げます。
パイプラインの設定を選択を行います。roleがない場合は新規作成できます。

ソースの取得元を選択します。
CodeCommitやGitHubなどが選択でき、リポジトリやブランチを選択できます。

上記で作成したCodeBuildのビルドプロジェクトを選択します。

上記で作成したCodeDeployのアプリケーション・デプロイグループを選択します。

まとめ

今回はCodeBuildのビルドプロジェクト作成、CodeDeployのアプリケーション・デプロイグループの作成を行い、それぞれを繋げるパイプラインをCodePipelineで作成しました。
ブランチにpushするとパイプラインがhookされ、自動でビルドを行いデプロイされます。
パイプラインを作成してしまえばとてもデプロイが楽になり、これまで感じていた不が解消されました。

最後に

CodeBuildやCodeDeployでハマったところもあるので、どのように対応したか今後紹介したいと思います。