Cloud Service
AWS CodeBuild
ソースコードのコンパイル・テスト・成果物生成を行うフルマネージドなビルドサービス。サーバー管理が不要。
- 1.ビルドサーバーを自前で用意せず、必要なときだけビルド環境を起動して使える。
- 2.buildspec.yml にビルド手順を書き、ビルド時間(分)に応じた従量課金で利用する。
- 3.CodePipeline や GitHub と連携し、CI(継続的インテグレーション)の中核を担う。
解決する課題
従来は CI のためにビルド用サーバー(Jenkins など)を常時起動し、OS やビルドツールのパッチ・スケール・キャパシティ管理を自分で抱える必要がありました。CodeBuild なら:
- ビルドのたびに環境を起動し、終わると破棄するためサーバーの常時管理が不要
- 複数のビルドを並列実行でき、待ち行列が発生しにくい
- ビルドツールの入ったマネージド環境が提供され、自前のパッチ適用が要らない
主要概念と用語
- ビルドプロジェクト: ソースの場所・ビルド環境・buildspec などの設定をまとめた単位
- buildspec: ビルド手順を記述する YAML ファイル(既定では
buildspec.yml)。install/pre_build/build/post_build などのフェーズを定義する - ビルド環境: ビルドを実行するコンテナ。AWS 提供のマネージドイメージか、独自のコンテナイメージを指定できる
- アーティファクト: ビルドの成果物。S3 などに保存する
- コンピュートタイプ: ビルドに割り当てる CPU・メモリのサイズ区分
- 環境変数: ビルド中に参照する値。機密値は Secrets Manager や SSM パラメータストアから参照する
仕様・制限・クォータ
- ビルドはコンテナ単位で隔離して実行され、ビルドごとにクリーンな環境が用意される
- ソースは CodeCommit・GitHub・GitHub Enterprise・Bitbucket・S3 などから取得できる
- 1 つのビルドには**最大実行時間(タイムアウト)**があり、超過すると打ち切られる
- 同時に実行できるビルド数(並列数)にはアカウント単位の上限があり、引き上げ申請が可能
- Linux・Windows 環境に対応し、ARM ベースの環境も選択できる
具体的な並列数・タイムアウト上限・対応ランタイムの値はリージョンや時期で変わるため、最新値は公式ドキュメントで確認してください。
内部の仕組み
ビルドが開始されると、CodeBuild は指定したビルド環境イメージから一時的なコンテナを起動し、ソースを取得して buildspec のフェーズを順に実行します。ビルドが終わるとコンテナは破棄されます。
- フェーズは
install→pre_build→build→post_buildの順に進む - ビルドの標準出力やエラーは CloudWatch Logs にストリーミングされる
- 成果物は
artifactsセクションの指定に従って S3 などへアップロードされる - 依存パッケージはローカルキャッシュや S3 キャッシュで再利用でき、2 回目以降を高速化できる
依存パッケージのダウンロードはビルド時間の多くを占めがちです。cache を設定して node_modules や Maven リポジトリなどを再利用すると、課金対象のビルド時間を短縮できます。
設計パターン / ベストプラクティス
- buildspec をリポジトリに置く: ビルド定義をコードと一緒にバージョン管理し、再現性を確保する
- CodePipeline のステージとして組み込む: ソース取得・ビルド・テスト・デプロイを一連のパイプラインにする
- マルチステージ: テスト用とリリース用でプロジェクトや環境変数を分け、用途ごとに最適化する
- 最小権限のサービスロール: ビルドが触れる S3 バケットや ECR リポジトリだけに権限を絞る
運用・監視
- CloudWatch Logs でビルドログを確認し、失敗フェーズを切り分ける
- CloudWatch メトリクスでビルドの成功・失敗数や所要時間を監視する
- EventBridge でビルド状態の変化(成功・失敗)を捕捉し、通知や後続処理を自動化する
- 失敗の再現には、同じ環境イメージをローカルで実行できる仕組みを活用すると切り分けが速い
ビルドログは CloudWatch Logs に残ります。環境変数の中身を安易に出力すると認証情報が漏れる恐れがあるため、機密値は Secrets Manager 参照とし、ログ出力を避けてください。
コスト
課金は主に**ビルドにかかった時間(分)**に対して発生し、選んだコンピュートタイプ(CPU・メモリの大きさ)が大きいほど単価が上がります。常時起動するサーバーと違い、ビルドしていない間は費用がかかりません。
- 大きいコンピュートタイプは速いが単価が高い。ビルドが CPU・メモリで律速していないなら小さい方が割安
- キャッシュ活用でビルド時間そのものを減らすのが最も効くコスト最適化
- 不要に長いタイムアウト待ちや、失敗ビルドの放置を避ける
正確な単価は時期・リージョンで変動するため、断定的な金額は公式の料金ページで確認してください。
セキュリティ
- **サービスロール(IAM ロール)**でビルドに権限を与え、アクセスキーのハードコードを避ける
- 機密値は Secrets Manager や SSM パラメータストアから参照し、平文の環境変数に置かない
- 成果物の保存先である S3 やログは KMS で暗号化できる
- プライベートリソースにアクセスするビルドは VPC 内で実行する設定が可能
DB パスワードや API キーを buildspec や環境変数に平文で書くのは厳禁です。Secrets Manager 参照に置き換え、サービスロールも最小権限にしてください。
Well-Architected の観点
- 運用上の優秀性: ビルドをコード(buildspec)として管理し、CI を自動化・標準化することで手作業とばらつきを減らせる
- ビルド状態を EventBridge と CloudWatch で観測し、失敗を素早く検知・通知できる
試験で問われるポイント
- ビルド手順をどこに書く? → リポジトリ直下の buildspec.yml
- 機密値の渡し方 → Secrets Manager / SSM パラメータストア参照(平文の環境変数は避ける)
- CI/CD の中での位置づけ → CodePipeline のビルド(およびテスト)ステージを担う
- ビルドを高速化したい → キャッシュの活用とコンピュートタイプの見直し
関連サービス・比較
デプロイを担う CodeDeploy とよく一緒に登場します。役割の違いを押さえておきましょう。
| 観点 | CodeBuild | CodeDeploy |
|---|---|---|
| 主な役割 | ビルドとテストの実行 | 成果物のデプロイ |
| 入力 | ソースコード | ビルド済み成果物 |
| 出力 | アーティファクト(成果物) | 稼働中の環境への反映 |
| 課金の考え方 | ビルド時間(分) | デプロイ対象や利用形態に依存 |
ハンズオン / CLI例
# ビルドプロジェクトの一覧を取得
aws codebuild list-projects
# 指定プロジェクトのビルドを開始
aws codebuild start-build --project-name my-app-build
# 直近ビルドの ID を取得し、状態を確認
aws codebuild list-builds-for-project --project-name my-app-build --query "ids[0]"
aws codebuild batch-get-builds --ids my-app-build:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
--query "builds[].{Status:buildStatus,Phase:currentPhase}"
AWS Service
AWS CodeBuildを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
開発者ツール
比較で見る軸
クラウド: AWS / カテゴリ: 開発者ツール / 難易度: basic
導入後に効く点
buildspec.yml にビルド手順を書き、ビルド時間(分)に応じた従量課金で利用する。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- AWS
- カテゴリ
- 開発者ツール
- 難易度
- basic
- 関連資格
- DOP-C02 / DVA-C02
- 設計柱
- operational
判断チェックリスト
- 自社の用途が「開発者ツール / operational」に近いか確認する。
- 強みである「ビルドサーバーを自前で用意せず、必要なときだけビルド環境を起動して使える。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。