AWSデプロイ戦略:Blue/Green、Canary、Rolling、CodeDeploy

Shunku

安全で効率的なデプロイは、継続的デリバリーの成功に不可欠です。AWSは複数のデプロイ戦略とサービスを提供しており、ワークロードに応じて適切な方法を選択できます。

デプロイ戦略の概要

flowchart TB
    subgraph Strategies["デプロイ戦略"]
        AllAtOnce["All at Once<br/>一括"]
        Rolling["Rolling<br/>ローリング"]
        BlueGreen["Blue/Green<br/>切り替え"]
        Canary["Canary<br/>段階的"]
    end

    AllAtOnce --> |"最速/最リスク"| Fast["高速デプロイ"]
    Rolling --> |"段階的/低リスク"| Gradual["段階的更新"]
    BlueGreen --> |"即時切替/ロールバック"| Safe["安全なデプロイ"]
    Canary --> |"検証/最小リスク"| Test["テスト的デプロイ"]

    style AllAtOnce fill:#ef4444,color:#fff
    style Rolling fill:#f59e0b,color:#000
    style BlueGreen fill:#22c55e,color:#fff
    style Canary fill:#3b82f6,color:#fff

比較表

戦略 ダウンタイム ロールバック コスト 複雑さ
All at Once あり 遅い 最低
Rolling なし 中程度
Blue/Green なし 即時 高(2倍)
Canary なし 即時 中程度

All at Once(一括デプロイ)

概要

すべてのインスタンスを同時に更新します。

flowchart TB
    subgraph Before["更新前"]
        V1_1["v1"]
        V1_2["v1"]
        V1_3["v1"]
    end

    subgraph After["更新後"]
        V2_1["v2"]
        V2_2["v2"]
        V2_3["v2"]
    end

    Before --> |"一括更新"| After

    style Before fill:#3b82f6,color:#fff
    style After fill:#22c55e,color:#fff

適したケース

  • 開発/テスト環境
  • ダウンタイムが許容される場合
  • 迅速なデプロイが必要な場合

Rolling(ローリングデプロイ)

概要

インスタンスを順次更新します。

flowchart TB
    subgraph Phase1["フェーズ1"]
        P1_1["v2 ✓"]
        P1_2["v1"]
        P1_3["v1"]
        P1_4["v1"]
    end

    subgraph Phase2["フェーズ2"]
        P2_1["v2 ✓"]
        P2_2["v2 ✓"]
        P2_3["v1"]
        P2_4["v1"]
    end

    subgraph Phase3["完了"]
        P3_1["v2 ✓"]
        P3_2["v2 ✓"]
        P3_3["v2 ✓"]
        P3_4["v2 ✓"]
    end

    Phase1 --> Phase2 --> Phase3

    style Phase1 fill:#f59e0b,color:#000
    style Phase2 fill:#f59e0b,color:#000
    style Phase3 fill:#22c55e,color:#fff

バリエーション

タイプ 説明
Rolling 1つずつ更新
Rolling with Additional Batch 追加インスタンスで更新
Immutable 新規インスタンスグループ作成

Blue/Green デプロイ

概要

2つの同一環境を用意し、トラフィックを切り替えます。

flowchart TB
    subgraph LoadBalancer["ロードバランサー"]
        ALB["ALB"]
    end

    subgraph Blue["Blue環境(現行)"]
        B1["v1"]
        B2["v1"]
    end

    subgraph Green["Green環境(新規)"]
        G1["v2"]
        G2["v2"]
    end

    ALB --> |"100%"| Blue
    ALB -.-> |"切り替え後"| Green

    style Blue fill:#3b82f6,color:#fff
    style Green fill:#22c55e,color:#fff

実装方法

サービス 実装方法
EC2 Auto Scaling Group の切り替え
ECS CodeDeploy Blue/Green
Lambda バージョン/エイリアス
RDS Blue/Green Deployments

Route 53での切り替え

# 加重ルーティングで段階的に切り替え
aws route53 change-resource-record-sets \
    --hosted-zone-id Z1234 \
    --change-batch '{
        "Changes": [{
            "Action": "UPSERT",
            "ResourceRecordSet": {
                "Name": "app.example.com",
                "Type": "A",
                "SetIdentifier": "green",
                "Weight": 100,
                "AliasTarget": {
                    "HostedZoneId": "Z5678",
                    "DNSName": "green-alb.example.com",
                    "EvaluateTargetHealth": true
                }
            }
        }]
    }'

Canary デプロイ

概要

新バージョンを少数のインスタンスにデプロイし、段階的に拡大します。

flowchart TB
    subgraph Phase1["フェーズ1: 10%"]
        C1_1["v2"]
        C1_2["v1"]
        C1_3["v1"]
        C1_4["v1"]
    end

    subgraph Phase2["フェーズ2: 50%"]
        C2_1["v2"]
        C2_2["v2"]
        C2_3["v1"]
        C2_4["v1"]
    end

    subgraph Phase3["フェーズ3: 100%"]
        C3_1["v2"]
        C3_2["v2"]
        C3_3["v2"]
        C3_4["v2"]
    end

    Phase1 --> |"検証OK"| Phase2
    Phase2 --> |"検証OK"| Phase3

    style Phase1 fill:#3b82f6,color:#fff
    style Phase2 fill:#f59e0b,color:#000
    style Phase3 fill:#22c55e,color:#fff

CodeDeployの設定

# CodeDeploy Canary設定
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "arn:aws:ecs:..."
        LoadBalancerInfo:
          ContainerName: "app"
          ContainerPort: 80
        PlatformVersion: "LATEST"
Hooks:
  - BeforeAllowTraffic: "LambdaFunctionForValidation"
  - AfterAllowTraffic: "LambdaFunctionForSmokeTest"

AWS CodeDeploy

デプロイタイプ

flowchart TB
    subgraph CodeDeploy["CodeDeploy"]
        EC2["EC2/オンプレミス"]
        ECS["Amazon ECS"]
        Lambda["Lambda"]
    end

    EC2 --> |"In-place/Blue-Green"| EC2Deploy["EC2デプロイ"]
    ECS --> |"Blue-Green"| ECSDeploy["ECSデプロイ"]
    Lambda --> |"Canary/Linear"| LambdaDeploy["Lambdaデプロイ"]

    style CodeDeploy fill:#f59e0b,color:#000

デプロイ設定

設定 説明
CodeDeployDefault.AllAtOnce すべて同時
CodeDeployDefault.HalfAtATime 半分ずつ
CodeDeployDefault.OneAtATime 1つずつ
CodeDeployDefault.LambdaCanary10Percent5Minutes 10%→5分後に残り
CodeDeployDefault.LambdaLinear10PercentEvery1Minute 毎分10%ずつ

appspec.yml(EC2)

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html
hooks:
  BeforeInstall:
    - location: scripts/stop_server.sh
      timeout: 300
  AfterInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
  ApplicationStart:
    - location: scripts/start_server.sh
      timeout: 300
  ValidateService:
    - location: scripts/validate_service.sh
      timeout: 300

ECSデプロイ戦略

デプロイタイプ

flowchart TB
    subgraph ECSDeployment["ECSデプロイ"]
        Rolling["ローリング更新"]
        BlueGreen["Blue/Green<br/>(CodeDeploy)"]
        External["外部デプロイ"]
    end

    Rolling --> |"デフォルト"| Simple["シンプル"]
    BlueGreen --> |"安全"| Safe["本番推奨"]
    External --> |"カスタム"| Custom["高度な制御"]

    style BlueGreen fill:#22c55e,color:#fff

ローリング更新設定

{
  "deploymentConfiguration": {
    "maximumPercent": 200,
    "minimumHealthyPercent": 100
  }
}

Blue/Green(CodeDeploy)

flowchart TB
    subgraph ALB["Application Load Balancer"]
        Listener["リスナー"]
        TG1["ターゲットグループ1<br/>(Blue)"]
        TG2["ターゲットグループ2<br/>(Green)"]
    end

    subgraph ECS["ECS Service"]
        Tasks1["現行タスク"]
        Tasks2["新タスク"]
    end

    Listener --> TG1
    TG1 --> Tasks1
    TG2 --> Tasks2

    style TG1 fill:#3b82f6,color:#fff
    style TG2 fill:#22c55e,color:#fff

Lambdaデプロイ戦略

バージョンとエイリアス

flowchart LR
    subgraph Lambda["Lambda関数"]
        V1["バージョン1"]
        V2["バージョン2"]
        Alias["エイリアス: prod"]
    end

    Alias --> |"90%"| V1
    Alias --> |"10%"| V2

    style Alias fill:#f59e0b,color:#000

SAMでのCanary設定

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: my-function
      AutoPublishAlias: live
      DeploymentPreference:
        Type: Canary10Percent5Minutes
        Alarms:
          - !Ref ErrorAlarm
        Hooks:
          PreTraffic: !Ref PreTrafficHook
          PostTraffic: !Ref PostTrafficHook

ロールバック戦略

自動ロールバック

flowchart TB
    subgraph Triggers["ロールバックトリガー"]
        Alarm["CloudWatchアラーム"]
        Health["ヘルスチェック失敗"]
        Manual["手動トリガー"]
    end

    subgraph Actions["アクション"]
        Revert["前バージョンに戻す"]
        Notify["通知"]
        Log["ログ記録"]
    end

    Triggers --> Actions

    style Triggers fill:#ef4444,color:#fff
    style Actions fill:#22c55e,color:#fff

CodeDeployロールバック設定

{
  "autoRollbackConfiguration": {
    "enabled": true,
    "events": [
      "DEPLOYMENT_FAILURE",
      "DEPLOYMENT_STOP_ON_ALARM",
      "DEPLOYMENT_STOP_ON_REQUEST"
    ]
  },
  "alarmConfiguration": {
    "enabled": true,
    "alarms": [
      {"name": "HighErrorRate"},
      {"name": "HighLatency"}
    ]
  }
}

ベストプラクティス

デプロイ戦略の選択

flowchart TD
    Q1{"本番環境?"}
    Q2{"ダウンタイム許容?"}
    Q3{"迅速なロールバック必要?"}
    Q4{"段階的検証必要?"}

    Q1 -->|No| AllAtOnce["All at Once"]
    Q1 -->|Yes| Q2

    Q2 -->|Yes| Rolling["Rolling"]
    Q2 -->|No| Q3

    Q3 -->|Yes| Q4
    Q3 -->|No| Rolling

    Q4 -->|Yes| Canary["Canary"]
    Q4 -->|No| BlueGreen["Blue/Green"]

    style AllAtOnce fill:#6b7280,color:#fff
    style Rolling fill:#f59e0b,color:#000
    style BlueGreen fill:#22c55e,color:#fff
    style Canary fill:#3b82f6,color:#fff

チェックリスト

フェーズ チェック項目
事前 ヘルスチェック設定
事前 ロールバック手順確認
事前 モニタリング設定
デプロイ中 メトリクス監視
デプロイ中 エラーログ確認
事後 動作検証
事後 パフォーマンス確認

まとめ

flowchart TB
    subgraph Deployment["デプロイ戦略"]
        Strategy["戦略選択"]
        Tool["ツール選択"]
        Monitor["監視"]
        Rollback["ロールバック"]
    end

    Strategy --> |"リスク許容度"| Risk["リスク評価"]
    Tool --> |"CodeDeploy/ECS/Lambda"| Service["サービス選択"]
    Monitor --> |"CloudWatch"| Metrics["メトリクス"]
    Rollback --> |"Automation"| Safety["安全性"]

    style Deployment fill:#3b82f6,color:#fff
戦略 推奨環境 リスク
All at Once 開発/テスト
Rolling ステージング
Blue/Green 本番
Canary 本番(重要) 最低

適切なデプロイ戦略の選択により、安全で効率的なリリースを実現できます。

参考資料