目次
AWS CodeDeploy 完全ガイド v2.0 (2026 年最新対応)
EC2・ECS・Lambda へのゼロダウンタイム安全デプロイメント実装
概要
AWS CodeDeploy は 「EC2・ECS・Lambda・オンプレミスへのアプリケーションデプロイを自動化し、ローリングアップデート・Blue/Green・カナリアなどの段階的デプロイ戦略で安全なリリースを実現するサービス」 です。appspec.yml で デプロイ手順を定義し、CloudWatch アラーム連携で失敗時の自動ロールバック、ヘルスチェック失敗時の自動停止など、本番障害リスクを最小化します。
2025-2026 の進化:
- Lambda カナリアデプロイの精度向上:リアルタイム metric validation
- ECS Blue/Green with CloudFormation:Stack update ベースのデプロイ統合
- All-at-once から Canary への自動判定:AI による最適戦略推奨(試験中)
- Cross-account・Cross-region デプロイ:エンタープライズ対応
1. 課題と特徴
CodeDeploy が解決する課題
❌ 課題:本番デプロイの手動実行・テストのリスク
→ 100 台 EC2 に SSH で手動デプロイ → ある台だけ失敗 → ロールバック困難
→ Blue/Green 環境に手動で code 配置 → DNS 切替を手作業 → タイミングズレ
→ Lambda version 切替を手作業 → エラーレート上昇に気づかず → 障害継続
✅ 解決:CodeDeploy で完全自動化・一貫した戦略
→ Deployment Group に EC2 タグ指定 → CodeDeploy が自動配置
→ Blue/Green で ALB トラフィック自動切替 → テスト後に 100% 切替
→ Lambda traffic shift を段階的に → CloudWatch alarm 連携で自動ロールバック
→ appspec.yml で version control → 監査ログ・再現可能性
コアの特徴
| 特徴 | 説明 |
|---|---|
| マルチプラットフォーム | EC2・ECS・Lambda・オンプレミス対応 |
| デプロイ戦略 | In-place(ローリング)・Blue/Green・カナリア |
| appspec.yml | YAML でライフサイクルフック定義・バージョン管理可能 |
| 自動ロールバック | 失敗・CloudWatch alarm で自動復旧 |
| ヘルスチェック | 各インスタンスの稼働状況確認・失敗時 stop |
| トラフィック制御 | ALB 連携で負荷分散・段階的切替 |
| カナリアデプロイ | Lambda:10% → 100%・ECS:canary/linear/all-at-once |
| Log/Monitor 統合 | CloudWatch・CloudTrail・EventBridge 統合 |
| クロスアカウント | 別 AWS account へのデプロイ対応 |
2. アーキテクチャ(Mermaid 図 1)
graph TD
A["CodePipeline / Manual Trigger"] -->|Deployment| B["CodeDeploy<br/>Application & Group"]
B --> C{"Compute<br/>Platform"}
C -->|EC2/On-Prem| D["In-Place Deployment"]
D -->|appspec.yml hooks| E1["ApplicationStop<br/>Stop current app"]
E1 -->|DownloadBundle| E2["Download artifact<br/>from S3/GitHub"]
E2 -->|BeforeInstall| E3["Pre-install script"]
E3 -->|Install| E4["Copy files"]
E4 -->|AfterInstall| E5["Post-install script"]
E5 -->|ApplicationStart| E6["Start new app"]
E6 -->|ValidateService| E7["Health check<br/>Success? → Continue : Rollback"]
C -->|EC2 + ALB| D2["Blue/Green Deployment"]
D2 -->|Create| G1["Green Env<br/>New instances"]
G1 -->|Deploy| G2["appspec.yml<br/>on Green"]
G2 -->|Test| G3["Post-test validation"]
G3 -->|Traffic Shift| G4["ALB reroute<br/>Blue → Green"]
G4 -->|Wait time| G5["Optional verification"]
G5 -->|Terminate| G6["Blue instances<br/>terminated"]
C -->|Lambda| L1["Traffic Shift"]
L1 -->|Canary| L2["10% traffic<br/>5 minutes"]
L2 -->|Validate| L3["Post-traffic hook<br/>Pass? → 100% : Rollback"]
L3 -->|Linear| L4["10% every<br/>1 minute"]
L4 -->|or All-at-once| L5["100% immediate"]
C -->|ECS| E1["Blue/Green<br/>Task Set"]
E1 -->|Create| E2["New task set<br/>Green version"]
E2 -->|Test Port| E3["Health check<br/>on test listener"]
E3 -->|Shift Traffic| E4["ALB listener<br/>reroute"]
E4 -->|Terminate| E5["Original task set<br/>terminated"]
H["CloudWatch Alarms"] -->|Error rate > 5%| I["Auto Rollback"]
style B fill:#fff3cd
style E7 fill:#f8d7da
style G4 fill:#d1ecf1
style L3 fill:#f8d7da
style I fill:#f8d7da
3. コアコンポーネント
3.1 アプリケーション・デプロイメントグループ
# Application(上層概念)
MyApplication:
ComputePlatform: EC2_ON_PREMISES # EC2, LAMBDA, ECS から選択
Description: "Production application"
# Deployment Group(デプロイ対象・戦略)
ProdDeploymentGroup:
ApplicationName: MyApplication
DeploymentGroupName: prod-group
ServiceRoleArn: arn:aws:iam::123456789012:role/CodeDeployRole
# EC2 対象指定(タグベース)
Ec2TagFilters:
- Key: Environment
Value: production
Type: KEY_AND_VALUE
- Key: Service
Value: api-server
Type: KEY_AND_VALUE
# Auto Scaling Group 指定
AutoScalingGroups:
- prod-asg
# デプロイ戦略
DeploymentConfigName: CodeDeployDefault.OneAtATime # 1 台ずつ
# ロードバランサー設定
LoadBalancerInfo:
TargetGroupInfoList:
- Name: prod-target-group
# 自動ロールバック設定
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE
- DEPLOYMENT_STOP_ON_ALARM
# CloudWatch アラーム連携
AlarmConfiguration:
Enabled: true
Alarms:
- Name: prod-error-rate-alarm
# トリガー設定
TriggerConfigurations:
- TriggerEvents:
- DeploymentSuccess
- DeploymentFailure
TriggerTargetArn: arn:aws:sns:us-east-1:123456789012:deploy-notifications
3.2 appspec.yml(デプロイ仕様)
EC2/On-Premises
# appspec.yml - EC2/On-Prem deployment
version: 0.0
# OS タイプ
os: linux # または windows
# デプロイするファイル
files:
- source: /build/dist/
destination: /var/www/html/
- source: /config/
destination: /etc/myapp/
# ファイルパーミッション・所有者
permissions:
- object: /var/www/html/
pattern: "**"
owner: nginx
group: nginx
type:
- directory
- object: /var/www/html/
pattern: "**"
mode: 644
type:
- file
# ライフサイクルフック(順序重要)
hooks:
# 1. アプリ停止
ApplicationStop:
- location: scripts/stop_app.sh
timeout: 60
runas: root
# 2. ダウンロード(自動)
# DownloadBundle: (自動実行・スキップ不可)
# 3. インストール前処理
BeforeInstall:
- location: scripts/install_dependencies.sh
timeout: 300
runas: root
# 4. ファイルコピー(自動)
# Install: (自動実行・スキップ不可)
# 5. インストール後処理
AfterInstall:
- location: scripts/configure_app.sh
timeout: 300
runas: root
- location: scripts/run_db_migration.sh
timeout: 600
runas: deploy
# 6. アプリ起動
ApplicationStart:
- location: scripts/start_app.sh
timeout: 60
runas: root
# 7. サービス検証(重要:失敗 → ロールバック)
ValidateService:
- location: scripts/health_check.sh
timeout: 180
runas: root
# 環境変数(hook スクリプト内で利用可能)
Resources:
- TargetInstances:
TagFilters:
- Key: Service
Value: api
# Lifecycle event failure behavior
LifecycleEventHookExecutionLocation: CodeDeploy_Console
# 検証レポート(オプション)
Version: 0.0
Lambda
# appspec.yml - Lambda deployment
version: 0.0
# Lambda function 定義
Resources:
- MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Name: !Ref FunctionName
Alias: live
CurrentVersion: !Ref CurrentVersion
TargetVersion: !Ref NewVersion
# トラフィックシフト
Hooks:
# Pre-traffic validation
BeforeAllowTraffic:
- location: scripts/pre_traffic_hook.js
# Post-traffic validation
AfterAllowTraffic:
- location: scripts/post_traffic_hook.js
ECS
# appspec.yml - ECS deployment (Blue/Green)
version: 0.0
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "arn:aws:ecs:region:account:task-definition/my-task:1"
LoadBalancerInfo:
ContainerName: my-container
ContainerPort: 8080
PlatformVersion: LATEST
NetworkConfiguration:
AwsvpcConfiguration:
Subnets:
- subnet-12345678
SecurityGroups:
- sg-12345678
Hooks:
BeforeAllowTraffic:
- location: scripts/ecs_pre_traffic_hook.js
AfterAllowTraffic:
- location: scripts/ecs_post_traffic_hook.js
3.3 デプロイ設定(速度・最小健全性)
# デプロイ設定例(EC2)
# 1. AllAtOnce(即座・リスク高)
CodeDeployDefault.AllAtOnce:
Description: "Deploy to all instances simultaneously"
MinimumHealthyHosts: 0 # 0 台が最小
# 2. HalfAtATime(50% ずつ)
CodeDeployDefault.HalfAtATime:
MinimumHealthyHosts: 50%
# 3. OneAtATime(1 台ずつ・最も安全)
CodeDeployDefault.OneAtATime:
MinimumHealthyHosts: 1 台
# カスタム設定
CustomDeployment:
MinimumHealthyHosts:
Type: FLEET_PERCENT
Value: 75 # 最小 75% は稼働必須(25% まで deployment 可能)
# Lambda デプロイ設定
Lambda:
Canary10Percent5Minutes:
# 最初の 5 分:10% traffic shift
# その後:90% を一括 shift
TrafficRoutingConfig:
Type: Canary
TimeIntervalInMinutes: 5
CanarySettings:
Interval: 5
Percent: 10
Linear10PercentEvery1Minute:
# 1 分ごとに 10% ずつ shift
# 全 10 分で 100%
TrafficRoutingConfig:
Type: Linear
TimeIntervalInMinutes: 1
LinearSettings:
Percent: 10
AllAtOnce:
# 即座に 100% 切替(ロールバック手動)
TrafficRoutingConfig:
Type: AllAtOnce
3.4 デプロイストラテジー比較
# In-place(EC2/On-Premises のみ)
Strategy: InPlace
Flow:
1. 現在のインスタンス上で appspec.yml 実行
2. ローリング方式で 1 台ずつ更新
3. 最小健全ホスト数を維持
Risk: 高(インスタンス数少ないと一時ダウン)
RollBack: 前バージョンを再デプロイ(時間かかる)
Cost: 同じインスタンス使用・コスト増なし
Example:
- 10 台 EC2、HalfAtATime → 5 台停止・5 台稼働・5 台更新 を繰り返し
# Blue/Green(EC2・ECS・Lambda)
Strategy: BlueGreen
Flow:
1. Green(新)環境を新規作成
2. 新バージョンを Green に deploy
3. テスト・ヘルスチェック
4. ALB/トラフィック切替 Green へ
5. Blue(旧)環境を削除(or 保持)
Risk: 低(新環境で十分検証してから切替)
RollBack: ALB を Blue に即座に戻す(秒単位)
Cost: 一時的に 2 倍(Blue + Green)。削除後ゼロ
Example:
- ALB → Blue(10 台、旧版) → Green(10 台、新版)→ 全 ALB → Green
# Canary(Lambda・ECS Blue/Green)
Strategy: ProgressiveTraffic
Flow:
1. 新バージョンに 10% トラフィック
2. 5 分観察(metrics 監視)
3. 問題なければ → 100% に shift
4. CloudWatch alarm なら自動ロールバック
Risk: 最低(段階的・metric ベース)
RollBack: トラフィック即座にロールバック
Cost: 一時的に分散(Blue 90% + Green 10%)
Example:
- Lambda:version 1(90%)→ version 2(10%)→ OK → version 2(100%)
- ECS:task set A(90%)→ task set B(10%)→ OK → task set B(100%)
4. 主要ユースケース(12+)
4.1 EC2 ローリングデプロイ(ゼロダウンタイム)
# 100 台 EC2 ASG で段階的更新
Deployment:
Strategy: InPlace
DeploymentConfigName: CodeDeployDefault.HalfAtATime
Flow:
- 50 台を停止・新版デプロイ・起動
- 50 台を停止・新版デプロイ・起動
Time: 約 30 分(台あたり 15 分)
Availability: 常に 50% 以上稼働
Rollback: 手動でコマンド実行(3 分)
4.2 ECS Blue/Green デプロイ(ALB トラフィック切替)
Blue 環境(本番):
ECS Cluster "prod" → Task Set A(10 台)→ ALB Target Group A
Green 環境(新版):
ECS Cluster "prod" → Task Set B(10 台)→ ALB Target Group B
CodeDeploy Flow:
1. Task Set B 作成・新 Docker image pull
2. ヘルスチェック → OK
3. ALB listener rule 変更:A → B にトラフィック切替
4. 1 分 観察
5. Task Set A 削除
Time: 約 3 分(ALB 切替即座)
Rollback: ALB listener → A に戻す(秒単位)
4.3 Lambda カナリアリリース
Version 1(本番):100% トラフィック
Version 2(新):0%
CodeDeploy Traffic Shift:
Canary10Percent5Minutes:
- 0 分:V2 に 10% shift
- CloudWatch metric 監視(error rate・latency・throttle)
- 5 分 OK → 90% を一括 shift → V2 100%
- NG → 自動ロールバック V1 100%
Cost: 一時的に 2 バージョン課金(5 分)
Rollback: 自動(metric ベース)
4.4 マルチリージョン Blue/Green
Deployment Group per Region:
- us-east-1: prod-group-1
- eu-west-1: prod-group-2
- ap-northeast-1: prod-group-3
Sequential Deploy:
1. us-east-1 Blue/Green → OK
2. eu-west-1 Blue/Green → OK
3. ap-northeast-1 Blue/Green → OK
全リージョン同時新版:約 10 分
4.5 DB マイグレーション付きデプロイ
appspec.yml:
hooks:
BeforeInstall:
- location: scripts/backup_db.sh
AfterInstall:
- location: scripts/run_migration.sh
timeout: 600
ValidateService:
- location: scripts/test_db.sh
4.6 カスタムスクリプトでの段階的検証
appspec.yml:
hooks:
ValidateService:
- location: scripts/smoke_test.sh # 単純な HTTP GET
- location: scripts/integration_test.sh # データベース検証
- location: scripts/load_test.sh # 性能確認
# すべてが成功して初めてデプロイ確定
4.7 自動ロールバック(CloudWatch アラーム連携)
DeploymentGroup:
AlarmConfiguration:
Enabled: true
Alarms:
- Name: ApplicationErrorRate
Threshold: 5% # エラー率 5% 超過
- Name: ApplicationLatency
Threshold: 1000ms # レイテンシー 1 秒超過
- Name: TargetHealthCheck
Threshold: 90% # ヘルスチェック失敗率 10% 超過
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE
- DEPLOYMENT_STOP_ON_ALARM
Flow:
- Deploy 完了 → alarm monitor 開始(15 分)
- error rate 5% → alarm 発火 → CodeDeploy 自動ロールバック
- Blue(旧版)に自動復帰
4.8 段階的カナリアデプロイ with Post-Traffic Validation
# Lambda appspec.yml
Hooks:
BeforeAllowTraffic:
- location: lambda_pre_traffic_hook # 実行前テスト
# 新版の環境変数・依存関係確認
AfterAllowTraffic:
- location: lambda_post_traffic_hook # 実行後テスト
# 新版が実際のトラフィック処理・エラーなし確認
Traffic Shift: Canary10Percent5Minutes
- 0-5 min:V2 に 10% traffic
- Post-traffic hook 実行 → OK
- 5-10 min:V2 に 100% traffic
4.9 オンプレミスサーバーへのデプロイ
# On-Premises host にAgent インストール
sudo yum install ruby wget -y
cd /home/ec2-user
wget https://aws-codedeploy-${AWS_REGION}.s3.${AWS_REGION}.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
# 同一 Deployment Group で EC2 + On-Prem 混在可能
Deployment:
Ec2TagFilters: [Environment=prod]
OnPremises: [host-tag-filter: Environment=prod]
4.10 Cross-Account デプロイ
# Account A(Pipeline account)から Account B へ Deploy
Deployment:
ServiceRoleArn: arn:aws:iam::ACCOUNT_A:role/CodeDeployRole
# role がAccount B のリソースを AssumeRole 可能
Account B IAM Trust Policy:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_A:role/CodeDeployRole"
},
"Action": "sts:AssumeRole"
}
4.11 容器ベースのカナリアデプロイ(ECS)
# ECS Blue/Green with Canary
DeploymentGroup:
DeploymentStyle:
DeploymentType: BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL
LoadBalancerInfo:
TargetGroupInfoList:
- Name: prod-tg-blue # Blue listener rule
- Name: prod-tg-green # Green listener rule(test port)
Canary Flow:
1. New task set(Green)作成・デプロイ
2. Test listener で新版へアクセス
3. 検証 OK → 本 listener に traffic shift
4. Canary:最初 10% Green、残り Blue
5. 5 分後 100% Green に → Blue 削除
4.12 リソースクリーンアップ・保持戦略
# Blue/Green デプロイ後の Blue 環境処理
DeploymentGroup:
BlueGreenDeploymentConfiguration:
TerminateBlueInstancesOnDeploymentSuccess:
Action: KEEP_ALIVE # or TERMINATE
TerminationWaitTimeInMinutes: 60 # 60 分保持
# Blue に即座に戻したい場合は KEEP_ALIVE で
# コスト削減したい場合は TERMINATE で
5. 設定・操作の具体例
5.1 CLI で Application・Group 作成
# 1. Application 作成
aws deploy create-app \
--application-name my-app \
--compute-platform EC2_ON_PREMISES
# 2. Deployment Group 作成(EC2 タグベース)
aws deploy create-deployment-group \
--application-name my-app \
--deployment-group-name prod-group \
--service-role-arn arn:aws:iam::123456789012:role/CodeDeployRole \
--ec2-tag-filters Key=Environment,Value=production,Type=KEY_AND_VALUE \
--auto-scaling-groups prod-asg \
--deployment-config-name CodeDeployDefault.OneAtATime \
--load-balancer-info TargetGroupInfoList=[{Name=prod-tg}] \
--auto-rollback-configuration enabled=true,events=DEPLOYMENT_FAILURE,DEPLOYMENT_STOP_ON_ALARM \
--alarm-configuration enabled=true,alarms=[{name=ErrorRateAlarm}] \
--trigger-configurations triggerEvents=DeploymentSuccess,triggerTargetArn=arn:aws:sns:us-east-1:123456789012:notify
# 3. Deployment 作行
aws deploy create-deployment \
--application-name my-app \
--deployment-group-name prod-group \
--revision revisionType=S3,s3Location=s3://my-bucket/app-v1.0.zip \
--deployment-config-name CodeDeployDefault.OneAtATime \
--description "Releasing v1.0"
# 4. デプロイ状態確認
aws deploy get-deployment \
--deployment-id d-XXXXXXXXXXXX
# 5. 自動ロールバック確認
aws deploy stop-deployment \
--deployment-id d-XXXXXXXXXXXX \
--auto-rollback-enabled
5.2 CloudFormation で Deployment Group 定義
# codedeploy-app.yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
CodeDeployRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: codedeploy.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSCodeDeployRoleForEC2
CodeDeployApplication:
Type: AWS::CodeDeploy::App
Properties:
ApplicationName: my-app
ComputePlatform: EC2_ON_PREMISES
ProdDeploymentGroup:
Type: AWS::CodeDeploy::DeploymentGroup
Properties:
ApplicationName: !Ref CodeDeployApplication
DeploymentGroupName: prod-group
ServiceRoleArn: !GetAtt CodeDeployRole.Arn
DeploymentConfigName: CodeDeployDefault.OneAtATime
Ec2TagFilters:
- Key: Environment
Value: production
Type: KEY_AND_VALUE
LoadBalancerInfo:
TargetGroupInfoList:
- Name: prod-target-group
AutoRollbackConfiguration:
Enabled: true
Events:
- DEPLOYMENT_FAILURE
- DEPLOYMENT_STOP_ON_ALARM
AlarmConfiguration:
Enabled: true
Alarms:
- Name: ApplicationErrorRateAlarm
5.3 appspec.yml 実装例(Node.js App)
version: 0.0
os: linux
files:
- source: /dist
destination: /opt/myapp/
- source: /config
destination: /etc/myapp/
permissions:
- object: /opt/myapp
mode: 755
type:
- directory
hooks:
ApplicationStop:
- location: scripts/stop.sh
timeout: 60
runas: root
BeforeInstall:
- location: scripts/install_deps.sh
timeout: 300
runas: root
AfterInstall:
- location: scripts/config_app.sh
timeout: 300
runas: deploy
ApplicationStart:
- location: scripts/start.sh
timeout: 60
runas: root
ValidateService:
- location: scripts/health_check.sh
timeout: 180
runas: root
# scripts/health_check.sh
#!/bin/bash
set -e
echo "Checking application health..."
MAX_RETRIES=10
RETRY_COUNT=0
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/health)
if [ "$HTTP_CODE" -eq 200 ]; then
echo "Application is healthy (HTTP $HTTP_CODE)"
exit 0
fi
echo "Application returned HTTP $HTTP_CODE, retrying... ($((RETRY_COUNT+1))/$MAX_RETRIES)"
sleep 5
RETRY_COUNT=$((RETRY_COUNT+1))
done
echo "Application health check failed after $MAX_RETRIES attempts"
exit 1
6. 類似サービス比較表
| 機能 | CodeDeploy | Spinnaker | Argo Rollouts | Flagger | Octopus Deploy |
|---|---|---|---|---|---|
| プラットフォーム | AWS 専用 | マルチクラウド | Kubernetes | Kubernetes | On-Prem/Cloud |
| Blue/Green | ✅ EC2・ECS・Lambda | ✅ 高度な制御 | ✅ Argo Rollouts | ✅ Flagger | ✅ |
| Canary | ✅ Lambda・ECS | ✅ 詳細制御 | ✅ Progressive | ✅ Metrics ベース | △ |
| In-Place | ✅ EC2 | △ | ❌ | ❌ | ✅ |
| 自動ロールバック | ✅ Alarm ベース | △ Manual | ✅ Metric | ✅ Metric | ✅ |
| 学習曲線 | 低(AWS) | 高(複雑) | 中(K8s) | 中(K8s) | 中 |
| Cost | 無料(AWS) | Self-hosted | Free(K8s) | Free(K8s) | Licenced |
| 推奨対象 | AWS EC2/ECS | マルチクラウド | Kubernetes | K8s Canary | Enterprise |
比較ポイント:
- CodeDeploy: AWS ネイティブ・シンプル・EC2/ECS/Lambda 一元管理
- Spinnaker: マルチクラウド・複雑なデプロイ戦略・自社運用必要
- Argo Rollouts: Kubernetes 統合・Progressive delivery・OSS
7. ベストプラクティス(✅/❌)
✅ すべき設定
| 項目 | 実装例 | 理由 |
|---|---|---|
| appspec.yml を git 管理 | deployment config as code | 監査・再現性・ロールバック速度 |
| ValidateService フック | health check script 実行 | 失敗を早期検知・自動ロールバック |
| CloudWatch アラーム連携 | error rate・latency 監視 | 本番影響を秒単位で自動軽減 |
| 段階的デプロイ | Canary or Blue/Green | リスク最小化 |
| Pre/Post traffic hooks | Lambda validate function | トラフィック shift 前後の検証 |
| 最小健全ホスト数設定 | HalfAtATime/OneAtATime | ゼロダウンタイム維持 |
| クロスアカウント対応 | AssumeRole ポリシー | エンタープライズ対応 |
| デプロイ履歴保存 | EventBridge + S3 | コンプライアンス・事後分析 |
❌ アンチパターン
| 項目 | 問題 | 改善案 |
|---|---|---|
| appspec.yml をコンソール手作業 | 属人化・再現不可 | git で version 管理 |
| ValidateService なし | 失敗検知が遅い | 必ず health check 実装 |
| すべて AllAtOnce | 一度の障害で本番ダウン | Blue/Green or Canary |
| 自動ロールバック無効 | 障害継続 | alarm + auto-rollback 有効化 |
| On-Prem + EC2 + ECS 混在で同じ group | 複雑・トラブル | platform 別に Deployment Group 分離 |
| ロールバック手動実行 | 復旧時間長い | 自動 rollback 有効化 |
| デプロイログ保存なし | 事後分析不可 | CloudTrail + S3 で履歴保存 |
8. トラブルシューティング表
| 症状 | 原因 | 解決方法 |
|---|---|---|
| デプロイ失敗(appspec not found) | artifact に appspec.yml 含まれない | artifact 生成時に appspec.yml include 確認 |
| ValidateService timeout | health check 処理が長い | timeout 延長・処理簡略化 |
| ロールバック 失敗 | 前バージョン artifact 削除済み | artifact retention 設定・複数版保持 |
| Blue/Green ALB トラフィック切替失敗 | target group 設定不正 | target group 存在・health status 確認 |
| Lambda post-traffic hook 失敗 | hook 関数のメモリ不足 | Lambda timeout・memory 増加 |
| EC2 instance からの artifact access 失敗 | IAM role 権限不足 | EC2 role に S3 GetObject 権限追加 |
| Canary metric validation NG | alarm threshold 厳しすぎ | threshold 調整・metric 見直し |
| オンプレミスホスト接続不可 | Agent 未インストール・タグ不正 | Agent install・tag フィルター確認 |
9. 2025-2026 最新動向
9.1 ECS Blue/Green with CloudFormation 統合
2025 年、CloudFormation stack update で ECS Blue/Green を完全制御可能に。CodeDeploy リソース定義不要で、template のみで デプロイオーケストレーション可能。
9.2 Lambda Traffic Shift 精度向上
リアルタイム metric validation が高度化。CloudWatch Canary・Synthetic monitoring と統合し、デプロイ中のエラー率・latency・throttle を秒単位で監視。
9.3 Auto Rollback AI 判定(試験中)
AI が deployment pattern を学習して、自動的に Canary か All-at-once を推奨。信頼度に基づく段階的 traffic shift を自動調整。
9.4 Cross-Account・Cross-Region デプロイの一元化
Deployment Group を複数 account・region にまたがって集約管理。単一のデプロイ実行で全環境を同期。
10. 学習リソース・参考文献
公式ドキュメント(8+)
- AWS CodeDeploy User Guide
- appspec.yml Reference
- Deployment Configuration Reference
- ECS Blue/Green Deployment
- Lambda Deployment with Traffic Shift
- Rollback Configuration
- Cross-Account Deployments
- CodeDeploy Pricing
オープンソース・参考実装(5+)
- aws-samples/codedeploy-samples - appspec.yml サンプル
- aws-cdk-examples - codedeploy - CDK 実装
- Argo Rollouts Documentation - Kubernetes 環境
- Flagger - Progressive Delivery - K8s Canary deployment
- Spinnaker Deployment Strategies - マルチクラウド
参考記事(2025-2026)
- AWS CodeDeploy Blue-Green Deployment Best Practices
- How to do blue/green and canary deployments with Argo Rollouts
- Canary vs Blue-Green Deployment for Safer Releases
11. 実装例:エンタープライズ 3 環境 Blue/Green パイプライン
# codedeploy-pipeline-cdk.ts
import * as cdk from 'aws-cdk-lib';
import * as codedeploy from 'aws-cdk-lib/aws-codedeploy';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as elasticloadbalancingv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
export class CodeDeployBlueGreenStack extends cdk.Stack {
constructor(scope: cdk.App, id: string) {
super(scope, id);
// VPC・ALB
const vpc = ec2.Vpc.fromLookup(this, 'DefaultVpc', {
isDefault: true,
});
const alb = new elasticloadbalancingv2.ApplicationLoadBalancer(
this,
'ALB',
{ vpc, internetFacing: true }
);
const blueTargetGroup = new elasticloadbalancingv2.ApplicationTargetGroup(
this,
'BlueTargetGroup',
{
vpc,
port: 80,
targetType: elasticloadbalancingv2.TargetType.INSTANCE,
}
);
const greenTargetGroup = new elasticloadbalancingv2.ApplicationTargetGroup(
this,
'GreenTargetGroup',
{
vpc,
port: 80,
targetType: elasticloadbalancingv2.TargetType.INSTANCE,
}
);
// CodeDeploy Application
const app = new codedeploy.ServerApplication(this, 'App', {
applicationName: 'my-app',
});
// Blue/Green Deployment Group
const deploymentGroup = new codedeploy.ServerDeploymentGroup(
this,
'BlueGreenDeploymentGroup',
{
application: app,
deploymentGroupName: 'prod-bg-group',
deploymentConfig: codedeploy.ServerDeploymentConfig.ALL_AT_ONCE,
autoRollback: {
failedDeployment: true,
stoppedDeployment: true,
},
deploymentType: codedeploy.DeploymentType.BLUE_GREEN,
loadBalancer: codedeploy.LoadBalancer.application(blueTargetGroup),
autoScalingGroups: [/* prod-asg */],
}
);
// Output
new cdk.CfnOutput(this, 'AppUrl', {
value: alb.loadBalancerDnsName,
});
}
}
12. 導入ロードマップ
Week 1-2: 環境準備
├── CodeDeploy IAM Role 作成
├── EC2/ECS に CodeDeploy Agent install
├── appspec.yml 作成・テスト
└── Target Group・ALB 設定(Blue/Green の場合)
Week 3: Deployment Group 構築
├── Application 作成
├── Deployment Group 定義(EC2 tag フィルター)
├── Health check・validation script 実装
└── Auto-rollback 設定
Week 4: パイプライン統合
├── CodePipeline Deploy stage 追加
├── CodeBuild から artifact 受け取り
├── Deploy 自動実行・成功/失敗 通知
└── 手動テスト
Week 5: 本番運用
├── 本番 EC2・ECS に agent 適用
├── CloudWatch alarm 連携・auto-rollback 検証
├── incident response plan 策定
└── チーム トレーニング
13. チェックリスト
機能チェックリスト
- [ ] appspec.yml を git 管理・version control
- [ ] ApplicationStop / ApplicationStart / ValidateService hook 実装
- [ ] CodeDeploy Application・Deployment Group 作成完了
- [ ] IAM Role:EC2/on-prem に権限付与
- [ ] Health check script:デプロイ成功判定
- [ ] Auto-rollback:failed deployment / CloudWatch alarm
- [ ] CodePipeline Deploy stage 連携
- [ ] Artifact location:S3 bucket 指定
デプロイ戦略チェックリスト
- [ ] In-place(EC2):HalfAtATime で段階実行
- [ ] Blue/Green(EC2/ECS):ALB target group 切替
- [ ] Lambda Canary:traffic shift + post-traffic hook
- [ ] 最小健全ホスト数:常時 50% 以上稼働
運用チェックリスト
- [ ] CloudWatch alarm:error rate・latency 監視
- [ ] Auto-rollback trigger:設定・テスト完了
- [ ] Rollback manual procedure:文書化・テスト済み
- [ ] Deployment history:監査ログ・S3 保存
- [ ] Incident response:on-call 手順化
まとめ
AWS CodeDeploy は 「EC2・ECS・Lambda・オンプレミスへの段階的デプロイを自動化し、Blue/Green・Canary・ローリング戦略で本番障害リスクを最小化する統合デプロイメント管理サービス」 です。
appspec.yml で deployment config を code 化し、CloudWatch alarm 連携・自動ロールバック・ヘルスチェック で、人手介入なしに 「安全で迅速・確実なリリース自動化」 を実現できます。CodePipeline・CodeBuild と組み合わせれば、「Source → Build → Test → Deployment → Monitor → Auto-Rollback」 という完全自動化フローが確立され、開発速度と本番品質を大幅に向上させることができます。
最終更新:2026-04-26 バージョン:v2.0