AWS CodeDeploy の EC2/オンプレミスデプロイ - AppSpec とライフサイクルフックの設計

AppSpec ファイルでデプロイ先パスとライフサイクルフックを宣言的に定義する。タグベースのデプロイグループと Auto Scaling 統合によるフリート管理を紹介します。

AppSpec ファイルの構造

EC2/オンプレミスデプロイの AppSpec ファイル (appspec.yml) は、files セクションでソースファイルのデプロイ先パスを定義し、permissions セクションでファイルの所有者と権限を設定し、hooks セクションでライフサイクルの各段階で実行するスクリプトを指定します。files セクションでは source (リビジョン内のパス) と destination (インスタンス上のパス) のマッピングを定義します。permissions セクションでは owner、group、mode を指定し、デプロイされたファイルの権限を適切に設定します。

ライフサイクルフックの活用

ライフサイクルフックはデプロイの各段階で実行されるスクリプトです。BeforeInstall はファイルのデプロイ前に実行され、古いバージョンのクリーンアップや依存パッケージのインストールに使用します。AfterInstall はファイルのデプロイ後に実行され、設定ファイルの生成やデータベースマイグレーションに使用します。ApplicationStart はアプリケーションの起動スクリプトを実行します。ValidateService はデプロイ後のヘルスチェックを実行し、アプリケーションが正常に動作していることを検証します。ValidateService が失敗するとデプロイが失敗として記録され、自動ロールバックが設定されている場合は前バージョンに戻ります。

デプロイグループとフリート管理

デプロイグループはデプロイ対象のインスタンスをグループ化する単位です。タグフィルターで Environment:Production かつ Role:WebServer のインスタンスを選択するといった動的な指定が可能です。 Auto Scaling グループとの統合では、スケールアウトで新しく起動したインスタンスに自動的に最新のリビジョンがデプロイされます。デプロイ設定で最小正常ホスト数を指定し、デプロイ中に常に一定数のインスタンスがリクエストを処理し続けることを保証します。 CodeDeployDefault.OneAtATime は 1 台ずつ、 CodeDeployDefault.HalfAtATime は半数ずつデプロイする事前定義の設定です。 EC2 デプロイのプラクティスを深く理解するには、専門書籍 (Amazon)が役立ちます。

CodeDeploy の料金

CodeDeploy の EC2/オンプレミスデプロイは無料で利用できます。EC2 インスタンスへのデプロイに追加料金は発生しません。オンプレミスサーバーへのデプロイは 1 インスタンスあたり 1 デプロイにつき約 0.02 ドルです。ECSLambda へのデプロイも無料です。CodeDeploy 自体のコストは実質ゼロに近く、CI/CD パイプラインのデプロイステージとして導入のハードルが低い点が魅力です。

まとめ

CodeDeploy の EC2/オンプレミスデプロイは AppSpec ファイルとライフサイクルフックで宣言的にデプロイプロセスを定義します。タグベースのデプロイグループで動的なフリートに対応し、最小正常ホスト数でデプロイ中の可用性を保証します。オンプレミスサーバーも対象に含められるため、ハイブリッド環境の統一的なデプロイ管理に有効です。