目次

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+)

  1. AWS CodeDeploy User Guide
  2. appspec.yml Reference
  3. Deployment Configuration Reference
  4. ECS Blue/Green Deployment
  5. Lambda Deployment with Traffic Shift
  6. Rollback Configuration
  7. Cross-Account Deployments
  8. CodeDeploy Pricing

オープンソース・参考実装(5+)

  1. aws-samples/codedeploy-samples - appspec.yml サンプル
  2. aws-cdk-examples - codedeploy - CDK 実装
  3. Argo Rollouts Documentation - Kubernetes 環境
  4. Flagger - Progressive Delivery - K8s Canary deployment
  5. Spinnaker Deployment Strategies - マルチクラウド

参考記事(2025-2026)


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