PowerShellを使用してAWS CodeDeployのロールバックを自動化することで、リリース失敗時の復元を迅速かつ確実に行う方法について解説します。
AWS CodeDeployは、アプリケーションのデプロイを自動化するためのサービスであり、EC2インスタンスやオンプレミス環境、Lambda関数などに適用できます。しかし、デプロイが失敗した場合、迅速なロールバックを行わなければ、サービス停止や障害の長期化につながる可能性があります。
本記事では、PowerShellスクリプトを利用して、AWS CodeDeployのデプロイメント履歴を取得し、失敗を自動検出したうえで、前回の正常なバージョンへ即座にロールバックする方法を解説します。さらに、ロールバック後の動作確認、ログ取得、自動監視の手法についても紹介し、実践的な運用に役立つ情報を提供します。
これにより、デプロイ失敗時の手動対応の負担を減らし、システムの安定稼働を支援する仕組みを構築できます。
AWS CodeDeployの基本概念とロールバックの重要性
AWS CodeDeployは、アプリケーションのデプロイを自動化し、さまざまな環境(Amazon EC2、オンプレミスサーバー、Lambda関数など)に適用できるサービスです。これにより、手作業によるデプロイのミスを防ぎ、一貫したリリースプロセスを実現できます。
AWS CodeDeployの基本構成
AWS CodeDeployでは、デプロイメントを実行する際に、以下の主要な要素が関与します。
- アプリケーション(Application): CodeDeployで管理する対象のアプリケーション。
- デプロイメントグループ(Deployment Group): デプロイ対象となるインスタンスのグループ。
- デプロイメント設定(Deployment Configuration): デプロイの方法(例:全インスタンスへ一括適用や段階的適用など)。
- AppSpecファイル: デプロイプロセスの定義ファイル。どのファイルをどこに配置するか、どのスクリプトを実行するかを指定。
- デプロイメントID: 各デプロイメントに割り当てられる一意の識別子。
ロールバックの必要性
デプロイが失敗すると、システムの正常な動作が妨げられ、サービス提供に支障をきたす可能性があります。そのため、素早く前のバージョンに戻すロールバックの仕組みが重要となります。
ロールバックが求められるケース
- 新バージョンにバグが含まれている
新しくリリースしたバージョンが正常に動作しない場合、すぐに以前のバージョンへ戻すことで影響を最小限に抑えられます。 - デプロイ中にエラーが発生した
インストールスクリプトの不具合や依存関係の問題により、デプロイが正常に完了しない場合、手動での復旧作業は時間がかかります。 - 設定ミスや環境依存の問題
環境設定の誤りにより、想定通りに動作しない場合、速やかにロールバックを実施することで、システムのダウンタイムを削減できます。
CodeDeployのロールバック方法
AWS CodeDeployでは、以下の方法でロールバックを行えます。
- 手動ロールバック
AWS Management ConsoleやAWS CLIを使用して、以前の正常なバージョンを再デプロイする方法。 - 自動ロールバック
CodeDeployのデプロイ設定で、デプロイの失敗を検知した際に、自動的にロールバックするように設定する。 - PowerShellスクリプトによるロールバック
PowerShellスクリプトを活用し、デプロイメント履歴を自動取得し、失敗した場合に即座にロールバックを実行する方法。
次のセクションでは、PowerShellを使用してAWS CLIをセットアップし、ロールバックを自動化する準備を進めていきます。
PowerShellを用いたAWS CLIのセットアップ
AWS CodeDeployのデプロイ履歴を取得し、ロールバックを自動化するためには、PowerShellからAWS CLIを操作できる環境を構築する必要があります。本セクションでは、AWS CLIのインストールから認証設定までを解説します。
AWS CLIのインストール
まず、AWS CLI(Command Line Interface)をPowerShellで利用できるようにするために、以下の手順でインストールを行います。
- AWS CLIの公式サイトから最新バージョンのインストーラーをダウンロード
AWS CLI インストールページ - Windows用インストーラーを実行し、指示に従ってセットアップ
- PowerShellでインストールの確認
インストールが完了したら、PowerShellを開いて以下のコマンドを実行し、AWS CLIが正常にインストールされたことを確認します。
aws --version
正しくインストールされていれば、バージョン情報が表示されます。例:
aws-cli/2.x.x Python/3.x.x Windows/x86_64
AWS CLIの認証設定
AWS CLIを利用するためには、適切な認証情報を設定する必要があります。認証には IAMユーザーのアクセスキー を使用します。
- IAMユーザーの作成(必要な場合)
- AWS マネジメントコンソールにログインし、「IAM(Identity and Access Management)」サービスを開く
- 「ユーザー」→「新しいユーザーを作成」
- 「プログラムによるアクセス」を有効にし、必要な権限(
AWSCodeDeployFullAccess
など)を付与 - アクセスキーIDとシークレットアクセスキーを取得
- PowerShellで認証情報を設定
取得したアクセスキー情報をPowerShellで設定します。
aws configure
以下のプロンプトに対して、該当する情報を入力します。
AWS Access Key ID [None]: <アクセスキーID>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json
Default region name
はCodeDeployを利用するAWSリージョンを指定(例:東京リージョンap-northeast-1
)Default output format
はjson
を指定するのが一般的
設定の確認
設定が正しく適用されているか、以下のコマンドで確認します。
aws sts get-caller-identity
成功すると、現在のIAMユーザー情報が表示されます。
{
"UserId": "AIDAEXAMPLEID",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/MyUser"
}
PowerShell用のAWSモジュール(AWS Tools for PowerShell)のインストール
PowerShellでAWSを操作する場合、AWS Tools for PowerShellも利用できます。インストールは以下のコマンドで実行します。
Install-Module -Name AWS.Tools.Installer -Force
Install-AWSToolsModule AWS.Tools.CodeDeploy -Force
このモジュールを利用すると、PowerShellコマンドレットを使ってAWSリソースを操作できます。
セットアップ完了後の準備
AWS CLIと認証の設定が完了したら、次のステップとして CodeDeployのデプロイメント履歴を取得する方法 を説明します。これにより、失敗したデプロイを検出し、自動ロールバックの準備を進めます。
CodeDeployのデプロイメント履歴の取得方法
AWS CodeDeployのロールバックを自動化するには、まず過去のデプロイメント履歴を取得し、どのデプロイが成功し、どのデプロイが失敗したのかを判断する必要があります。本セクションでは、PowerShellを利用してAWS CodeDeployのデプロイメント履歴を取得する方法を解説します。
AWS CLIを使用したデプロイ履歴の取得
AWS CLIを使用して、CodeDeployのデプロイメント履歴を取得するには、以下のコマンドを使用します。
aws deploy list-deployments --application-name <アプリケーション名> --deployment-group-name <デプロイメントグループ名> --region <リージョン>
例: MyApp
というアプリケーションの MyDeploymentGroup
のデプロイ履歴を取得する場合(東京リージョン: ap-northeast-1
)
aws deploy list-deployments --application-name MyApp --deployment-group-name MyDeploymentGroup --region ap-northeast-1
このコマンドを実行すると、デプロイメントIDのリストがJSON形式で返されます。
{
"deployments": [
"d-ABCDEF123",
"d-GHIJKL456",
"d-MNOPQR789"
]
}
デプロイメントの詳細情報を取得
各デプロイメントの詳細情報を取得するには、aws deploy get-deployment
コマンドを使用します。
aws deploy get-deployment --deployment-id <デプロイメントID> --region <リージョン>
例えば、d-ABCDEF123
の詳細情報を取得する場合:
aws deploy get-deployment --deployment-id d-ABCDEF123 --region ap-northeast-1
出力例:
{
"deploymentInfo": {
"deploymentId": "d-ABCDEF123",
"applicationName": "MyApp",
"deploymentGroupName": "MyDeploymentGroup",
"status": "Succeeded",
"createTime": 1672500000.0,
"completeTime": 1672503600.0,
"deploymentOverview": {
"Succeeded": 2,
"Failed": 0,
"Pending": 0
}
}
}
この出力から、デプロイの成功 ("status": "Succeeded"
) や失敗 ("status": "Failed"
) を判定できます。
PowerShellスクリプトで最新のデプロイメントを取得
PowerShellを使って最新のデプロイメントIDを取得するスクリプトは以下の通りです。
$ApplicationName = "MyApp"
$DeploymentGroupName = "MyDeploymentGroup"
$Region = "ap-northeast-1"
# 最新のデプロイメントIDを取得
$LatestDeploymentId = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[0]" --output text
Write-Host "最新のデプロイメントID: $LatestDeploymentId"
このスクリプトを実行すると、指定したアプリケーションの最新のデプロイメントIDが表示されます。
失敗したデプロイメントをフィルタリング
デプロイが失敗しているかを判定するには、以下のスクリプトを使用します。
$DeploymentStatus = aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region --query "deploymentInfo.status" --output text
if ($DeploymentStatus -eq "Failed") {
Write-Host "最新のデプロイメント ($LatestDeploymentId) は失敗しました。"
} else {
Write-Host "最新のデプロイメント ($LatestDeploymentId) は成功しました。"
}
このスクリプトにより、最新のデプロイメントが失敗 (Failed
) しているかどうかを確認できます。
次のステップ
この方法でデプロイメントの履歴を取得し、失敗したデプロイを特定できます。次のステップでは、PowerShellスクリプトを活用して 失敗したデプロイメントを自動検出 する方法について解説します。
失敗したデプロイメントの自動検出
AWS CodeDeployのロールバックを自動化するには、まずデプロイメントのステータスを監視し、失敗したデプロイメントを自動的に検出する必要があります。本セクションでは、PowerShellスクリプトを使用して失敗したデプロイメントを特定する方法を解説します。
デプロイメントのステータスを確認する
AWS CodeDeployのデプロイメントのステータスは、以下の5つの状態に分類されます。
- Created(作成済み)
- InProgress(進行中)
- Succeeded(成功)
- Failed(失敗)
- Stopped(停止済み)
デプロイメントが “Failed” の場合、自動ロールバックを実行するトリガーとして利用できます。
PowerShellを使用した失敗デプロイの検出
以下のPowerShellスクリプトを実行すると、最新のデプロイメントを取得し、そのステータスをチェックできます。
# 変数の設定
$ApplicationName = "MyApp" # CodeDeployのアプリケーション名
$DeploymentGroupName = "MyDeploymentGroup" # デプロイメントグループ名
$Region = "ap-northeast-1" # 使用するAWSリージョン
# 最新のデプロイメントIDを取得
$LatestDeploymentId = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[0]" --output text
# デプロイメントのステータスを取得
$DeploymentStatus = aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region --query "deploymentInfo.status" --output text
# ステータスの判定
if ($DeploymentStatus -eq "Failed") {
Write-Host "最新のデプロイメント ($LatestDeploymentId) は失敗しました。ロールバックを開始します。"
} else {
Write-Host "最新のデプロイメント ($LatestDeploymentId) は $DeploymentStatus です。"
}
このスクリプトを実行すると、最新のデプロイメントの状態を取得し、失敗している場合はロールバックの実行を促すメッセージを表示します。
複数のデプロイメントをチェックする
デプロイ履歴の中から 過去5件 のデプロイメントをチェックし、失敗したものを一覧にする場合は、以下のスクリプトを使用します。
# 変数の設定
$ApplicationName = "MyApp"
$DeploymentGroupName = "MyDeploymentGroup"
$Region = "ap-northeast-1"
# 過去5件のデプロイメントIDを取得
$DeploymentIds = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[:5]" --output json | ConvertFrom-Json
Write-Host "過去5件のデプロイメント状況:"
# 各デプロイメントのステータスをチェック
foreach ($DeploymentId in $DeploymentIds) {
$DeploymentStatus = aws deploy get-deployment --deployment-id $DeploymentId --region $Region --query "deploymentInfo.status" --output text
if ($DeploymentStatus -eq "Failed") {
Write-Host "❌ デプロイメント $DeploymentId は失敗しました。"
} else {
Write-Host "✅ デプロイメント $DeploymentId は $DeploymentStatus です。"
}
}
このスクリプトを実行すると、過去5件のデプロイメントの状況が確認できます。
スクリプトを定期実行する方法
PowerShellスクリプトを一定時間ごとに自動実行するには、Windowsのタスクスケジューラを使用します。
- タスクスケジューラを開く(
taskschd.msc
を実行) - 新しいタスクを作成
- 「基本タスクの作成」を選択
- 名前を「CodeDeployチェック」などにする
- トリガーの設定
- 「タスクの開始」→「スケジュールされた時刻」または「毎時」
- 実行間隔を5分~15分程度に設定
- アクションの設定
- 「プログラムの開始」→
powershell.exe
- 引数として
-File "C:\Scripts\CheckCodeDeploy.ps1"
を指定
- タスクを保存して有効化
この設定により、失敗したデプロイを定期的に監視し、検出時に自動でロールバックを実行する仕組みを構築できます。
次のステップ
このセクションでは、AWS CodeDeployのデプロイ履歴を取得し、失敗したデプロイを自動的に検出する方法を紹介しました。次のセクションでは、実際に ロールバックを自動的に実行するPowerShellスクリプトの作成方法 について解説します。
自動ロールバックスクリプトの作成と実行
デプロイメントが失敗した場合に、前回の正常なバージョンに自動的にロールバックするPowerShellスクリプトを作成します。このスクリプトでは、最新の失敗したデプロイメントを検出し、その前の成功したデプロイメントを特定してロールバックを実行します。
ロールバックの基本戦略
AWS CodeDeployにおけるロールバックは、以前の成功したデプロイメントIDを特定し、それを再デプロイすることで実現できます。
ロールバック手順
- 最新のデプロイメントIDを取得
- デプロイメントのステータスを確認
- 失敗した場合、直近の成功したデプロイメントを検索
- 成功したデプロイメントを再実行してロールバック
ロールバックを実行するPowerShellスクリプト
以下のスクリプトは、自動的にデプロイメント履歴を調査し、失敗した場合に直前の成功したデプロイメントを実行してロールバックします。
# 変数の設定
$ApplicationName = "MyApp"
$DeploymentGroupName = "MyDeploymentGroup"
$Region = "ap-northeast-1"
# 過去のデプロイメントIDを取得(最新5件)
$DeploymentIds = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[:5]" --output json | ConvertFrom-Json
$LatestDeploymentId = $DeploymentIds[0] # 最新のデプロイメントID
$RollbackDeploymentId = $null # ロールバック先のデプロイメントID
Write-Host "最新のデプロイメント: $LatestDeploymentId"
# 最新のデプロイメントのステータスを取得
$LatestDeploymentStatus = aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region --query "deploymentInfo.status" --output text
if ($LatestDeploymentStatus -eq "Failed") {
Write-Host "❌ 最新のデプロイメント ($LatestDeploymentId) は失敗しました。ロールバックを開始します。"
# 直前の成功したデプロイメントを探す
foreach ($DeploymentId in $DeploymentIds) {
$Status = aws deploy get-deployment --deployment-id $DeploymentId --region $Region --query "deploymentInfo.status" --output text
if ($Status -eq "Succeeded") {
$RollbackDeploymentId = $DeploymentId
break
}
}
if ($RollbackDeploymentId -ne $null) {
Write-Host "✅ ロールバック先のデプロイメントID: $RollbackDeploymentId"
# 過去の成功したデプロイメントを再デプロイ
aws deploy create-deployment --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --revision revisionType=S3,s3Location={bucket="my-bucket",key="my-app/$RollbackDeploymentId.zip",bundleType="zip"} --region $Region
Write-Host "🔄 ロールバックを実行しました。"
} else {
Write-Host "⚠️ 過去の成功したデプロイメントが見つかりませんでした。"
}
} else {
Write-Host "✅ 最新のデプロイメント ($LatestDeploymentId) は正常に完了しました。ロールバック不要です。"
}
スクリプトの動作説明
- 最新5件のデプロイメントIDを取得
- 最新のデプロイメントのステータスを確認
Failed
の場合、ロールバックを実行
- 直前の成功したデプロイメントを検索
Succeeded
の状態のデプロイメントを特定
- 成功したデプロイメントを再デプロイ
aws deploy create-deployment
を実行して、過去の成功バージョンを再デプロイ
スクリプトの自動実行
このスクリプトを定期的に実行することで、自動的にデプロイの状態を監視し、失敗時にロールバックを実施できます。
タスクスケジューラを使った自動実行
Windowsのタスクスケジューラを使用して、スクリプトを定期実行する手順:
- タスクスケジューラを開く(
taskschd.msc
を実行) - 新しいタスクの作成
- 名前を「AWS CodeDeployロールバック」と設定
- トリガーの設定
- 「タスクの開始」→「スケジュールされた時刻」または「毎時」
- 実行間隔を5分~15分程度に設定
- アクションの設定
- 「プログラムの開始」→
powershell.exe
- 引数として
-File "C:\Scripts\AutoRollback.ps1"
を指定
- タスクを保存して有効化
実行時の注意点
aws deploy create-deployment
のrevision
パラメータは、アプリケーションのリリース方法に応じて適切に設定してください。- S3に保存された過去のバージョンを使用する場合、
s3Location
を適切に指定する必要があります。 - IAMの権限設定で、スクリプトが
AWSCodeDeployFullAccess
を持つユーザーとして実行されていることを確認してください。
次のステップ
このセクションでは、PowerShellスクリプトを活用して、失敗したデプロイメントを自動検出し、正常なバージョンにロールバックする方法 を解説しました。次のステップでは、ロールバック後の動作確認とログ取得 について解説します。
ロールバック後の動作確認とログ取得
ロールバックが完了した後は、正常に適用されたかどうかを確認することが重要です。本セクションでは、PowerShellを使用したロールバック後の動作確認と、AWS CodeDeployのログを取得する方法について解説します。
デプロイメントのステータス確認
ロールバックが成功したかどうかを判断するには、ロールバックで実行されたデプロイメントのステータスを確認します。
以下のPowerShellスクリプトを実行すると、最新のデプロイメントのステータスを取得できます。
# 変数の設定
$ApplicationName = "MyApp"
$DeploymentGroupName = "MyDeploymentGroup"
$Region = "ap-northeast-1"
# 最新のデプロイメントIDを取得
$LatestDeploymentId = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[0]" --output text
# デプロイメントのステータスを取得
$DeploymentStatus = aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region --query "deploymentInfo.status" --output text
Write-Host "最新のデプロイメント ($LatestDeploymentId) のステータス: $DeploymentStatus"
if ($DeploymentStatus -eq "Succeeded") {
Write-Host "✅ ロールバックが正常に完了しました。"
} else {
Write-Host "❌ ロールバックが正常に完了しませんでした。詳細を確認してください。"
}
デプロイメントの詳細ログを取得
ロールバックが失敗した場合や、デプロイの詳細を確認したい場合は、AWS CodeDeployのログを取得して分析します。
以下のコマンドで、最新のデプロイメントの詳細情報を確認できます。
aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region
このコマンドを実行すると、デプロイの開始時間、完了時間、エラー発生時の情報が表示されます。
また、デプロイのログはデプロイ先のインスタンス内に保存されるため、EC2インスタンスにログインして以下のパスを確認できます。
/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent.log
PowerShellを使用してリモートでログを取得するには、以下の方法が有効です。
# EC2インスタンスに接続してログを取得
$InstanceId = "i-0abcd1234ef56789"
$LogFilePath = "/opt/codedeploy-agent/deployment-root/deployment-logs/codedeploy-agent.log"
aws ssm send-command --document-name "AWS-RunShellScript" --targets "Key=instanceIds,Values=$InstanceId" --parameters "commands=[cat $LogFilePath]" --region $Region
これにより、EC2インスタンス上のCodeDeployログを取得し、デプロイの詳細情報を確認できます。
ロールバック後のアプリケーション動作確認
ロールバック後、アプリケーションが正常に稼働しているか確認するために、いくつかの方法を紹介します。
1. アプリケーションのヘルスチェック
ロールバック後のアプリケーションが適切に動作しているか、ヘルスチェックを実施します。
ヘルスチェック用のURLをPowerShellで監視
$AppUrl = "http://myapp.example.com/health"
$response = Invoke-WebRequest -Uri $AppUrl -Method Get -UseBasicParsing
if ($response.StatusCode -eq 200) {
Write-Host "✅ アプリケーションは正常に動作しています。"
} else {
Write-Host "❌ アプリケーションが異常です。Status Code: $($response.StatusCode)"
}
2. ロールバック後のバージョン確認
アプリケーションのバージョンを確認し、ロールバック前後で正しく適用されているかを検証します。
Invoke-WebRequest -Uri "http://myapp.example.com/version" -Method Get -UseBasicParsing
このエンドポイントで、想定通りのバージョンが返ってくることを確認します。
3. EC2インスタンス上でプロセス確認
ロールバック後に、必要なプロセスが正しく動作しているかを確認します。
aws ssm send-command --document-name "AWS-RunShellScript" --targets "Key=instanceIds,Values=$InstanceId" --parameters "commands=[ps aux | grep myapp]" --region $Region
これにより、アプリケーションのプロセスが稼働しているかどうかをチェックできます。
ロールバックの成功と失敗の記録
ロールバックの成否をログとして記録することで、トラブルシューティングや監査に役立てることができます。
ローカルログファイルに記録
$LogFile = "C:\Logs\codedeploy-rollback.log"
$LogMessage = "$(Get-Date) - Deployment ID: $LatestDeploymentId - Status: $DeploymentStatus"
Add-Content -Path $LogFile -Value $LogMessage
Write-Host "📝 ロールバックの結果をログに記録しました。"
CloudWatch Logs に記録
AWS CloudWatch Logs にロールバックの成否を記録する場合は、以下のコマンドを使用します。
aws logs create-log-group --log-group-name "/codedeploy/rollback-logs"
aws logs create-log-stream --log-group-name "/codedeploy/rollback-logs" --log-stream-name "rollback-events"
$LogMessage = "{""timestamp"": $(Get-Date -UFormat %s), ""message"": ""Deployment ID: $LatestDeploymentId - Status: $DeploymentStatus""}"
aws logs put-log-events --log-group-name "/codedeploy/rollback-logs" --log-stream-name "rollback-events" --log-events "timestamp=$(Get-Date -UFormat %s),message=$LogMessage"
CloudWatch Logs に記録することで、AWSコンソールからロールバックの履歴を確認できます。
次のステップ
本セクションでは、ロールバック後の動作確認方法とデプロイメントのログ取得方法について解説しました。次のステップでは、ロールバックの自動監視とスケジュール実行の方法を紹介します。
スクリプトの定期実行と監視の自動化
ロールバックの自動化をより効果的にするためには、PowerShellスクリプトを定期的に実行し、CodeDeployのデプロイメントを継続的に監視する仕組みを構築することが重要です。本セクションでは、Windowsタスクスケジューラによる定期実行、AWS LambdaとCloudWatchを活用した自動監視の2つの方法を解説します。
方法1: Windowsタスクスケジューラを使用した定期実行
PowerShellスクリプトを Windowsタスクスケジューラ を使用して定期的に実行することで、デプロイの失敗を監視し、自動ロールバックを実行できます。
タスクスケジューラの設定手順
- タスクスケジューラを開く(Windowsキー +
taskschd.msc
) - 「基本タスクの作成」を選択
- 名前を「AWS CodeDeploy監視」と設定
- 「トリガー」タブで実行頻度を設定
- 「毎5分」または「毎15分」など、適切な間隔を指定
- 「アクション」タブでPowerShellスクリプトを指定
- 「プログラム/スクリプト」:
powershell.exe
- 「引数の追加」:
-File "C:\Scripts\MonitorCodeDeploy.ps1"
- タスクを有効化し、保存
定期実行用のPowerShellスクリプト
このスクリプトを C:\Scripts\MonitorCodeDeploy.ps1
として保存し、タスクスケジューラで実行します。
# CodeDeployのデプロイ監視スクリプト
$ApplicationName = "MyApp"
$DeploymentGroupName = "MyDeploymentGroup"
$Region = "ap-northeast-1"
# 最新のデプロイメントIDを取得
$LatestDeploymentId = aws deploy list-deployments --application-name $ApplicationName --deployment-group-name $DeploymentGroupName --region $Region --query "deployments[0]" --output text
# デプロイメントのステータスを取得
$DeploymentStatus = aws deploy get-deployment --deployment-id $LatestDeploymentId --region $Region --query "deploymentInfo.status" --output text
# 失敗を検知してロールバック実行
if ($DeploymentStatus -eq "Failed") {
Write-Host "❌ デプロイメント ($LatestDeploymentId) が失敗しました。ロールバックを実行します。"
Start-Process -FilePath "powershell.exe" -ArgumentList "-File C:\Scripts\AutoRollback.ps1"
} else {
Write-Host "✅ デプロイメントは正常です。"
}
方法2: AWS Lambda と CloudWatch を使用した監視の自動化
AWS環境内でロールバックを自動化する場合、AWS Lambda と Amazon CloudWatch Events を活用してデプロイの監視とロールバックを実行できます。
CloudWatchルールの設定
AWS CodeDeployのデプロイステータスを監視するために、CloudWatchルールを作成します。
- AWS マネジメントコンソール → CloudWatch → ルールの作成
- イベントソースを設定
- イベントパターンを以下のように設定(CodeDeployのデプロイ失敗イベントを監視)
{
"source": ["aws.codedeploy"],
"detail-type": ["CodeDeploy Deployment State-change Notification"],
"detail": {
"state": ["FAILED"]
}
}
- ターゲットにAWS Lambdaを指定
- 「新しいLambda関数を作成」を選択
AWS Lambda関数の作成
AWS Lambdaを使用して、CodeDeployの失敗を検出し、自動でロールバックを実行する関数を作成します。
Lambda関数のPythonスクリプト(boto3使用)
以下のスクリプトをAWS Lambdaにデプロイし、CodeDeployの失敗を検知すると自動的にロールバックを実行します。
import boto3
import json
APPLICATION_NAME = "MyApp"
DEPLOYMENT_GROUP_NAME = "MyDeploymentGroup"
REGION = "ap-northeast-1"
def get_latest_failed_deployment():
client = boto3.client('codedeploy', region_name=REGION)
deployments = client.list_deployments(applicationName=APPLICATION_NAME, deploymentGroupName=DEPLOYMENT_GROUP_NAME)
for deployment_id in deployments['deployments']:
deployment = client.get_deployment(deploymentId=deployment_id)
if deployment['deploymentInfo']['status'] == 'Failed':
return deployment_id
return None
def get_last_successful_deployment():
client = boto3.client('codedeploy', region_name=REGION)
deployments = client.list_deployments(applicationName=APPLICATION_NAME, deploymentGroupName=DEPLOYMENT_GROUP_NAME)
for deployment_id in deployments['deployments']:
deployment = client.get_deployment(deploymentId=deployment_id)
if deployment['deploymentInfo']['status'] == 'Succeeded':
return deployment_id
return None
def rollback():
failed_deployment_id = get_latest_failed_deployment()
if failed_deployment_id:
print(f"❌ 失敗したデプロイメント {failed_deployment_id} を検出")
successful_deployment_id = get_last_successful_deployment()
if successful_deployment_id:
print(f"✅ ロールバック先のデプロイメント {successful_deployment_id} を適用")
client = boto3.client('codedeploy', region_name=REGION)
client.create_deployment(
applicationName=APPLICATION_NAME,
deploymentGroupName=DEPLOYMENT_GROUP_NAME,
revision={
'revisionType': 'S3',
's3Location': {
'bucket': 'my-bucket',
'key': f'my-app/{successful_deployment_id}.zip',
'bundleType': 'zip'
}
}
)
else:
print("⚠️ 過去の成功したデプロイメントが見つかりません")
else:
print("✅ 失敗したデプロイメントはありません")
def lambda_handler(event, context):
rollback()
return {
'statusCode': 200,
'body': json.dumps('Rollback executed')
}
監視の自動化の選択肢
方法 | メリット | デメリット |
---|---|---|
Windowsタスクスケジューラ | 簡単に設定できる | ローカル環境に依存 |
AWS Lambda + CloudWatch | AWS環境内で自動化可能、スケーラブル | 設定がやや複雑 |
次のステップ
本セクションでは、PowerShellスクリプトの定期実行と、AWS環境での監視の自動化 について解説しました。次のステップでは、実践的な応用例とトラブルシューティング について紹介します。
実践的な応用例とトラブルシューティング
AWS CodeDeployのロールバックを自動化することで、リリースの信頼性を向上させることができますが、実運用ではさまざまな問題が発生する可能性があります。本セクションでは、ロールバックの応用例と、よくある問題とその解決策(トラブルシューティング)を紹介します。
1. 実践的な応用例
① Blue/Green デプロイメントのロールバック
AWS CodeDeployには Blue/Greenデプロイメント の仕組みがあり、ロールバック時にトラフィックの切り戻しを即座に行うことができます。
この方法を活用することで、ユーザー影響を最小限に抑えたロールバックが可能になります。
Blue/Greenデプロイメントでのロールバックの手順
- デプロイ失敗時にトラフィックを旧環境(Blue)に戻す
- 旧バージョンのデプロイメントを再適用
- 新しい環境(Green)で問題修正後、再デプロイ
PowerShellで トラフィックの切り戻し を行う場合、以下のコマンドを実行します。
aws deploy stop-deployment --deployment-id <デプロイメントID> --region ap-northeast-1
② Slack通知を組み合わせた自動アラート
ロールバックの発生を Slackに通知 することで、リアルタイムでの監視が可能になります。
PowerShellスクリプトでSlack通知を送る方法
$SlackWebhookUrl = "https://hooks.slack.com/services/XXXXX/YYYYY/ZZZZZ"
$Message = "❌ CodeDeployのデプロイメントが失敗しました!自動ロールバックを実行しました。"
$Body = @{
text = $Message
} | ConvertTo-Json
Invoke-RestMethod -Uri $SlackWebhookUrl -Method Post -ContentType "application/json" -Body $Body
このスクリプトをロールバックスクリプトと組み合わせることで、ロールバックが実行された際に即座に通知を受け取ることができます。
2. トラブルシューティング(よくある問題と解決策)
① ロールバックスクリプトが失敗する
✅ 確認ポイント
- スクリプトの権限(IAMロール)が正しく設定されているか
- AWS CLIが最新バージョンに更新されているか
aws deploy create-deployment
のrevision
の指定が適切か
✅ 対処法
- IAMポリシーを確認し、
AWSCodeDeployFullAccess
を付与 aws --version
でAWS CLIのバージョンをチェックし、最新に更新aws deploy get-deployment
でリビジョン情報を確認し、存在するS3パスを指定
② ロールバック後もアプリケーションが動作しない
✅ 確認ポイント
- ロールバック前後で 環境変数 や 設定ファイル が変わっていないか
- アプリケーションの依存パッケージが正しく適用されているか
✅ 対処法
- 環境変数を確認し、
aws ssm get-parameter
を使って正しい値を適用する aws ssm send-command
を使用して、インスタンス上でリスタートコマンドを実行
aws ssm send-command --document-name "AWS-RunShellScript" --targets "Key=instanceIds,Values=<InstanceId>" --parameters "commands=[systemctl restart myapp]"
③ CloudWatch Logs にログが出力されない
✅ 確認ポイント
aws logs put-log-events
の権限 (CloudWatchLogsFullAccess
) が付与されているかaws logs describe-log-groups
を実行し、正しいロググループが存在するか確認
✅ 対処法
aws logs describe-log-groups --region ap-northeast-1
ロググループがない場合、以下のコマンドで作成。
aws logs create-log-group --log-group-name "/codedeploy/rollback-logs"
3. ロールバック戦略の最適化
① デプロイの事前チェックを強化
デプロイ前にエラーを事前検出できれば、ロールバックの必要性を減らせます。
デプロイ前にヘルスチェックを実施 し、失敗する可能性が高い場合はデプロイを中止する戦略が有効です。
$HealthCheck = Invoke-WebRequest -Uri "http://myapp.example.com/health" -Method Get -UseBasicParsing
if ($HealthCheck.StatusCode -ne 200) {
Write-Host "⚠️ ヘルスチェック失敗!デプロイを中止します。"
Exit 1
} else {
Write-Host "✅ ヘルスチェック成功!デプロイを続行します。"
}
② カナリアデプロイを採用
ロールバックの発生を最小限にするために、段階的にデプロイするカナリアデプロイ を導入することも効果的です。
AWS CodeDeployでは Deployment Configuration
を変更することで、一部のインスタンスのみ新バージョンを適用し、問題がなければ全体にデプロイ することが可能です。
カナリアデプロイの設定例
aws deploy create-deployment --application-name MyApp --deployment-group-name MyDeploymentGroup --deployment-config-name CodeDeployDefault.OneAtATime
CodeDeployDefault.OneAtATime
→ 1台ずつデプロイCodeDeployDefault.HalfAtATime
→ インスタンスの半数ずつデプロイCodeDeployDefault.AllAtOnce
→ すべてのインスタンスに一括デプロイ(デフォルト)
次のステップ
本セクションでは、実践的な応用例とトラブルシューティングの方法について解説しました。次のセクションでは、本記事のまとめとして、PowerShellを使用したAWS CodeDeployロールバックの自動化の利点と最終的なポイントを整理します。
まとめ
本記事では、PowerShellを活用してAWS CodeDeployのロールバックを自動化する方法について解説しました。デプロイの失敗時に迅速に復旧できる仕組みを構築することで、運用の負担を軽減し、システムの可用性を向上させることができます。
この記事で学んだポイント
- AWS CodeDeployの基本概念とロールバックの重要性
- CodeDeployの仕組みと、デプロイ失敗時の影響を最小限に抑えるロールバックの必要性を理解
- PowerShellを用いたAWS CLIのセットアップ
- AWS CLIのインストールと認証設定を行い、PowerShellからCodeDeployを操作できる環境を整備
- デプロイメント履歴の取得と失敗の自動検出
aws deploy list-deployments
を使用して過去のデプロイ履歴を取得し、失敗したデプロイメントを特定
- 自動ロールバックスクリプトの作成
- 失敗を検出した場合に、直近の成功したデプロイメントを適用するPowerShellスクリプトを実装
- ロールバック後の動作確認とログ取得
- ロールバックが適用されたかどうかを
aws deploy get-deployment
で確認し、ヘルスチェックやCloudWatch Logsを活用
- スクリプトの定期実行と監視の自動化
- Windowsタスクスケジューラ、AWS Lambda、CloudWatchを活用してデプロイ監視とロールバックの自動実行を実現
- 実践的な応用例とトラブルシューティング
- Blue/Greenデプロイメント、Slack通知の統合、カナリアデプロイの活用、よくある問題の解決策を紹介
PowerShellを活用したAWS CodeDeployロールバックのメリット
✅ デプロイ失敗時の迅速な復旧
- 手動対応を減らし、障害発生時のダウンタイムを最小限に抑える
✅ 一貫した運用フローの確立
- 自動ロールバックにより、ミスの少ない安定したリリース管理が可能に
✅ 柔軟な監視と通知の仕組み
- CloudWatch、Slack、Lambdaなどと連携し、異常検知から対応までを自動化
次のステップ
今後、より高度なロールバック機能を導入するためには、以下の取り組みが有効です。
- Blue/Greenデプロイの導入 → ロールバック時にトラフィックを瞬時に切り替え
- デプロイ前のヘルスチェック強化 → 失敗を事前に防ぐ
- CI/CDパイプラインの統合 → GitHub Actions や AWS CodePipeline との連携を検討
PowerShellとAWS CodeDeployを活用し、より信頼性の高いデプロイ環境を構築しましょう!
コメント