- AWS
AWS CodePipelineとは|CodeBuild・buildspec・料金
結論
AWS CodePipeline は、ソースの取得・ビルド・デプロイの段階をつなぎ、コードの変更のたびに自動で流す AWS の CI/CD サービスです。ビルドとテストは CodeBuild が受け持ち、その手順はリポジトリの直下に置く buildspec.yml に書きます。
この記事でわかること
- パイプラインの段階・V1 と V2 の違い・料金を公式の記載で整理
- buildspec.yml の書き方と、同じコマンドを手元で流した出力
- CodeDeploy・GitHub Actions との役割の違いと選び方の表
CodePipeline は「流れの設計図」、CodeBuild は「ビルドを実際に行う作業場」、CodeDeploy は「サーバーやコンテナへ配る係」です。3つは別々のサービスで、CodePipeline がほかの2つを順番に呼び出します。
flowchart TD
G[GitHub に push] --> S[Source ステージ<br>コードを取得]
S -->|SourceArtifact| B[Build ステージ<br>CodeBuild が buildspec.yml を実行]
B -->|BuildArtifact| D[Deploy ステージ<br>S3・CodeDeploy・ECS など]
D --> OK[本番・検証環境に反映]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| AWS CodePipeline とは | ステージとアクションで CI/CD の流れを組む AWS のサービス | CodePipelineとは |
| CodePipeline と CodeBuild の違い | CodePipeline は流れの管理、CodeBuild はビルドとテストの実行 | CodeBuild・CodeDeployとの関係 |
| buildspec.yml の書き方 | version 0.2 と phases(install・pre_build・build・post_build)を書く | buildspec.ymlの書き方 |
| V1 と V2 の違い | V2 はトリガーの絞り込み・QUEUED と PARALLEL・変数などが使える | V1とV2の違い |
| CodePipeline の料金 | V1 は1本あたり月1 USD、V2 はアクション実行1分あたり0.002 USD | CodePipelineの料金 |
| CodeBuild の料金 | ビルドした時間で課金。general1.small は月100分の無料枠 | CodeBuildの料金 |
| GitHub Actions との違い | 設定の置き場所・実行環境・AWS への権限の渡し方が違う | GitHub Actionsとの違い |
| ビルドが失敗した | YAML の書き方・フェーズ名・成果物のパスを順に確かめる | よくあるエラー |
確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18・bash 5.2.21・PyYAML 6.0.3 を使い、小さな Python のアプリ(税込み合計を計算する関数と unittest のテスト2件)と buildspec.yml を作りました。buildspec.yml は PyYAML で読み込み、フェーズ名や commands の形を確かめる自作の検査スクリプトで検証し、さらに buildspec の公式リファレンスに書かれた決まり(0.2 は全コマンドを同じシェルで実行、finally は失敗しても実行、など)を再現する自作のスクリプトで、同じコマンドを手元の bash で流しました。CodeBuild や CodePipeline そのものは動かしていません。この環境の AWS の認証情報は使わず、AWS には接続していません。パイプラインの JSON は、boto3・botocore 1.44.2 に入っている CodePipeline の API 定義で入力の形を検証し、AWS のサービスを手元で模擬する moto 5.2.5 で作成と取得を試しています。料金は AWS の料金ページの単価と計算例を Python で計算し直しました。サービスの仕組み・上限・料金は AWS の公式(製品ページ・料金ページ・CodePipeline / CodeBuild / CodeDeploy のユーザーガイド)、GitHub Actions は GitHub Docs で確かめています。図は mermaid 11.16.0 で描画を確かめました(確認日 2026年11月13日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS CodePipelineとは|CodeBuild・buildspec・料金」
AWS CodePipelineとは(できること)
この節では、CodePipeline が何をするサービスなのかと、最低限覚える用語が分かります。
CodePipeline は、ソフトウェアの変更がリリースまでに通る道筋(ワークフロー)を、ステージとアクションで定義して自動で流すサービスです。公式のユーザーガイドは、パイプラインを「ソフトウェアの変更がリリースプロセスをどのように通過するかを記述するワークフロー構造」と説明しています。GitHub に push すると、パイプラインがそれを検出し、ビルド・テスト・デプロイを順に進めます。
1変更のたびに同じ手順で流す
手作業のビルドやアップロードをやめ、push ごとに同じ順番・同じ環境で処理する。手順の抜けがなくなる。
2途中で止める・承認を挟む
テストが失敗したら先へ進まない。本番の前に人が確かめる「承認」アクションを入れられる。
3AWS のサービスをつなぐ
CodeBuild・CodeDeploy・CloudFormation・ECS・S3・Lambda などを、アクションとして順番に呼び出す。
最低限の用語
| 用語 | 意味(公式の説明の要点) | この記事の例 |
|---|---|---|
| パイプライン | 変更がリリースまでに通る流れ全体。ステージの並び | price-app-pipeline |
| ステージ | アクションをまとめた区切り。一度に1つの実行だけを処理する | Source・Build・Deploy |
| アクション | ステージの中の1つの処理。種類は source・build・test・deploy・approval・invoke | CodeBuild でのビルド |
| アーティファクト | アクションの間で受け渡すファイルの集まり(ソースコード・ビルド結果など) | SourceArtifact・BuildArtifact |
| トランジション(移行) | 次のステージへ進む境目。無効にすると実行がそこで待つ | Build から Deploy の間 |
アーティファクトは、パイプラインごとに指定した S3 バケット(アーティファクトストア)に保存されます。料金ページには、このアーティファクトの保存と取得に S3 の料金が別にかかることがある、と書かれています。
パイプラインの段階(ソース・ビルド・デプロイ)
この節では、よく使う3段のパイプラインの中身と、ステージの決まりが分かります。
典型的な形は「Source → Build → Deploy」の3ステージです。公式の「パイプライン宣言」には、ステージについて次の決まりがあります。
- パイプラインには少なくとも2つのステージが要る
- 最初のステージにはソースアクションだけを置く(ソースアクションを置けるのは最初のステージだけ)
- 少なくとも1つのステージに、ソース以外のアクションが要る
- ステージ名はパイプラインの中で重複できない
Source:コードを取りに行く
GitHub は「接続(CodeConnections)」を通して取得する。アクションの種類は CodeStarSourceConnection。S3 のバケットや CodeCommit もソースにできる。取得したコードは既定で ZIP(CODE_ZIP)としてアーティファクトストアに置かれる。
Build:CodeBuild でビルドとテスト
CodeBuild のプロジェクト名(ProjectName)を指定する。CodeBuild は入力アーティファクトを展開した場所で buildspec.yml を探して実行し、artifacts に書いたファイルを出力アーティファクトとして返す。
Deploy:配る
静的サイトなら S3、EC2・Lambda・ECS なら CodeDeploy や ECS、インフラなら CloudFormation のアクションを使う。本番の前に approval(手動承認)を置くこともできる。
アクションの間はアーティファクト名でつなぐ
前のアクションの outputArtifacts の名前を、次のアクションの inputArtifacts に書きます。名前が一致しないと流れがつながりません。CodeBuild のアクションの入力アーティファクトは1〜5個、出力は0〜5個です(公式のアクションリファレンス)。入力が複数のときは、どれを buildspec.yml のある主なソースにするかを PrimarySource で指定します。
実行の進み方:ステージは1つずつ
公式の「パイプライン実行の仕組み」によると、各ステージは一度に1つの実行しか処理せず、処理中はロックされます。アクションが失敗すると、その変更は次へ進みません。失敗したステージは手動で再試行でき、再試行では失敗したアクションだけが再び動きます。
CodeBuild・CodeDeployとの関係
この節では、名前の似た3つのサービスの役割の違いが分かります。
CodePipeline は「順番と受け渡し」だけを受け持ち、実際の処理はほかのサービスが行います。ビルドしたいなら CodeBuild、サーバーやコンテナに配りたいなら CodeDeploy(または ECS・CloudFormation などのデプロイアクション)を組み合わせます。
| サービス | 役割 | 設定ファイル | 単体で使えるか |
|---|---|---|---|
| CodePipeline | ステージとアクションの順番、アーティファクトの受け渡し | パイプラインの JSON(または YAML) | ほかのサービスを呼ぶのが仕事 |
| CodeBuild | コンテナの中でビルド・テストのコマンドを実行 | buildspec.yml | 使える(手動・Webhook で開始) |
| CodeDeploy | EC2・オンプレミス・Lambda・ECS へのデプロイ | AppSpec ファイル(appspec.yml など) | 使える |
CodeBuild に任せること
依存関係の取得(npm ci・pip install)
テストの実行とレポートの出力
ZIP やコンテナイメージを作る
CodeDeploy に任せること
インスタンスへの配布と再起動の手順
Blue/Green でのトラフィックの切り替え
Lambda・ECS の段階的な切り替え(Canary・線形)
CodeDeploy のユーザーガイドによると、インプレースデプロイは EC2・オンプレミスだけで使え、Lambda と ECS のデプロイはすべて Blue/Green です。CodeDeploy のデプロイアクションのタイムアウトは5日間、CodeBuild のビルドアクションは36時間です(CodePipeline のクォータ)。
CI/CD という考え方そのものと、GitHub Actions で最初のパイプラインを作る手順は、関連記事「CI/CDとは|GitHub Actionsで最初のパイプラインを作るまで」で扱っています。
buildspec.ymlの書き方(CodeBuild)
この節では、buildspec.yml の全体の形と、各項目に何を書くかが分かります。
buildspec.yml は、CodeBuild がビルドで実行するコマンドと、出力するファイルを書く YAML ファイルです。既定の名前は buildspec.yml で、ソースのルート(リポジトリの直下)に置きます。名前や場所はプロジェクトの設定で変えられますが、1つのビルドプロジェクトに使える buildspec は1つです。手元で作った例は次のとおりです。
version: 0.2
env:
variables:
APP_NAME: "price-app"
exported-variables:
- BUILD_TAG
phases:
install:
runtime-versions:
python: 3.12
commands:
- python3 --version
pre_build:
commands:
- echo "pre_build started"
- cd src
- export BUILD_TAG="${APP_NAME}-$(date +%Y%m%d)"
build:
commands:
- echo "now in $(pwd)"
- cd ..
- python3 -m unittest discover -s tests -v
finally:
- echo "build finally (always runs)"
post_build:
commands:
- echo "CODEBUILD_BUILD_SUCCEEDING=${CODEBUILD_BUILD_SUCCEEDING}"
- mkdir -p dist && cp src/*.py dist/
- echo "${BUILD_TAG}" > dist/VERSION
artifacts:
files:
- '**/*'
base-directory: dist
name: price-app-artifact
cache:
paths:
- '/root/.cache/pip/**/*'
| 項目 | 書くこと | 必須 |
|---|---|---|
| version | buildspec の版。公式は 0.2 を勧めている | はい |
| env.variables | 平文の環境変数。機密の値は入れない | いいえ |
| env.parameter-store・secrets-manager | Parameter Store・Secrets Manager から値を読み込む | いいえ |
| env.exported-variables | CodePipeline の後のステージへ渡す変数の名前 | いいえ |
| phases | install・pre_build・build・post_build の順に commands を書く | はい |
| artifacts | 出力するファイル(files は必須)、base-directory・discard-paths など | 出力するなら |
| reports | JUnit XML などのテスト結果・カバレッジのファイル | いいえ |
| cache | 次のビルドに残すフォルダー(プロジェクトでキャッシュを有効にしたとき) | いいえ |
4つのフェーズの使い分け
フェーズは install → pre_build → build → post_build の順で、名前は変えられません。公式リファレンスの例では、install はパッケージの導入、pre_build は ECR へのサインインや npm の依存関係の導入、build はテストの実行、post_build は成果物のパッケージ化やコンテナイメージの push、通知に使われています。
- runtime-versions:install の中で
python: 3.12のように言語の版を選ぶ。Ubuntu 標準イメージ 5.0 以降・Amazon Linux 2 標準イメージ 4.0 以降で使える。指定しないとイメージの既定の版になり、既定の版はサポート終了に合わせて変わることがある。 - finally:commands のどれかが失敗しても実行されるブロック。後片付けに使う。
- on-failure:フェーズが失敗したときに ABORT(中止)・CONTINUE(次のフェーズへ)・RETRY(再試行)を選ぶ。Lambda のコンピューティングとリザーブドキャパシティでは使えない。
環境変数の優先順位
同じ名前の環境変数が複数の場所にあると、ビルド開始時に渡した値 → ビルドプロジェクトの設定 → buildspec の値 の順に強くなります(左ほど優先)。CODEBUILD_ で始まる名前は CodeBuild が内部で使うので、自分では付けません。パスワードや鍵を扱う方法は、関連記事「AWS Secrets Managerの使い方 CLI・boto3取得早見表」で扱っています。
buildspec.ymlのコマンドを手元で流した結果
この節では、上の buildspec.yml のコマンドを手元で順に流すと何が起きるかと、push の前に見つけられる書き間違いが、実際の出力で分かります。
CodeBuild に送る前に、同じコマンドを手元で流しておくと、失敗の多くを先に見つけられます。ここでは、公式リファレンスに書かれた次の決まりを再現する小さな Python のスクリプトを作り、buildspec.yml を読み込んで bash で実行しました。CodeBuild のログではないので、行頭は [local] にしています(作業フォルダーの名前は短く書き換えています)。
- version 0.2 では、全コマンドを同じシェルのインスタンスで実行する(
cdやexportが次のコマンドに引き継がれる) - コマンドは書いた順に1つずつ実行し、失敗したら同じフェーズの残りは飛ばす。finally は実行する
- BUILD が失敗しても、成果物のアップロード(UPLOAD_ARTIFACTS)は試みる
[local] version=0.2 CODEBUILD_SRC_DIR=/tmp/src6_l2g9yh/src
[local] runtime-versions {'python': 3.12} は手元では切り替えない
[local] run: python3 --version
Python 3.13.18
[local] Phase complete: INSTALL State: SUCCEEDED
[local] run: echo "pre_build started"
pre_build started
[local] run: cd src
[local] run: export BUILD_TAG="${APP_NAME}-$(date +%Y%m%d)"
[local] Phase complete: PRE_BUILD State: SUCCEEDED
[local] run: echo "now in $(pwd)"
now in /tmp/src6_l2g9yh/src/src
[local] run: cd ..
[local] run: python3 -m unittest discover -s tests -v
test_basic (test_price.TestTotal.test_basic) ... ok
test_empty (test_price.TestTotal.test_empty) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
[local] run: echo "build finally (always runs)" (finally)
build finally (always runs)
[local] Phase complete: BUILD State: SUCCEEDED
[local] run: echo "CODEBUILD_BUILD_SUCCEEDING=${CODEBUILD_BUILD_SUCCEEDING}"
CODEBUILD_BUILD_SUCCEEDING=1
[local] run: mkdir -p dist && cp src/*.py dist/
[local] run: echo "${BUILD_TAG}" > dist/VERSION
[local] Phase complete: POST_BUILD State: SUCCEEDED
[local] exported BUILD_TAG='price-app-20261113'
[local] UPLOAD_ARTIFACTS ./out/price-app-artifact.zip
VERSION 19 bytes
price.py 173 bytes
[local] BUILD SUCCEEDED
1cd はフェーズをまたいで残る
pre_build の cd src のあと、build の最初の pwd は src/src だった。0.2 は同じシェルなので、移動したら戻す処理を書く。
2export も残る
pre_build で作った BUILD_TAG を post_build で使えた。exported-variables に書けば CodePipeline の後のステージにも渡せる。
3base-directory の中身だけが入る
ZIP には dist の中の2ファイルだけが入り、dist というフォルダー自体は入らなかった。公式の説明どおり。
テストが失敗したとき
税率を 0.10 から 0.08 に書き換えてテストを失敗させると、build の残りのコマンドは飛ばされ、finally は動きました。post_build では CODEBUILD_BUILD_SUCCEEDING が 0 になります(公式の環境変数の説明:失敗なら0、成功なら1)。
[local] run: python3 -m unittest discover -s tests -v
test_basic (test_price.TestTotal.test_basic) ... FAIL
test_empty (test_price.TestTotal.test_empty) ... ok
======================================================================
FAIL: test_basic (test_price.TestTotal.test_basic)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/src3zd91t4d/src/tests/test_price.py", line 7, in test_basic
self.assertEqual(total([(100, 2), (250, 1)]), 495)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 486 != 495
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (failures=1)
[local] FAILED: python3 -m unittest discover -s tests -v (exit status 1)
[local] run: echo "build finally (always runs)" (finally)
build finally (always runs)
[local] Phase complete: BUILD State: FAILED
[local] run: echo "CODEBUILD_BUILD_SUCCEEDING=${CODEBUILD_BUILD_SUCCEEDING}"
CODEBUILD_BUILD_SUCCEEDING=0
失敗したビルドの成果物をデプロイしないよう、post_build で成否によって処理を分けたいときは CODEBUILD_BUILD_SUCCEEDING を見ます。フェーズの間の移り方は公式の「ビルドフェーズの移行」の図に示されていて、本文には「UPLOAD_ARTIFACTS フェーズは、BUILD フェーズが失敗した場合でも必ず試行されます」と書かれています。
version 0.1 にすると何が変わるか
同じファイルの version だけを 0.1 にして流しました。0.1 はコマンドごとに別のシェルで実行するので、cd も export も次のコマンドに残りません。
[local] run: cd src
[local] run: export BUILD_TAG="${APP_NAME}-$(date +%Y%m%d)"
[local] Phase complete: PRE_BUILD State: SUCCEEDED
[local] run: echo "now in $(pwd)"
now in /tmp/src6pddkzz9/src
...
[local] exported BUILD_TAG=''
[local] UPLOAD_ARTIFACTS ./out/price-app-artifact.zip
VERSION 1 bytes
price.py 173 bytes
テストは通りましたが、VERSION ファイルの中身は改行1文字だけになりました。エラーにならずに中身だけが欠けるので、気づきにくい違いです。公式も 0.2 を勧めています。
push の前に YAML として検証する
公式リファレンスにも「buildspec 宣言は有効な YAML である必要がある」とあり、空白(インデント)が意味を持ちます。PyYAML で読み込み、フェーズ名・commands の型・artifacts.files の有無を確かめる20行ほどの検査スクリプトを作り、よくある書き間違いを5つ流しました。
--- tab
tab.yml: YAML として読めない
while scanning for the next token
found character '\t' that cannot start any token
in "tab.yml", line 5, column 1
--- colon
colon.yml: build.commands[0] が文字列でない: {'echo Build': 'done'}(': ' を含むなら引用符で囲む)
--- name
name.yml: フェーズ名が違う: prebuild(install/pre_build/build/post_build のどれか)
--- alias
alias.yml: YAML として読めない
while scanning an alias
in "alias.yml", line 8, column 7
expected alphabetic or numeric character, but found '*'
in "alias.yml", line 8, column 8
--- nofiles
nofiles.yml: artifacts.files がない(必須)
| 書き間違い | 何が起きたか | 直し方 |
|---|---|---|
| インデントにタブ | YAML として読めない | スペースで字下げする |
- echo Build: done |
コマンドが文字列でなく辞書になる | - 'echo Build: done' と引用符で囲む |
| フェーズ名 prebuild | YAML としては正しいので読めてしまう | pre_build(アンダースコア)にする |
- **/*(引用符なし) |
* が YAML の別名(エイリアス)と解釈される | - '**/*' と引用符で囲む |
| artifacts に files がない | files は artifacts の必須項目 | files を書く |
公式リファレンスも「YAML でサポートされない文字を含むコマンドは引用符で囲む」ように書いています。: (コロンと空白)・先頭の *・{・# を含むコマンドは、最初から引用符で囲むのが確実です。YAML の構文と落とし穴は、関連記事「YAMLの書き方|構文一覧とパース結果、落とし穴10例を実測」で扱っています。
パイプラインのJSONを手元で確かめる
この節では、パイプラインの定義(JSON)の形と、AWS に送る前に形と決まりを確かめた結果が分かります。
パイプラインは JSON(AWS CLI の create-pipeline や CloudFormation)でも定義できます。上の3ステージを JSON で書くと次のとおりです(ARN やバケット名は例です)。
{
"pipeline": {
"name": "price-app-pipeline",
"roleArn": "arn:aws:iam::123456789012:role/service-role/AWSCodePipelineServiceRole-price-app",
"artifactStore": { "type": "S3", "location": "codepipeline-ap-northeast-1-example" },
"pipelineType": "V2",
"executionMode": "QUEUED",
"stages": [
{ "name": "Source", "actions": [ {
"name": "Source",
"actionTypeId": { "category": "Source", "owner": "AWS", "provider": "CodeStarSourceConnection", "version": "1" },
"configuration": {
"ConnectionArn": "arn:aws:codeconnections:ap-northeast-1:123456789012:connection/example-id",
"FullRepositoryId": "example-org/price-app",
"BranchName": "main",
"OutputArtifactFormat": "CODE_ZIP"
},
"outputArtifacts": [ { "name": "SourceArtifact" } ],
"runOrder": 1 } ] },
{ "name": "Build", "actions": [ {
"name": "BuildAndTest",
"actionTypeId": { "category": "Build", "owner": "AWS", "provider": "CodeBuild", "version": "1" },
"configuration": { "ProjectName": "price-app-build" },
"inputArtifacts": [ { "name": "SourceArtifact" } ],
"outputArtifacts": [ { "name": "BuildArtifact" } ],
"runOrder": 1 } ] },
{ "name": "Deploy", "actions": [ {
"name": "DeployToS3",
"actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "S3", "version": "1" },
"configuration": { "BucketName": "price-app-example-bucket", "Extract": "true" },
"inputArtifacts": [ { "name": "BuildArtifact" } ],
"runOrder": 1 } ] }
]
}
}
この JSON を、(1) botocore に入っている CodePipeline の API 定義で CreatePipeline の入力として検証し、(2) ユーザーガイドの「パイプライン宣言」の決まり(ステージ2つ以上・ソースは最初のステージだけ・アーティファクト名のつながり・QUEUED は V2 が必要)を自作のスクリプトで確かめました。わざと壊した JSON(roleArn を消す・runOrder を文字列にする・Build ステージにソースを足す・入力名を間違える・V1 にする)も流しています。
== pipeline.json
[botocore] OK
[rules] OK
== broken.json
[botocore]
Missing required parameter in pipeline: "roleArn"
Invalid type for parameter pipeline.stages[1].actions[0].runOrder, value: 1, type: <class 'str'>, valid types: <class 'int'>
[rules]
ソースアクションは最初のステージだけ(Build)
DeployToS3: 入力 BuildOutput を前のアクションが出していない
QUEUED モードは V2 タイプが必要
さらに、AWS のサービスを手元で模擬する moto の中で、ダミーの認証情報を使って同じ JSON から作成と取得を試しました。同じ名前で2回作ると、エラーになりました。
created: price-app-pipeline version 1 V2
stages: Source -> Build -> Deploy
list: ['price-app-pipeline']
InvalidStructureException An error occurred (InvalidStructureException) when calling the CreatePipeline operation: A pipeline with the name 'price-app-pipeline' already exists in account '123456789012'
moto は AWS の応答をまねる道具で、本物の CodePipeline がこのメッセージを返すかは確かめていません。API の形の検証(botocore)と、手元の決まりの検査までが、AWS に送る前に確かめられる範囲です。roleArn に指定するサービスロールの考え方は、関連記事「IAMロールとは|ユーザー・ポリシーとの違いとAssumeRole、信頼ポリシー」で扱っています。
CodePipelineのV1とV2の違い
この節では、パイプラインのタイプ V1 と V2 で使える機能の違いが分かります。
V2 は V1 と同じ JSON の構造に、リリースの安全性とトリガーの設定のための項目を足したタイプです。公式の「適切なパイプラインのタイプの選択」の比較表から抜き出しました。
| 機能 | V1 | V2 |
|---|---|---|
| アクションレベルの変数 | 使える | 使える |
| パイプラインレベルの変数 | 使えない | 使える |
| QUEUED・PARALLEL の実行モード | 使えない | 使える |
| Git タグ・プルリクエスト・ブランチ・ファイルパスでのトリガーと絞り込み | 使えない | 使える |
| ステージ条件・ステージのロールバック | 使えない | 使える |
| ソースリビジョンの上書き | 使えない | 使える |
| コマンドアクション | 使えない | 使える |
| ステージが失敗したときの自動再試行 | 使えない | 使える |
3つの実行モード
- 1SUPERSEDED(既定)待っている実行は、より新しい実行に置き換えられる。最新の変更だけを届けたいとき
- 2QUEUED(V2 のみ)到着した順に1つずつ処理し、置き換えない。どの変更も必ず通したいとき
- 3PARALLEL(V2 のみ)実行どうしが独立して同時に進む。ブランチごとの開発環境など。ステージのロールバックは使えない
V2 のトリガーでは、push とプルリクエストごとに絞り込みを書けます。クォータによると、絞り込みは push・プルリクエストごとに最大3つ、含める・除外するパターンはそれぞれ最大8つ、各パターンは255文字までです。
CodePipelineの料金(V1・V2)
この節では、CodePipeline の料金の決まりと、回数ごとに計算した月額が分かります。
V1 は「アクティブなパイプライン1本あたり月1.00 USD」、V2 は「アクション実行1分あたり0.002 USD」です(料金ページ、2026年11月13日時点)。
| タイプ | 単価 | 無料枠 | 数え方 |
|---|---|---|---|
| V1 | アクティブなパイプライン1本あたり月1.00 USD | 月1本。作成から30日は無料 | 作成から30日を超え、その月に1回以上コードの変更が流れたものがアクティブ。日割りなし |
| V2 | アクション実行1分あたり0.002 USD | 月100分(V2 全体で共有、繰り越しなし) | アクションの開始から完了まで、分に切り上げ。手動承認とカスタムアクションは対象外 |
まず、料金ページの計算例を Python で計算し直し、同じ答えになることを確かめました。
公式例2: 9.12 (V1 10本+V2 で 20回×4アクション×2分)
公式例3: 0.2 公式例4: 99.0
次に、この記事の3ステージ(Source 40秒・Build 230秒・Deploy 50秒と仮定)で計算しました。アクションごとに分へ切り上げるので、1回あたり 1+4+1=6分になります。
import math
V2_PER_MIN, V2_FREE = 0.002, 100
acts = [40, 230, 50] # 各アクションの秒数(仮定)
per = sum(math.ceil(s / 60) for s in acts) # アクションごとに分へ切り上げ → 6
for runs in (20, 50, 100, 200, 500):
m = per * runs
print(runs, m, round(max(0, m - V2_FREE) * V2_PER_MIN, 2))
| 月の実行回数 | V2 の課金分 | V2 の月額 | V1(無料枠を使い切った2本目以降) |
|---|---|---|---|
| 20回 | 120分 | 0.04 USD | 1.00 USD |
| 50回 | 300分 | 0.40 USD | 1.00 USD |
| 100回 | 600分 | 1.00 USD | 1.00 USD |
| 200回 | 1,200分 | 2.20 USD | 1.00 USD |
| 500回 | 3,000分 | 5.80 USD | 1.00 USD |
この形のパイプライン1本なら、月101回を超えると V2 の料金が V1 の1本分を上回ります(計算で求めた値)。ただし V2 の無料枠100分はアカウントの V2 パイプライン全体で共有なので、本数が増えると早く使い切ります。また、59秒のアクションは1分、61秒は2分と数えるので、短いアクションを細かく分けるほど課金分が増えます。料金ページには、AWS 料金見積りツールが対応しているのは V1 だけ、とも書かれています。なお、この金額に CodeBuild のビルド料金と S3 の料金は含まれません。
CodeBuildの料金とビルド環境
この節では、CodeBuild の課金の考え方、無料枠、選べるビルド環境の大きさが分かります。
CodeBuild は、選んだビルド環境(コンピューティングタイプ)でビルドした時間に応じて課金されます。料金ページの無料枠は次のとおりです(2026年11月13日時点)。
- オンデマンドの EC2 で general1.small か arm1.small を使うと、月合計100分のビルド時間
- オンデマンドの Lambda で lambda.arm.1GB か lambda.x86-64.1GB を使うと、月合計6,000秒
- この無料枠は12か月の無料利用枠の期間が終わっても自動では切れず、新規・既存のどちらの利用者も対象
料金ページの計算例では build.general1.small を1分あたり0.005 USD として「5分のビルドを100回=500分、無料の100分を引いた400分×0.005 USD=2 USD」と計算しています。リージョンごとの単価(東京リージョンを含む)は料金ページの表で選んで確かめます。計算例の単価で、上の3ステージのビルド(230秒=4分と数えた場合)を試算すると次のとおりです。
| 月のビルド回数 | ビルド分 | 無料枠を引いた月額(計算例の単価) |
|---|---|---|
| 20回 | 80分 | 0.00 USD |
| 50回 | 200分 | 0.50 USD |
| 100回 | 400分 | 1.50 USD |
| 200回 | 800分 | 3.50 USD |
| 500回 | 2,000分 | 9.50 USD |
ビルド環境の大きさ(オンデマンド EC2・Linux)
| 種類 | computeType の値 | メモリ | vCPU | ディスク |
|---|---|---|---|---|
| Linux Small | BUILD_GENERAL1_SMALL | 4 GiB | 2 | 64 GB |
| Linux Medium | BUILD_GENERAL1_MEDIUM | 8 GiB | 4 | 128 GB |
| Linux Large | BUILD_GENERAL1_LARGE | 16 GiB | 8 | 128 GB |
| Linux XLarge | BUILD_GENERAL1_XLARGE | 72 GiB | 36 | 256 GB |
ディスク容量は CODEBUILD_SRC_DIR のフォルダーでだけ使える、と注記されています。ビルドのタイムアウトは5〜2,160分(36時間)、同時に動かせるビルドの数は既定でコンピューティングタイプごとに決まっていて、Service Quotas から引き上げを頼めます(CodeBuild のクォータ)。
buildspec で使える主な環境変数
| 変数 | 中身(公式の説明の要点) |
|---|---|
| CODEBUILD_SRC_DIR | ビルドに使うフォルダー。追加の入力は CODEBUILD_SRC_DIR_入力名 |
| CODEBUILD_BUILD_SUCCEEDING | 今のビルドが成功なら1、失敗なら0 |
| CODEBUILD_RESOLVED_SOURCE_VERSION | ソースの版(GitHub ならコミット ID)。DOWNLOAD_SOURCE のあとで使える |
| CODEBUILD_INITIATOR | ビルドを始めたもの。CodePipeline なら codepipeline/パイプライン名 |
| CODEBUILD_BUILD_NUMBER | プロジェクトの今のビルド番号 |
| AWS_REGION・AWS_DEFAULT_REGION | ビルドが動いているリージョン |
CodePipelineとGitHub Actionsの違い
この節では、同じ CI/CD を CodePipeline+CodeBuild と GitHub Actions で組むときの、仕組みの違いが分かります。
どちらも「変更をきっかけにビルド・テスト・デプロイを自動で流す」点は同じで、設定の置き場所・実行環境・AWS への権限の渡し方が違います。どちらかが優れているという話ではなく、チームのコードの置き場所とデプロイ先に合わせて選びます。
| 観点 | CodePipeline+CodeBuild | GitHub Actions |
|---|---|---|
| 設定の置き場所 | パイプラインは AWS 側、ビルド手順はリポジトリの buildspec.yml | リポジトリの .github/workflows の YAML |
| 実行する場所 | AWS アカウントの中の CodeBuild のコンテナ | GitHub ホステッドランナー(実行ごとに新しい仮想マシン)かセルフホステッドランナー |
| AWS への権限 | CodePipeline・CodeBuild のサービスロール(IAM ロール) | OIDC で IAM ロールを引き受けるなどの設定が要る |
| きっかけ | 接続したリポジトリへの push、V2 はタグ・プルリクエスト・ファイルパスでも | push・プルリクエスト・スケジュール・手動など |
| 料金 | パイプライン(V1/V2)と CodeBuild のビルド時間 | GitHub の料金ページの決まり(プランとランナーで変わる) |
同じテストを GitHub Actions で書くと、次のような YAML になります。手元で PyYAML(YAML 1.1 の決まりで読む)に読ませると、キーの on が真偽値の True として読まれました。自作のスクリプトで workflow ファイルを読むときは、この点に気をつけます。
name: test
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: python3 -m unittest discover -s tests -v
['name', True, 'jobs']
GitHub Actions から AWS にデプロイするときの権限の設定は、関連記事「GitHub ActionsからOIDCでAWSへ|IAMロールの信頼ポリシー」で扱っています。
アクセスキーの扱い
公式も「機密の値は環境変数に保存しないことを強くお勧めします」と書いている
はじめ方(パイプラインを作るまでの流れ)
この節では、GitHub のリポジトリから CodePipeline を作るまでの順番と、設計のときに当たりやすい上限が分かります。
先に CodeBuild のプロジェクトと buildspec.yml を用意し、最後にパイプラインでつなぐ順番が分かりやすい流れです。コンソールの細かい画面は変わることがあるので、ここでは公式のユーザーガイドに沿った順番だけを示します。
- 1buildspec.yml をリポジトリの直下に置くpush の前に手元で YAML として読めるか、同じコマンドが通るかを確かめる
- 2CodeBuild のビルドプロジェクトを作るビルド環境のイメージ・コンピューティングタイプ・サービスロールを決める。プロジェクト名は2〜150文字
- 3GitHub への接続を作るAWS Connector for GitHub のアプリを入れる。CLI や CloudFormation で作った接続は PENDING のままなので、コンソールで AVAILABLE にする
- 4パイプラインを作り、Source・Build・Deploy をつなぐタイプ(V1/V2)と実行モードを選び、アーティファクト名をそろえる
- 5小さな変更を push して最後まで流す失敗したアクションのログを見て直し、ステージを再試行する
GitHub への接続を作るには、GitHub の組織の所有者(組織でなければリポジトリの所有者)である必要があります。接続の「リポジトリアクセス」で選ばなかったリポジトリは、CodePipeline から見えません。ソースの形式を Full clone(CODEBUILD_CLONE_REF)にすると、CodeBuild で git コマンドを直接使えますが、使えるのは後ろが CodeBuild のアクションのときだけで、CodeBuild のサービスロールに権限を足す必要があります。
設計のときに当たりやすい上限(クォータ)
多くの値は固定で、一部だけリージョンごとに引き上げを頼めます(CodePipeline のクォータ、2026年11月13日時点)。
| 項目 | 上限 |
|---|---|
| リージョンあたりのパイプライン数 | 1,000 |
| パイプラインのステージ数 | 最小2・最大50 |
| ステージのアクション数 | 最小1・最大50 |
| ソースのアーティファクト(S3) | 7 GB |
| ソースのアーティファクト(CodeCommit・GitHub) | 1 GB |
| 手動承認の待ち時間 | 既定7日(アクションごとに5分〜60日で変えられる) |
| パイプライン・ステージ・アクションの名前 | それぞれ100文字まで |
| 実行の履歴の保存期間 | 12か月 |
よくあるエラー・つまずき
この節では、CodePipeline と CodeBuild で起きやすい失敗の原因と直し方が分かります。
まず「どのステージの、どのアクションで止まったか」を見て、CodeBuild ならそのビルドのログを開きます。表の原文は、この記事の手元の検査で実際に出したものです。
| 症状・原文 | 原因 | 直し方 |
|---|---|---|
found character '\t' that cannot start any token |
buildspec.yml の字下げにタブ | スペースにする。push 前に YAML として読み込む |
expected alphabetic or numeric character, but found '*' |
files の **/* を引用符なしで書いた |
'**/*' と囲む |
| コマンドが実行されない・辞書として読まれる | : を含むコマンドを引用符なしで書いた |
コマンド全体を引用符で囲む |
| pre_build のコマンドが動かない | フェーズ名の綴り違い(prebuild など) | install・pre_build・build・post_build のどれかにする |
| build の最初で「ファイルがない」 | 前のフェーズの cd が残っている(0.2 は同じシェル) |
pwd を出して確かめ、絶対パス($CODEBUILD_SRC_DIR)で書く |
| 成果物のファイルが空・変数が空 | version 0.1 で export が残らない | version: 0.2 にする |
Missing required parameter in pipeline: "roleArn" |
パイプラインの JSON にサービスロールがない | roleArn を書く |
Invalid type for parameter ... runOrder |
runOrder を文字列で書いた | 数値(1)で書く |
| Build ステージの入力が見つからない | inputArtifacts の名前が前の出力と違う | outputArtifacts と同じ名前にする |
| QUEUED を選べない | パイプラインのタイプが V1 | V2 にする |
| GitHub のリポジトリが一覧に出ない | 接続が PENDING、またはリポジトリアクセスで選んでいない | コンソールで接続を AVAILABLE にし、アプリの設定でリポジトリを選ぶ |
CodeBuild の公式リファレンスには、イメージが runtime-versions に対応していないとき Skipping install of runtimes. Runtime version selection is not supported by this build image という警告が出ること、互いにぶつかる版(例:android: 29 と java: openjdk11)を指定するとビルドが失敗することも書かれています。
CodePipelineを選ぶかどうかの判断表
この節では、状況ごとにどの組み合わせが合うかが分かります。
決め手は「コードとデプロイ先がどこにあるか」と「権限をどこで管理したいか」です。
| 状況 | 合う組み合わせ | 理由 |
|---|---|---|
| デプロイ先が AWS で、権限を IAM ロールだけで管理したい | CodePipeline+CodeBuild | アカウントの中で完結し、サービスロールで権限を渡せる |
| EC2・ECS・Lambda に段階的に切り替えて配りたい | CodePipeline+CodeDeploy | Blue/Green・Canary・線形の切り替えを CodeDeploy が持つ |
| ビルドとテストだけを自動にしたい | CodeBuild 単体 | Webhook や手動でビルドを始められる |
| どの変更も順番に必ずデプロイしたい | V2 の QUEUED | 実行が置き換えられない |
| ブランチごとに別々の環境へ流したい | V2 の PARALLEL とトリガーの絞り込み | 実行どうしが独立して進む |
| コードもレビューも GitHub に集め、デプロイ先は AWS 以外も多い | GitHub Actions も候補 | ワークフローをリポジトリの中で管理できる |
| 月の実行回数が少ないパイプラインが多数ある | 料金を V1・V2 で試算して選ぶ | V2 は回数と時間、V1 は本数で決まる |
よくある質問
Q. AWS CodePipeline とは何ですか? A. ソースの取得・ビルド・テスト・デプロイをステージとアクションとして定義し、コードの変更のたびに自動で流す AWS の CI/CD サービスです。実際のビルドやデプロイは CodeBuild・CodeDeploy などのサービスが行います。
Q. CodePipeline と CodeBuild の違いは何ですか? A. CodePipeline は流れ(順番・受け渡し・承認)の管理、CodeBuild はコンテナの中でビルドやテストのコマンドを実行するサービスです。CodeBuild は単体でも使えます。
Q. buildspec.yml はどこに置きますか?
A. 既定ではソースのルート(リポジトリの直下)に buildspec.yml という名前で置きます。プロジェクトの設定で別の名前・別の場所・同じリージョンの S3 バケットも指定できます。
Q. buildspec の version は 0.1 と 0.2 のどちらですか?
A. 公式は 0.2 を勧めています。0.2 は全コマンドを同じシェルで実行するので、cd や export が次のコマンドに引き継がれます。手元で 0.1 にすると、変数が空のまま成果物ができました。
Q. post_build はビルドが失敗しても動きますか?
A. フェーズの間の移り方は公式の「ビルドフェーズの移行」の図に示されています。成否で処理を分けたいときは、post_build の中で CODEBUILD_BUILD_SUCCEEDING(成功1・失敗0)を見るのが確実です。成果物のアップロードは BUILD が失敗しても試みられる、と公式に書かれています。
Q. V1 と V2 のどちらを選べばよいですか? A. タグやプルリクエストでの絞り込み、QUEUED・PARALLEL の実行モード、パイプラインレベルの変数、ステージ条件を使うなら V2 です。料金の決まりが違うので、実行回数とアクションの時間で試算して比べます。
Q. CodePipeline の料金はいくらですか? A. 料金ページでは、V1 はアクティブなパイプライン1本あたり月1.00 USD(月1本は無料)、V2 はアクション実行1分あたり0.002 USD(月100分は無料)です(2026年11月13日時点)。CodeBuild のビルド時間と S3 の料金は別にかかります。
Q. CodeBuild に無料枠はありますか? A. general1.small か arm1.small のオンデマンド EC2 で月100分、1GB の Lambda で月6,000秒の無料枠があり、12か月の無料利用枠の期間が終わっても自動では切れない、と料金ページに書かれています。
Q. CodeDeploy は必ず要りますか? A. 要りません。S3 への配置や CloudFormation、ECS など、CodePipeline のほかのデプロイアクションでも配れます。EC2・オンプレミスへの配布や、Blue/Green・Canary の切り替えを使いたいときに CodeDeploy を組み合わせます。
Q. GitHub のリポジトリをソースにできますか? A. できます。GitHub への接続(CodeConnections)を作り、ソースアクションに CodeStarSourceConnection を選びます。接続を作るには GitHub の組織の所有者、またはリポジトリの所有者である必要があります。
Q. GitHub Actions とどちらがよいですか? A. 優劣ではなく条件で選びます。デプロイ先が AWS で権限を IAM ロールで管理したいなら CodePipeline+CodeBuild、ワークフローをリポジトリの中で管理して AWS 以外にも配るなら GitHub Actions が候補です。
Q. buildspec.yml を AWS に送る前に確かめる方法はありますか?
A. YAML として読み込めるか、フェーズ名と commands の形が正しいかを手元のスクリプトで確かめ、commands を同じ順番で bash で流すと、書き間違いの多くを先に見つけられます。この記事の例では、タブ・引用符のない **/*・: を含むコマンドをすべて手元で見つけました。
まとめ
- CodePipeline は流れの管理役。Source → Build → Deploy をアーティファクト名でつなぎ、実際の処理は CodeBuild・CodeDeploy などが行う。
- buildspec.yml は version 0.2 と4つのフェーズ。0.2 は同じシェルなので cd と export が残る。手元で 0.1 にすると変数が空になった。
- push の前に手元で確かめる。タブ・
**/*・:を含むコマンドは YAML の読み込みで見つかる。パイプラインの JSON は botocore の API 定義で形を検証できる。 - V2 は QUEUED・PARALLEL・トリガーの絞り込みが使える。料金はアクション実行分で、この記事の3ステージでは月101回から V1 の1本分を上回った。
- GitHub Actions とは置き場所・実行環境・権限の渡し方が違う。デプロイ先と権限の管理の仕方で選ぶ。
参考・出典
確認日はいずれも 2026年11月13日です。
- AWS「AWS CodePipeline 料金」:https://aws.amazon.com/codepipeline/pricing/
- AWS「AWS CodeBuild 料金」:https://aws.amazon.com/jp/codebuild/pricing/
- AWS CodePipeline ユーザーガイド「とは AWS CodePipeline」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html
- AWS CodePipeline ユーザーガイド「CodePipeline の概念」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/concepts.html
- AWS CodePipeline ユーザーガイド「パイプライン実行の仕組み」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/concepts-how-it-works.html
- AWS CodePipeline ユーザーガイド「パイプライン宣言」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipeline-requirements.html
- AWS CodePipeline ユーザーガイド「適切なパイプラインのタイプの選択」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipeline-types-planning.html
- AWS CodePipeline ユーザーガイド「AWS CodeBuild ビルドおよびテストアクションリファレンス」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/action-reference-CodeBuild.html
- AWS CodePipeline ユーザーガイド「CodeStarSourceConnection アクションリファレンス」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/action-reference-CodestarConnectionSource.html
- AWS CodePipeline ユーザーガイド「GitHub への接続」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/connections-github.html
- AWS CodePipeline ユーザーガイド「AWS CodePipeline のクォータ」:https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/limits.html
- AWS CodeBuild ユーザーガイド「buildspec の構文リファレンス」:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
- AWS CodeBuild ユーザーガイド「ビルドフェーズの移行」:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/view-build-details-phases.html
- AWS CodeBuild ユーザーガイド「ビルド環境の環境変数」:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html
- AWS CodeBuild ユーザーガイド「コンピューティングタイプ(ビルド環境)」:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-compute-types.html
- AWS CodeBuild ユーザーガイド「AWS CodeBuild のクォータ」:https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/limits.html
- AWS CodeDeploy ユーザーガイド「CodeDeploy とは」:https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/welcome.html
- GitHub Docs「GitHub Actions を理解する」:https://docs.github.com/ja/actions/get-started/understand-github-actions
- GitHub Docs「GitHub Actions の課金」:https://docs.github.com/ja/billing/concepts/product-billing/github-actions
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「AWS CodePipelineとは|CodeBuild・buildspec・料金」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。