2023/10/15AWS CodeCommitで通知ルール・トリガーを作成する
2023/09/08
初めてのAWS CodeBuild
この記事ではCodeBuildを使用してビルドタスクを走らせる方法を解説していきます。CodeBuildに興味を持っている方、普段は他のCI/CDツールを使用しているが、AWSのCI/CDツールが気になっている方、AWS認定試験を受けようとしている方必見です!
AWS CodeBuildとは
AWS CodeBuildはAWS上で動作するフルマネージド型のビルドサービスとなります。ソースコードのコンパイルからユニットテスト、デプロイ用の資材の作成などを実施することができます。また、NodeやGradleなど一般的なプログラミング言語やビルド用のパッケージが準備された環境を容易に使用することができます。
AWS CodeBuildの利点
CodeBuildはフルマネージド型のサービスのため、ビルドサーバーのセットアップやパッチ適用などの管理を実施する必要がありません。また、課金はビルド時間に対して発生するため、固定で料金を支払う必要がありません。使った分のみ支払えばいいのです。
AWS CodeBuildを使ってみる
ここからはCodeBuildを使用してビルドを開始させるところまでを解説していきます。
ビルドプロジェクトを作成する
まずビルドプロジェクトを作成しましょう。
AWSコンソール画面の検索から「CodeBuild」と検索し、CodeBuildのプロジェクト作成画面を表示します。
「プロジェクトの作成」ボタンをクリックして下さい。
「ビルドプロジェクトを作成する」画面が表示されたら、まず「プロジェクトの設定」セクション内の「プロジェクト名(今回は「Web AppCodeBuild」)」を入力します。オプションとなるところに関しては入力する必要があれば実施してください。
次に「ソース」セクションでビルドに使用するソースコードの設定をしていきます。
「ソースプロバイダ」では使用するソースコードのリポジトリが存在するGitサービスを選択します(今回は「AWS CodeCommit」に存在するリポジトリを使用します)。
「リポジトリ」では使用するリポジトリを選択します(今回は「webpage」というリポジトリを使用します)。
「リファレンスタイプ」ではソースコードのバージョンを参照する際の種類を選択していきます(今回は「ブランチ」を選択します。)。
「ブランチ」では使用するGitブランチを選択します。
「ソースバージョン」はここまでの入力に合わせて、参照するソースのバージョンが表示されます。
次に「環境」セクションの設定をしていきます。
CodeBuildはコンテナ上で動作するサービスのため、まずは使用するイメージに関する設定をしていきます。
「環境イメージ」は特別要望がなければ「マネージド型イメージ」を選択します。
「オペレーティングシステム」はビルドに使用するOSを選択します。2020/11/1時点では「Amazon Linux 2」、「Ubuntu」、「WIndows Server 2019」が使用できます。今回は「Amazon Linux 2」を使用します。
「ランタイム」は「Standard」を設定し、「イメージ」はコンテナで使用したいOSイメージを選択しましょう。今回は「aws/codebuild/amazonlinux2-aarch64-standard:1.0」を使用します。「イメージのバージョン」は使用するイメージのバージョンに関する設定です。特別要望がなければ最新のイメージを使用するべく、「このランタイムバージョンには常に最新のイメージを使用してください」を選択します。
「サービスロール」はCodeBuildのIAMロールの設定です。まだ、特にCodeBuildのIAMロールを作成していなければ「新しいサービスロール」を選択し、ロール名を入力していきましょう(今回は「codebuild-WebAppCodeBuild-service-role」とします)。
環境の追加設定で設定する必要があれば設定していきます(今回はデフォルトの状態のままでいきます)。ここで、ビルド時間のタイムアウト設定やビルドする際の環境に渡す環境変数、ファイルシステムの設定等を実施します。
CodeBuildプロジェクトからアクセスするVPCまで選択できるようですね!
ネットワークの制御までできて便利ですね〜
次に「Buildspec」セクションの設定をしていきます。CodeBuildでは使用するリポジトリのソースコードのルートディレクトリ配下に「buildspec.yml」というファイルを配置する必要があります。このbuildspec.ymlファイル内でCodeBuildで実施する具体的なタスクを定義していくのです。
※配置するbuildspec.ymlファイルについては後ほど解説します。
もし、buildspec.ymlファイルとは異なる名前のファイル名でCodeBuildのタスクを定義していきたい場合は「Buildspec名」でそのファイル名を入力していきます。buildspec.ymlでソースコード内に配置している場合は特に指定する必要はありません。
今回は「バッチ設定」セクションや「アーティファクト」セクションはデフォルトの状態のままでいきます。
最後に「ログ」セクションで「CloudWatch Logs」にチェックを入れます。CodeBuildでのビルドの状態をCloudWatch Logsに出力させるかどうかという設定です。一通り設定が完了したら「ビルドプロジェクトを作成する」ボタンをクリックします。
buildspec.ymlファイルを作成する
次に先ほど少し説明したCodeBuildのタスクを定義していく「buildspec.yml」ファイルを作成し、CodeBuildのビルドプロジェクトの作成で設定したリポジトリ・ブランチ内のソースコードに含めていきます。
まずはCodeBuildで設定したリポジトリのブランチのルートディレクトリ配下にbuildspec.ymlファイルを作成します。
私が先ほど設定したwebpageリポジトリのmasterブランチは以下のような構成になっています。
webpage/
- scripts/
- appspec.yml
- buildspec.yml
- index.html
また、buildspec.ymlファイルは以下のように設定しました。
「version」は「0.2」を設定します。「phases」の中で実際に実行するコマンドを定義していきます。
installフェーズではビルド環境でのパッケージのインストールを実施するコマンドを定義していきます。「commands」の部分にインストールコマンドを定義しましょう(今回は文字列の表示のみにします)。installフェーズの中の「runtime-versions」ではランタイムを指定できます。指定できるランタイムはAWS公式ページを参照してください。今回はnodejsのバージョン10を指定します。
pre_buildフェーズではビルドの前にCodeBuildで実行するコマンドがあればそれを実行します。ECRへのサインインなどもここで実行します。
buildフェーズではメインのビルドコマンドを定義します。Dockerイメージのビルドやテストなどもここで実施します。
post_buildフェーズではビルド後に実施するコマンドを定義します。ビルド後の資材のアップロードやDockerイメージをECRへプッシュなどをここで実施します。
buildspec.ymlファイルに関する詳細はAWS公式ページに記載されているので参照してください。
version: 0.2
phases:
install:
runtime-versions:
nodejs: 10
commands:
- echo "installing something"
pre_build:
commands:
- echo "we are in the pre build phase"
build:
commands:
- echo "we are in the build block"
- echo "we will run some tests"
post_build:
commands:
- echo "we are in the post build phase"
buildspec.ymlファイルを作成できたらリポジトリにプッシュします。
ビルドしてみる
では実際にビルドしてみましょう。ビルドプロジェクトから「ビルドの開始」ボタンをクリックします。
まず「ビルド設定」セクションの「プロジェクト」で該当のビルドプロジェクトを選択します。「ビルドタイプ」は今回は「単一ビルド」を選択します。
ビルド時間のタイムアウトはデフォルトの1時間で設定します。
「ソース」セクションでは既にリポジトリは選択された状態になっているので、参照するリポジトリのリファレンスタイプとブランチを選択します。
「環境変数の上書き」セクションでは作成したビルドプロジェクトで設定したビルド開始時に展開される環境変数で追加したい環境変数があれば設定します。
一通り設定が完了したら「ビルドの開始」ボタンをクリックしましょう。
ビルドが開始されましたね。
しばらくするとビルドのログが表示され、ステータスが「成功」に変化したらビルド成功です!!!
まとめ
CodeBuildでビルドプロジェクトの作成から、buildspec.ymlの設定、実際にビルドを完了させるところまでを解説してきました。コマンドが自由に定義できるため、CircleCIやGithubActionsなどのCI/CDツールの役割を担うことができそうです。AWSを使用したシステムなら、CodeBuildを使用した方が色々都合がいいかもしれないですね。
自分もこの機会に検討してみたいと思います。