FOR LEARNERS学習中向け

LIaC・CI/CD・開発運用段2構成層仕組み

CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由

CI/CD の仕組み|コミットから本番まで、ビルド・テスト・デプロイが自動で流れて止まる理由

Git でブランチを切ってプルリクエストを出し、IaC でインフラをコードにする、というところまでは分かった。けれど現場の人が「main にマージしたら、あとは CI/CD が本番まで持っていく」と言うとき、その間で何が起きているのかが見えない、という段階の人は多いはずです。

「自動で本番に出る」と聞くと怖く感じるかもしれません。実際の CI/CD は、自動で出す仕組みである以上に、決めた検査に落ちた変更を、自動で止める仕組みです。この記事では、コミットから本番までの流れと、どこで止まり、どう戻すのかを順に追います。

この記事の結論

  • CI/CD は、コードの変更をきっかけにビルド・テスト・デプロイを毎回同じ順で自動に流す仕組みです。
  • CI(継続的インテグレーション)は、変更を頻繁に合流させ、そのたびに自動でビルドとテストを回すことです。
  • 継続的デリバリーは本番に出せる状態まで自動で用意し、継続的デプロイは本番への反映まで自動で行います。
  • パイプラインは段の途中で失敗するとそこで止まり、壊れた変更を後ろの段に流しません。
  • 本番の切り替えには、新旧の環境を入れ替えるブルー/グリーンと、一部の通信から試すカナリアがあります。
  • AWS では CodePipeline が流れ全体を、CodeBuild がビルドとテストを、CodeDeploy が配布と切り替えを担います。

CI/CD とは|変更を小さく、何度も、同じ手順で届ける仕組み

CI/CD は、1つのツールの名前ではなく、開発のやり方の名前です。AWS のホワイトペーパー「Practicing Continuous Integration and Continuous Delivery on AWS」は、継続的インテグレーション(CI)を「開発者が変更を定期的に中央のリポジトリへ合流させ、そのたびに自動でビルドとテストを実行するやり方」と説明しています。

たとえるなら、工場の検品ラインです。部品(コードの変更)が届くたびに、機械が同じ順番で組み立て(ビルド)と検査(テスト)を行い、不良が見つかればラインを止めます。人が毎回手で組み立てて目で検査するより、見落としが減り、どの部品で不良が出たかもすぐ分かります。

正確な言葉に戻すと、CI/CD が解いている問題は次の3つです。

手作業のリリースで起きること CI/CD でどう変わるか
変更をためてから一度に出すので、壊れたときに原因の変更を探しにくい 変更ごとにビルドとテストが回り、どの変更で壊れたかがすぐ分かる
人によって手順が少しずつ違い、「あの人の手元では動いた」が起きる パイプラインの定義(コード)どおりに、毎回同じ手順で動く
本番に出す作業そのものが重く、怖いので回数が減る 出す作業が小さく軽くなり、戻す手順も用意されるので回数を増やせる

2つ目の「定義がコード」という点は、前に読んだ IaC と同じ考え方です。パイプラインの手順もリポジトリに置き、レビューして変える対象になります。

READ ALSO — 学習中向け・段2 構成 IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ

CI と CD は何が違うのか

CI/CD の「CD」には2つの意味があり、混ざって使われます。同じホワイトペーパーの定義で整理すると、次のようになります。

名前 どこまで自動か 本番への反映
継続的インテグレーション(CI) 合流のたびにビルドとテスト しない(本番とは切り離して考える)
継続的デリバリー(CD) ビルド・テストに加え、テスト環境などへの配布まで。本番に出せる状態を常に用意する 本番に出す最後の一歩に、人の承認を挟める
継続的デプロイ(CD) 本番への反映まで テストに通った変更は、人の明示的な承認なしに本番へ出る

ホワイトペーパーは、継続的デリバリーの目的を「すべての変更をすぐ本番に出すことではなく、すべての変更をいつでも本番に出せる状態にしておくこと」と書いています。違いは自動化の技術ではなく、本番に出す最後の判断を誰がするか、です。

現場では、テスト環境までは自動で流し、本番の前で人が承認する継続的デリバリーから始めることが多くあります。テストが十分に揃い、戻す仕組みに自信が持てたところで、承認を外して継続的デプロイに寄せていきます。

CHECK 1ここまでの確認

継続的デリバリーと継続的デプロイの違いとして正しいのはどれ?

答えと解説

答え: 2. 継続的デリバリーは本番に出せる状態まで自動で用意し、本番への反映に人の判断を挟める。継続的デプロイは本番まで自動で反映する

どちらもビルドとテストは自動です。違いは本番に出す最後の一歩を人が決めるかどうか。「CI と CD は何が違うのか」の章を読み直してください。

パイプラインはどう流れて、どこで止まるのか

コミットから本番までの一連の流れをパイプラインと呼びます。AWS CodePipeline の用語では、パイプラインはステージ(段)の並びで、各ステージの中にアクション(そこで行う作業)を置きます。段と段の間はアーティファクト(ソースコードやビルドの成果物)で受け渡します。

COMMIT TO PRODUCTIONパイプラインの流れ

コミットは同じ順番の段を通って本番に届く

  1. ソース

    マージや push がきっかけ

  2. ビルド

    依存を入れて成果物を作る

  3. テスト

    単体・静的解析・結合

  4. 承認

    本番の前で人が確認

  5. デプロイ

    テスト環境 → 本番

出典: AWS CodePipeline ユーザーガイド、Practicing CI/CD on AWS(ホワイトペーパー)

典型的な段は次のとおりです。

  1. ソース — main へのマージやタグの push をきっかけに、その時点のコードを取り出す
  2. ビルド — 依存ライブラリを入れ、コンパイルやコンテナイメージの作成を行う
  3. テスト — 単体テスト・静的解析・結合テストを回す(互いに独立したテストは同じ段で並列にできる)
  4. 承認 — 本番の前で人が確認する(継続的デリバリーの場合)
  5. デプロイ — テスト環境、次に本番へと配る

失敗したらそこで止まる

CodePipeline のドキュメントにあるとおり、ある段で失敗した実行はそこで止まり、パイプラインの最後まで流れません。テストが1つ落ちれば、その変更はデプロイの段に進みません。これが CI/CD の安全装置の本体です。

Linux のコマンドが返す「終了ステータス」が、ここで効いてきます。ビルドやテストのコマンドが 0 以外で終われば、その作業は失敗として扱われ、段が止まります。自動化の仕組みは、画面の文字ではなく、この成否で次に進むかを決めています。

止まったあとの扱いも用意されています。CodePipeline では、失敗した段を再試行したり、段の設定によって失敗時に直近の成功した実行まで自動で戻したりできます(設定できる条件は公式ドキュメントで確認してください)。

承認は「人が止めておく」段

手動承認のアクションを置くと、パイプラインはそこで止まり、誰かが承認するまで先に進みません。承認の依頼は Amazon SNS のトピックを通じてメールなどに届けられます。却下されるか、決められた期間内に応答が無ければ、その実行は失敗として扱われます。

WHERE IT STOPSパイプラインの門

検査に落ちた変更は、その段で止まって本番に届かない

パイプライン

  • ビルド成果物ができた テストへコマンドが 0 で終わる
  • テスト1つでも失敗 ここで止まる0 以外で終わる
  • 承認却下・無応答 失敗として扱う人が止めておく段
  • 本番アラーム 止めて前の版へエラー率などが基準を超える
出典: AWS CodePipeline・AWS CodeDeploy ユーザーガイド

CHECK 2ここまでの確認

パイプラインのテストの段で1つのテストが失敗したとき、既定で起きることはどれ?

答えと解説

答え: 1. その実行はそこで止まり、後ろの段(デプロイなど)には進まない

失敗した実行はパイプラインの最後まで流れずに止まります。止まることが、壊れた変更を本番に出さない安全装置です。「パイプラインはどう流れて、どこで止まるのか」の章を読み直してください。

AWS ではどのサービスが何を担うのか

AWS で CI/CD を組むときの主な部品は3つです。それぞれ担当する範囲がはっきり分かれています。

サービス 担うこと 何で定義するか
AWS CodePipeline 流れ全体の指揮。段の順番・きっかけ・承認・段どうしの受け渡し パイプラインの定義(段とアクション)
AWS CodeBuild ビルドとテストの実行。使うときだけ用意される環境でコマンドを動かす リポジトリの buildspec.yml(段階ごとのコマンド・成果物・テストレポート)
AWS CodeDeploy 配布と切り替え。EC2(とオンプレミスのサーバー)・Lambda・ECS へ新しい版を出す appspec ファイル(何をどこに置き、切り替えの前後で何を確かめるか)

AWS CodePipeline は指揮者で、自分ではビルドもデプロイもしません。ビルドの段では AWS CodeBuild を、デプロイの段では AWS CodeDeploy(や CloudFormation など)を呼び出します。

ソースの置き場所は、GitHub や GitLab、Bitbucket などの外部の Git を使うのが一般的です。CodePipeline からは AWS CodeConnections の接続を通じてこれらのリポジトリとつなぎ、push などをきっかけにパイプラインを動かせます。GitHub の場合は GitHub App を使った接続で、個人のアクセストークンを保管せずに済みます。

ビルドで秘密情報を扱うとき

データベースのパスワードのような値は、buildspec やパイプラインの定義に直接書きません。AWS Secrets Manager や Systems Manager のパラメータストアに置き、ビルドの実行時に参照して、ビルドのサービスロールには読み取りの権限だけを与えます。

GitHub Actions はどこに位置づくか

GitHub Actions は、GitHub が提供する CI/CD の仕組みです。リポジトリの .github/workflows に置いた YAML のワークフローが、push やプルリクエストなどのイベントで動き、ランナーと呼ばれるマシンの上でジョブを実行します。

役割で比べると、GitHub Actions は CodePipeline と CodeBuild の範囲を1つで担える仕組みです。よくある組み合わせは次の2つです。

  • GitHub Actions で完結させる:ビルド・テストから AWS へのデプロイまでをワークフローに書く。AWS へは、長期のアクセスキーを GitHub に置かず、OIDC で一時的な認証情報を受け取る形が GitHub の公式ドキュメントで案内されています
  • 役割で分ける:プルリクエストのテストは GitHub Actions で回し、main にマージされたあとの本番までの流れは CodePipeline が受け持つ

どちらが正しいというより、承認や本番の切り替え、ロールバックをどこで管理したいかで決めます。

本番へどう切り替えるのか|インプレース・ブルー/グリーン・カナリア

テストに通っても、本番で初めて分かる問題は残ります。そこで CodeDeploy のようなデプロイの仕組みは、切り替え方そのものを選べるようにしています。

HOW TO SWITCH本番の切り替え方

本番は一度に替えないやり方を選べる

  1. インプレース

    動いているサーバーを順に新しい版へ

    CodeDeploy では EC2・オンプレミスのみ

  2. ブルー/グリーン

    新しい環境を用意して、通信を切り替える

    旧環境が残っていれば通信を戻せる

  3. カナリア

    一部の通信で様子を見て、残りを一度に移す

    Lambda・ECS で選べる移し方

  4. リニア

    等しい割合ずつ、等しい間隔で移す

    Lambda・ECS で選べる移し方

出典: AWS CodeDeploy ユーザーガイド(Working with deployment configurations)
方式 何をするか 戻すとき
インプレース いま動いているサーバーを順に止めて新しい版に入れ替える(CodeDeploy では EC2・オンプレミスのみ) 直前の正常な版を、もう一度デプロイし直す
ブルー/グリーン 新しい版の環境(グリーン)を別に用意して確かめ、通信を旧環境(ブルー)から切り替える 旧環境が残っていれば、通信を戻す
カナリア 最初に一部の割合の通信だけを新しい版に流し、一定時間待ってから残りを一度に移す 様子見の間に問題が出れば、残りを移さず戻す
リニア 等しい割合ずつ、等しい間隔で少しずつ移す 途中で問題が出れば、その時点で戻す

CodeDeploy のドキュメントでは、Lambda と ECS へのデプロイで、カナリア・リニア・一括の3つの移し方を選べます。

戻す判断も自動にできます。CodeDeploy のデプロイグループに Amazon CloudWatch のアラーム(エラー率など)を関連付けておくと、デプロイ中にアラームが鳴ったときにデプロイを止め、直前の正常な版を新しいデプロイとして出し直すことができます。何を見てアラームを鳴らすかは、監視の設計そのものです。次に読む記事で扱います。

READ ALSO — 学習中向け・段2 構成 Amazon CloudWatch とは何か|メトリクス・ログ・アラーム・ダッシュボードで「何を見れば何が分かるか」

CI/CD を入れても防げないこと

  • テストが検出できない不具合は、パイプラインを素通りする(止まるのは検査に落ちたときだけ)
  • データベースの変更のように「戻す」が効かないものは、切り替え方式だけでは戻せない
  • パイプライン自身の権限が強すぎると、そこが本番を壊す入口になる

CHECK 3ここまでの確認

新しい版に最初はごく一部の通信だけを流し、様子を見てから残りを切り替える方式はどれ?

答えと解説

答え: 2. カナリア

カナリアは、最初に一部の割合を流して一定時間待ち、問題が無ければ残りを切り替えます。等間隔で少しずつ増やすのはリニアです。「本番へどう切り替えるのか」の章を読み直してください。

参照ソース

SCOREこの記事の確認テスト

0/3問 正解

各章の「ここまでの確認」に答えると、ここに集まります。結果はこの端末のブラウザにだけ残り、サーバには送りません。

PRACTICEこの記事の論点を練習問題で確かめる

この記事が扱うサービスの問題だけを続けて解けます。練習問題は Google でログインした人が使えます(練習問題の一覧)。

HAND IT OVER人に渡すなら

一言で説明するなら

工場の検品ラインです。部品が届くたびに組み立てと検査を機械が同じ順で行い、不良が出たらラインを止め、出荷は少しずつ試してから全部に切り替えます。

前提を持たない人にそのまま渡せる記事です。「後輩に説明する」「顧客に理由を伝える」の材料として。

FAQよくある質問

CI/CD は GitHub Actions と AWS CodePipeline のどちらで組めばよいですか?

どちらでも組めます。コードを GitHub に置き、ビルドとテストをリポジトリの近くで回したいなら GitHub Actions が自然です。本番の AWS アカウントの中で承認・デプロイ方式・ロールバックまで AWS のサービスで揃えたいなら CodePipeline・CodeBuild・CodeDeploy が向きます。GitHub Actions でビルドとテストを回し、デプロイを AWS 側に任せる組み合わせもあります。

CI/CD を入れると、テストを書かなくても品質は上がりますか?

上がりません。パイプラインが止めてくれるのは、テストやチェックが失敗を検出できたときだけです。テストが無ければ、壊れた変更もそのまま流れます。CI/CD は「決めた検査を毎回同じ順で漏れなく実行する仕組み」で、何を検査するかは人が決めます。

CodePipeline・CodeBuild・CodeDeploy の料金はどれくらいですか?

パイプラインの種類や実行時間、ビルドに使う環境の大きさで変わり、料金の体系も改定されることがあります。この記事では数値を書かずに、各サービスの公式の料金ページで最新の値を確認することをおすすめします。使わないパイプラインやビルドを残さないことが、止め忘れの対策になります。

SAME TRACK同じ領域の記事

CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用
CloudFormation のスタックが失敗したときの直し方|イベントを読み、ロールバックを続けるか止めるか決める運用 段2 構成運用
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計
デプロイ方式の選び方|インプレース・ブルー/グリーン・カナリアを「戻しやすさ」と「止められない度」で決める設計 段2 構成設計
IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ
IaC とは何か|手作業との違いと宣言型、CloudFormation・CDK・Terraform の位置づけ 段2 構成とは