「コードを書き終わったのに、サーバーへの反映が手動で面倒」「デプロイのたびにミスが怖い」という悩みを持つエンジニアは少なくありません。こうした課題を解決するのが「AWS CodeDeploy」というサービスです。今回は、CodeDeployの基本的な仕組みから、GitHubとの連携、CI/CDパイプラインの全体像まで、エンジニア初心者にも分かりやすく解説します。
そもそも「デプロイ」って何?
まず最初に「デプロイ」という言葉から整理しましょう。デプロイとは、開発したアプリケーションのコードをサーバーに配置して、実際にユーザーが使える状態にする作業のことです。
たとえば、Webサービスの新機能を開発したとします。その機能をユーザーに届けるためには、書いたコードを本番のサーバーにアップロードして、アプリケーションを再起動するという作業が必要です。これがデプロイです。
小規模なシステムや開発初期であれば、手動でサーバーにSSH接続してファイルをアップロードする、という方法でも対応できます。しかし、システムが大きくなり、複数台のサーバーを同時に更新しなければならなくなったり、1日に何度もデプロイが必要になったりすると、手動対応ではミスや工数の増大につながっていきます。こうした課題を解決するために生まれたのが、デプロイを自動化するツール群です。
AWS CodeDeployとは
AWS CodeDeployは、アプリケーションのデプロイを自動化するAWSのマネージドサービスです。EC2インスタンス・オンプレミスサーバー・Lambda関数・ECSコンテナなど、様々な環境へのデプロイをサポートしています。
CodeDeployの大きな特徴は、「デプロイ中にサービスを止めない」ための仕組みが標準で用意されている点です。デプロイ方式として、以下の3種類が代表的です。
インプレースデプロイは既存のサーバーに直接新しいコードを上書きする方法です。シンプルですが、デプロイ中はそのサーバーが一時的にサービスから切り離されるため、サーバー台数が少ないとダウンタイムが発生するリスクがあります。
ブルー/グリーンデプロイは、新しいバージョンのサーバー(グリーン環境)を別に立ち上げてデプロイを完了させ、問題がなければトラフィックをグリーン環境に切り替えるという方法です。切り替えの瞬間以外はダウンタイムがゼロで、問題が発生したときはすぐに元の環境(ブルー環境)に戻せるため、本番環境での採用が多い方式です。
カナリアリリースは全体の一部(たとえば5%)のトラフィックだけを新しいバージョンに向け、問題がなければ徐々に割合を増やしていく方式です。新機能を少数のユーザーで試しながら安全に展開できます。
AppSpecファイルという設計図
CodeDeployでデプロイを実行する際、どのファイルをどこに配置するか、デプロイ前後にどのコマンドを実行するかを定義する設定ファイルが必要です。これを「AppSpecファイル」と呼びます。
AppSpecファイルはYAML形式で書かれており、たとえば以下のような内容を定義します。
- 配置するファイルのパスと配置先
- デプロイ前に実行するスクリプト(例:アプリケーションの停止コマンド)
- ファイル配置後に実行するスクリプト(例:アプリケーションの起動コマンド)
- デプロイ後の疎通確認スクリプト
このAppSpecファイルをアプリケーションのコードと一緒にリポジトリに含めておくことで、CodeDeployが自動的に読み込んで処理を実行します。
CodeDeployエージェントの役割
CodeDeployを使うEC2インスタンスには「CodeDeployエージェント」というソフトウェアをインストールする必要があります。このエージェントが、CodeDeployからの指示を受け取り、実際のサーバー上でのデプロイ処理を実行する役割を担います。
エージェントはバックグラウンドで常時動作しており、CodeDeployからデプロイ指示が来るたびに、AppSpecファイルに従ってファイルの配置やスクリプトの実行を行います。Systems Manager(SSM)を使ってエージェントのインストールや更新を一括管理することが、実務では一般的です。
GitHubとの連携でデプロイが変わる
CodeDeployは、GitHubと連携することで、コードの変更をトリガーにした自動デプロイの仕組みを構築できます。これにより、「GitHubにプッシュしたら自動でサーバーに反映される」という流れが実現できます。
連携の流れはシンプルです。開発者がGitHubのリポジトリにコードをプッシュすると、そのイベントをきっかけにCodeDeployが起動し、指定したEC2インスタンスやECSクラスターへの自動デプロイが始まります。
GitHubとの連携のメリットは大きく2つあります。1つは「ヒューマンエラーの削減」です。手動でサーバーに接続してコマンドを実行する場合、誤ったブランチのコードを反映させたり、手順を間違えたりするリスクがあります。GitHubへのプッシュをトリガーにすることで、常に正しいコードが正しい手順でデプロイされます。もう1つは「デプロイの記録が残る」ことです。いつ、誰が、どのコードをデプロイしたかという履歴がGitHubとCodeDeployの両方に残るため、障害発生時の原因特定や、どのバージョンに戻すかという判断がしやすくなります。
CI/CDパイプラインの全体像
CodeDeployは単体でも使えますが、AWS CodePipelineと組み合わせることで「CI/CDパイプライン」という、より強力な自動化の仕組みを構築できます。CI/CDとは何か、パイプラインの全体像を整理してみます。
**CI(継続的インテグレーション)**は、コードの変更をリポジトリに反映するたびに、自動でビルド(コードのコンパイル・依存パッケージの取得など)とテストを実行する仕組みです。問題のあるコードが早期に発見されるため、後工程での手戻りを減らせます。
**CD(継続的デリバリー/デプロイ)**は、CIで問題がなかったコードを、自動的に本番環境またはステージング環境にデプロイする仕組みです。CodeDeployはこのCD部分を担当するサービスです。
CodePipelineを使ったパイプラインの全体像は以下のようになります。
GitHubにコードをプッシュ
↓
CodePipeline がトリガー
↓
CodeBuild(ビルド・テストの自動実行)
↓
テスト通過
↓
CodeDeploy(EC2/ECS/Lambdaへの自動デプロイ)
↓
デプロイ完了・通知
このパイプラインが整っていると、開発者はコードを書いてGitHubにプッシュするだけで、ビルド・テスト・デプロイまでが自動で完了します。「コードを書く」という本来の作業に集中できる環境が整うわけです。
実際の企業でどう使われているか
企業でのCodeDeployの典型的な活用パターンをいくつか紹介します。
ステージング環境への自動デプロイは、developブランチへのマージをトリガーに、ステージング環境(本番に近いテスト用環境)へ自動デプロイする構成です。開発チームが「ステージングを最新にしてください」という作業をせずに、常に最新のコードがステージングに反映されている状態を維持できます。
本番環境への承認付きデプロイは、本番環境へのデプロイにはCodePipelineの「手動承認アクション」を挟む構成です。ステージングでの確認が終わったら、担当者がAWSコンソール上でOKボタンを押すことで本番デプロイが始まります。「自動化しつつも、本番だけは人間の目で確認する」というバランスを取れます。
CloudWatchと連携した自動ロールバックは、デプロイ後にエラー率が急増した場合、CloudWatchアラームが発火してCodeDeployが自動的に以前のバージョンに戻す構成です。深夜のデプロイ後に問題が発生しても、エンジニアが気づく前に自動で復旧できます。
CodeDeployを使う上で知っておきたいポイント
CodeDeployを実際に使い始める前に、知っておくと役立つポイントをまとめます。
デプロイグループという概念があります。デプロイグループとは、「どのEC2インスタンスにデプロイするか」を定義したグループです。EC2のタグを使って「Envタグがproductionのインスタンスすべて」のように指定できるため、本番・ステージング・開発環境を分けたデプロイが管理しやすくなります。
ライフサイクルフックも重要です。デプロイのプロセスには複数のフェーズがあり(BeforeInstall・AfterInstall・ApplicationStartなど)、各フェーズでカスタムスクリプトを実行できます。たとえばデプロイ前にアプリケーションを停止し、デプロイ後に起動して疎通確認を行う、という一連の流れをライフサイクルフックで定義します。
ロールバックの仕組みも押さえておきましょう。デプロイに失敗した場合や、CloudWatchアラームが発火した場合に、自動的に以前のバージョンに戻す設定ができます。これにより、デプロイ失敗による長時間のサービス停止を防ぐことができます。
まとめ
AWS CodeDeployは、アプリケーションのデプロイを自動化し、ヒューマンエラーやダウンタイムを最小化するためのサービスです。GitHubとの連携やCodePipelineとの組み合わせによって、コードをプッシュするだけでビルド・テスト・デプロイまでが自動で完了するCI/CDパイプラインを構築できます。ブルー/グリーンデプロイやカナリアリリースといったデプロイ方式を使いこなすことで、本番環境への影響を最小限に抑えながら、スピーディーなリリースサイクルを実現できます。クラウドエンジニアとして働く上で、CodeDeployの仕組みを理解しておくことは、実務でのデプロイ設計や障害対応の場面で必ず役立つ知識です。

コメント