5日目: デプロイの自動化の第一歩:AWS CodeDeployの基本設定
はじめに:ビルドの次はいよいよデプロイ
昨日はAWS CodeBuildを使って、Pythonプロジェクトのビルドとテストを自動化する方法を学びました。コードの品質が自動的にチェックされ、ビルド成果物が生成されるようになったことで、CI(継続的インテグレーション)の基盤が整いました。
しかし、この成果物を本番環境に手動でデプロイしていては、CI/CDの真の価値は発揮されません。リリースプロセス全体を自動化することで、初めてデリバリーのスピードと信頼性が向上します。
ここで登場するのが、デプロイメントを自動化するサービスAWS CodeDeployです。私自身、CodeDeployを導入してからは、深夜のデプロイ作業から解放され、安心してリリースを行えるようになりました。手動デプロイにつきものだった設定ミスやバージョン管理の煩雑さも解消され、チーム全体の生産性が向上したことを実感しています。
本記事では、このCodeDeployを使って、アプリケーションをEC2インスタンスにデプロイする基本設定を解説します。今回は、CodeDeployのコアとなる「デプロイグループ」「アプリケーション」「リビジョン」といった概念から、デプロイプロセスを定義する**appspec.yml**ファイルの作成まで、実践的なステップを追っていきましょう。
AWS CodeDeployとは?その役割とメリット
AWS CodeDeployは、EC2インスタンス、オンプレミスサーバー、AWS Lambda、Amazon ECSなど、様々な環境へのアプリケーションデプロイを自動化するサービスです。CI/CDパイプラインにおいて、ビルドされた成果物を安全かつ確実にターゲット環境に展開する役割を担います。
CodeDeployの主なメリットは以下の通りです。
- 自動化と信頼性: デプロイプロセスを一貫して自動化することで、ヒューマンエラーを排除し、デプロイの信頼性を高めます。
- ダウンタイムの最小化: ブルー/グリーンデプロイやローリングアップデートなどのデプロイ戦略を選択でき、デプロイ中のサービスダウンタイムを最小限に抑えられます。
- ロールバック機能: デプロイが失敗した場合や、デプロイ後のヘルスチェックで問題が検出された場合に、自動的に以前のバージョンにロールバックできます。
- 多様なデプロイターゲット: クラウド環境だけでなく、オンプレミスのサーバーにも対応するため、既存のインフラを活かしたCI/CDも構築可能です。
- フック機能: デプロイプロセスの各フェーズ(デプロイ前、アプリケーション開始後など)でカスタムスクリプトを実行する「フック」を定義できます。
CodeDeployは、CI/CDパイプラインのデプロイステージを担う、デリバリーの心臓部と言えるサービスです。
1. CodeDeployの基本コンポーネント
CodeDeployを理解するためには、以下の3つのコンポーネントを把握することが不可欠です。
-
アプリケーション (Application): デプロイするアプリケーションの名前です。例えば、
MyPythonWebAppのように、論理的な単位でアプリケーションを定義します。 - デプロイグループ (Deployment Group): アプリケーションのデプロイターゲットとなるサーバーのセットです。例えば、「本番環境のWebサーバー群」「ステージング環境のWebサーバー群」といった単位でグループを分けます。EC2タグやAuto Scalingグループでインスタンスを識別します。
- リビジョン (Revision): デプロイ対象となるアプリケーションのソースコードやスクリプト、設定ファイルなどの集合体です。CodeBuildで生成された成果物がこれにあたります。S3やGitHubに保存されます。
今回は、EC2インスタンス1台にPythonアプリケーションをデプロイするケースを想定して設定を進めます。
2. EC2インスタンスの準備とCodeDeployエージェントのインストール
CodeDeployを使ってEC2にデプロイするには、まずターゲットとなるEC2インスタンスにCodeDeployエージェントをインストールする必要があります。このエージェントが、CodeDeployサービスからの命令を受け取り、アプリケーションのデプロイを実行します。
手順
-
EC2インスタンスの起動:
- AWSマネジメントコンソールからEC2インスタンスを1台起動します。OSはAmazon Linux 2やUbuntuなど、CodeDeployエージェントがサポートしているものを選びます。
-
EC2インスタンスへのIAMロールの割り当て:
- CodeDeployエージェントがAWSサービスと通信するために、IAMロールが必要です。
- IAMコンソールで新しいロールを作成し、「EC2」を信頼エンティティとして選択します。
- ロールに
AmazonEC2RoleforAWSCodeDeployポリシーをアタッチします。 - 作成したロールをEC2インスタンスに割り当てます。
-
CodeDeployエージェントのインストール:
- EC2インスタンスにSSHで接続します。
- 以下のコマンドでCodeDeployエージェントをインストールします。(OSがAmazon Linux 2の場合)
# CodeDeployエージェントのセットアップ sudo yum update -y sudo yum install -y ruby cd /home/ec2-user wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install chmod +x ./install sudo ./install auto # エージェントの状態を確認 sudo systemctl status codedeploy-agentこれでEC2インスタンス側の準備は完了です。
3. CodeDeployアプリケーションとデプロイグループの作成
次に、CodeDeployのサービス側で、アプリケーションとデプロイグループを作成します。
手順
-
CodeDeployサービスへ移動:
- AWSマネジメントコンソールからCodeDeployサービスに移動します。
-
アプリケーションの作成:
- 左側のナビゲーションペインから「アプリケーション」を選択し、「アプリケーションの作成」をクリックします。
-
アプリケーション名:
MyPythonWebApp -
コンピュートプラットフォーム:
EC2/オンプレミス - 「アプリケーションの作成」をクリックします。
-
デプロイグループの作成:
- 作成したアプリケーションの詳細画面で、「デプロイグループの作成」をクリックします。
-
デプロイグループ名:
Production -
サービスロール: CodeDeployがEC2インスタンスにアクセスするためのIAMロールを選択します。新規作成する場合は、「
AWSCodeDeployRole」というマネージドポリシーをアタッチしたロールを作成します。 -
デプロイタイプ:
インプレース(既存のインスタンスを更新する最も基本的なデプロイタイプ) -
環境設定:
- Amazon EC2 インスタンス: チェックを入れ、デプロイターゲットとなるEC2インスタンスに付与したタグを指定します。
- 例えば、
NameキーにMyPythonWebApp-Serverというタグを付けたEC2インスタンスを指定します。
-
デプロイ設定:
CodeDeployDefault.OneAtATimeを選択します。 - ロードバランシング: 今回は使用しないため、無効化します。
- 「デプロイグループの作成」をクリックします。
これでCodeDeployサービス側の基本設定が完了しました。
4. appspec.ymlの作成:デプロイプロセスの定義
CodeDeployがビルド成果物をどのようにデプロイするかを指示するのが、**appspec.yml**というYAML形式のファイルです。このファイルをビルド成果物(リビジョン)に含めることで、CodeDeployエージェントはデプロイの各フェーズで何を実行すべきかを認識できます。
appspec.ymlには、主に以下のセクションを記述します。
-
version:appspec.ymlのバージョン。通常は0.0です。 -
os: ターゲットサーバーのOS。linuxまたはwindows。 -
files: デプロイ対象のファイルを、リビジョン内のパスからサーバー上のどこに配置するかを指定します。 -
hooks: デプロイのライフサイクルイベント(BeforeInstall,AfterInstall,ApplicationStartなど)で実行するスクリプトを定義します。
Pythonアプリケーション向けのappspec.yml例
今回は、CodeBuildで生成されたアプリケーションZIPファイルにappspec.ymlが含まれていることを想定します。
version: 0.0
os: linux
files:
- source: / # リビジョン内のすべてのファイルを
destination: /home/ec2-user/my-python-app # EC2インスタンスのこのパスに配置する
hooks:
BeforeInstall:
- location: scripts/install_dependencies.sh # 依存関係をインストールするスクリプト
timeout: 300
runas: root
AfterInstall:
- location: scripts/start_application.sh # アプリケーションを起動するスクリプト
timeout: 300
runas: ec2-user
ApplicationStop:
- location: scripts/stop_application.sh # アプリケーションを停止するスクリプト
timeout: 60
runas: ec2-user
この例では、appspec.ymlと同じディレクトリにscriptsディレクトリがあり、その中にフックで指定したシェルスクリプトが含まれていることを前提としています。
フックスクリプトの例
appspec.ymlで定義したフックスクリプトの簡単な例を見てみましょう。
scripts/install_dependencies.sh
#!/bin/bash
# 必要なライブラリをインストール
pip install -r /home/ec2-user/my-python-app/requirements.txt
scripts/start_application.sh
#!/bin/bash
# バックグラウンドでアプリケーションを起動
nohup python /home/ec2-user/my-python-app/hello.py > /dev/null 2>&1 &
scripts/stop_application.sh
#!/bin/bash
# 実行中のアプリケーションプロセスを停止
ps -ef | grep 'python /home/ec2-user/my-python-app/hello.py' | grep -v grep | awk '{print $2}' | xargs kill || true
これらのスクリプトとappspec.ymlを、hello.pyやrequirements.txtと共にCodeCommitリポジトリに配置し、CodeBuildでZIPファイルとしてパッケージングするようにbuildspec.ymlを修正します。
5. CodeDeployでのデプロイ実行(手動)
CI/CDパイプライン全体を構築する前に、CodeBuildで作成したリビジョン(ZIPファイル)を手動でデプロイしてみましょう。
手順
-
CodeBuildで成果物を作成:
- CodeBuildの
buildspec.ymlにartifactsセクションを追加し、ZIPファイルを作成してS3にアップロードするように設定します。
- CodeBuildの
-
デプロイの作成:
- CodeDeployコンソールで「デプロイを作成」をクリックします。
-
アプリケーション:
MyPythonWebApp -
デプロイグループ:
Production -
リビジョンタイプ:
Amazon S3を選択し、CodeBuildでアップロードしたZIPファイルの場所を指定します。 - 「デプロイを作成」をクリックします。
デプロイが開始されると、CodeDeployコンソールでデプロイの進捗状況(各インスタンスでのフェーズの実行状況)をリアルタイムで確認できます。すべてのフックスクリプトが成功すれば、デプロイは成功となります。
まとめ:CodeDeployでデリバリーを自動化する
本日は、CI/CDのデプロイメントを担うAWS CodeDeployの基本設定を学びました。EC2インスタンスの準備から、CodeDeployの主要コンポーネント、そしてデプロイプロセスを定義するappspec.ymlファイルの作成まで、一連の流れを解説しました。
CodeDeployは、単にファイルをサーバーにコピーするだけでなく、デプロイ中のサービス停止を最小限に抑えたり、自動ロールバックを可能にしたりすることで、アプリケーションのリリースを安全かつ確実なものにしてくれます。この自動化は、グローバルなAI企業のような環境で、迅速かつ高頻度なリリースを実現するために不可欠です。
明日は、これまで学んできたCodeCommit、CodeBuild、CodeDeployを一つの流れに統合するサービスAWS CodePipelineについて解説します。いよいよCI/CDの全自動パイプラインが完成に近づきます。お楽しみに!