🚀 ECSデプロむで倧混乱新人゚ンゞニアが孊ぶロヌリングアップデヌトずBlue/Greenの違い

2025幎8月3日 | 技術開発

ECSデプロむ戊略比范

この蚘事をシェア

プロロヌグ新人゚ンゞニアの悲劇

田䞭新人「先茩倧倉ですECSでサヌビスを立ち䞊げたんですけど、『ロヌリングアップデヌト』っおいうのを掚奚されお、『Blue/Greenデプロむ』は掚奚されなかったんですでも、これっおどっちが良いんですか」

䜐藀先茩「おヌ、田䞭くん萜ち着いお。コヌヒヌでも飲みながら説明するから座っお座っお。たずは深呌吞だよ。」

田䞭「はい...ゎクゎクでも本圓にロヌリングアップデヌトだけで倧䞈倫なんでしょうか」

䜐藀先茩「たあたあ、その䞍安な気持ちも分かるよ。実際、僕も最初は『ロヌリング青緑䜕それ矎味しいの』っお感じだったからね笑」

第1章ロヌリングアップデヌトっおなんぞや

䜐藀先茩「たずは基本から説明するね。ロヌリングアップデヌトっおいうのは、既存のむンスタンスを少しず぀新バヌゞョンに眮き換えおいく方法なんだ。」

田䞭「少しず぀...ですか」

䜐藀先茩「そう䟋えば、君のサヌビスに4぀のタスクが動いおるずするよね。ロヌリングアップデヌトだず、こんな感じになる」

【ロヌリングアップデヌトの流れ】
初期状態叀いバヌゞョンのタスク4぀皌働 🟊🟊🟊🟊
↓
新バヌゞョンのタスクを2぀远加 🟊🟊🟊🟊🟩🟩蚈6タスク
↓
ヘルスチェック成功確認 ✅
↓
叀いバヌゞョンのタスクを2぀削陀 🟊🟊🟩🟩
↓
さらに新バヌゞョンを2぀远加 🟊🟊🟩🟩🟩🟩
↓
最埌に叀いタスクを削陀 🟩🟩🟩🟩完了

田䞭「おおなるほど、段階的に眮き換えおいくんですね」

䜐藀先茩「そういうこず蚭定もシンプルでね、こんな感じで曞けるよ」

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

田䞭「この数字の意味がよく分からないです...」

䜐藀先茩「あヌ、これね。maximumPercent: 200っおいうのは、『最倧で通垞の2倍たでタスクを起動しおいいよ』っお意味。minimumHealthyPercent: 100は『健党なタスクは最䜎でも通垞の100%は維持しおね』っお意味なんだ。」

田䞭「぀たり、4タスクなら最倧8タスクたで起動できお、最䜎でも4タスクは健党に動いおないずダメっおこずですか」

䜐藀先茩「正解君、飲み蟌み早いじゃない」

ロヌリングアップデヌトのメリット・デメリット

䜐藀先茩「ロヌリングアップデヌトの良いずころず悪いずころをたずめるずこんな感じかな」

【メリット】

  • 💰 コストが安い远加のむンフラが䞍芁
  • 🔄 自動でヘルスチェックしながら曎新
  • 📉 問題が発生しおも圱響範囲を限定できる
  • ⚡ 蚭定が簡単

【デメリット】

  • 🔄 完党なロヌルバックが難しい
  • 🔀 デプロむ䞭は新旧バヌゞョンが混圚
  • 🔗 埌方互換性が必芁

田䞭「埌方互換性っお䜕ですか」

䜐藀先茩「䟋えば、デヌタベヌスのカラムを削陀するような倉曎をしたずき、叀いバヌゞョンのアプリがただ動いおるず、そのカラムを参照しようずしお゚ラヌになっちゃうでしょそういうのを避けるために、新旧䞡方で動くように䜜る必芁があるっおこずだよ。」

田䞭「なるほど...それは確かに気を぀けないずいけたせんね。」

第2章Blue/Greenデプロむメントの謎

䜐藀先茩「じゃあ次は、Blue/Greenデプロむメントに぀いお説明するね。これは『青い環境』ず『緑の環境』を甚意する方法だよ。」

田䞭「青ず緑...䜕だかカラフルですね」

䜐藀先茩「名前がカラフルなだけじゃなくお、考え方も党然違うんだ。Blue/Greenは、新環境Greenを完党に構築しおから䞀気に切り替える方法なんだよ。」

graph TD
    A[Blue環境皌働䞭 🟊] -->|新環境構築| B[Green環境構築 🟩]
    B -->|テスト実斜| C[テスト完了 ✅]
    C -->|トラフィック移行開始| D[段階的な移行 🔄]
    D -->|完党移行| E[Green環境に完党移行 🟩]
    E -->|問題なし| F[Blue環境削陀 🗑]
    E -->|問題発生| G[Blue環境に即時ロヌルバック 🔙]

田䞭「わヌ、これだず環境が2぀必芁になるんですね。」

䜐藀先茩「そうだからコストは倍かかっちゃうけど、その分安党性は高いんだ。蚭定䟋はこんな感じ」

resource "aws_ecs_service" "main" {
  deployment_controller {
    type = "CODE_DEPLOY"
  }
  
  load_balancer {
    target_group_arn = aws_lb_target_group.blue.arn
    container_name   = "app"
    container_port   = 80
  }
}

Blue/Greenデプロむメントのメリット・デメリット

【メリット】

  • ⚡ 迅速なロヌルバックが可胜
  • 🧪 テスト環境ずしおも利甚可胜
  • 🚫 バヌゞョンの混圚がない
  • ⏰ ダりンタむムなしで切り替え可胜

【デメリット】

  • 💞 コストが高い環境を2぀甚意
  • 📊 リ゜ヌス䜿甚量が倚い
  • 🔄 切り替え時のセッション管理が必芁

田䞭「うヌん、どっちも䞀長䞀短ですね...」

䜐藀先茩「そうなんだよ。だから状況に応じお䜿い分けるこずが倧事なんだ。」

第3章実際の運甚での悲喜こもごも

䜐藀先茩「実際の運甚では、色々なドラマがあるんだよ。僕の経隓談を話そうか。」

ケヌス1ロヌリングアップデヌトでの倧倱敗

䜐藀先茩「去幎のこずなんだけど、Webアプリのアップデヌトでロヌリングアップデヌトを䜿ったんだ。でも、新バヌゞョンでAPIの仕様を倉曎しちゃっおね...」

田䞭「え、それっおたずくないですか」

䜐藀先茩「超たずかった叀いバヌゞョンのフロント゚ンドが新しいAPIを呌び出そうずしお、゚ラヌが頻発したんだ。お客さんからのクレヌムの嵐で、その日は培倜でロヌルバック䜜業をしたよ涙」

# 緊急ロヌルバックの様子
$ aws ecs update-service --service my-service --task-definition old-task-def
# 「頌む戻っおくれ」っお祈りながら実行した

田䞭「それは倧倉でしたね...でも、良い勉匷になりそうです。」

䜐藀先茩「そうなんだ。それからは、埌方互換性をきちんず考えるようになったよ。䟋えば、こんな颚にヘルスチェックを匷化したりね」

# タスク定矩でのヘルスチェック蚭定
healthCheck:
  command: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"]
  interval: 30
  timeout: 5
  retries: 3
  startPeriod: 60

ケヌス2Blue/Greenデプロむメントでの成功䜓隓

䜐藀先茩「䞀方で、倧芏暡なデヌタベヌスマむグレヌションが必芁なずきは、Blue/Greenデプロむメントで救われたこずがあるんだ。」

田䞭「どんな状況だったんですか」

䜐藀先茩「ナヌザヌテヌブルの構造を倧幅に倉曎する必芁があっおね。普通にロヌリングアップデヌトでやったら、確実に障害が起きる状況だった。」

-- こんな感じのマむグレヌション
CREATE TABLE users_new (
  id BIGINT PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255),
  profile_data JSONB,  -- 新しく远加
  created_at TIMESTAMP
);

-- デヌタ移行
INSERT INTO users_new 
SELECT id, name, email, '{}', created_at FROM users;

䜐藀先茩「Blue/Greenだず、Green環境で完党にテストしおから切り替えられるから、安心だったよ。切り替えも䞀瞬だったし。」

田䞭「なるほどやっぱり状況に応じお䜿い分けが重芁なんですね。」

第4章刀断基準をマスタヌしよう

䜐藀先茩「じゃあ、実際にどっちを䜿うか迷ったずきの刀断基準を教えるね。」

ロヌリングアップデヌトを遞ぶべき堎面

䜐藀先茩「こんなずきはロヌリングアップデヌトがオススメだよ」

  • 🐛 小芏暡なバグフィックス
  • 🔒 セキュリティパッチの適甚
  • 📊 コンテナむメヌゞの曎新
  • ✹ 小さな機胜远加
  • 💰 コストを抑えたい堎合

田䞭「具䜓的にはどんな感じですか」

䜐藀先茩「䟋えば、『ログ出力の圢匏をちょっず倉曎』ずか『UIの色を倉曎』ずか、そういう圱響の少ない倉曎ならロヌリングアップデヌトで十分だね。」

Blue/Greenデプロむメントを遞ぶべき堎面

䜐藀先茩「逆に、こんなずきはBlue/Greenを遞んだ方がいいよ」

  • 🏗 倧芏暡なアヌキテクチャ倉曎
  • 🗄 デヌタベヌススキヌマの倉曎
  • 📈 フレヌムワヌクのメゞャヌバヌゞョンアップ
  • 🧪 完党なテストが必芁な機胜远加
  • 🚚 ミッションクリティカルなサヌビス

田䞭「ミッションクリティカルっお」

䜐藀先茩「芁するに、『これが止たったら䌚瀟が倧倉なこずになる』っおいうサヌビスのこずだよ。決枈システムずか、重芁なAPIずかね。」

第5章監芖ずトラブルシュヌティング

䜐藀先茩「デプロむ戊略を遞んだら、次は監芖が重芁だよ。どちらの方法でも、しっかりず監芖蚭定をしおおかないず、問題に気づくのが遅れちゃうからね。」

監芖蚭定の䟋

# CloudWatch Alarms蚭定䟋
alarms:
  - name: HighErrorRate
    metric: ErrorRate
    threshold: 1%
    period: 60
    evaluationPeriods: 2
    action: "䜕かおかしいぞ゚ラヌ率が䞊がっおる"
    
  - name: HighLatency
    metric: p95Latency
    threshold: 500ms
    period: 300
    evaluationPeriods: 3
    action: "レスポンスが遅くなっおる調査開始"

田䞭「うわヌ、これだけ蚭定するのも倧倉そうですね...」

䜐藀先茩「最初は倧倉だけど、䞀床蚭定しちゃえば埌は楜だよ。特に゚ラヌ率ずレスポンス時間は必須だね。これがあるかないかで、障害の発芋時間が党然違うから。」

トラブルシュヌティングの実䟋

䜐藀先茩「実際にトラブルが起きたずきの察凊法も教えおおくね。」

ロヌリングアップデヌトでヘルスチェックが倱敗した堎合

# たずはサヌビスの状態確認
$ aws ecs describe-services --service my-service

# タスクの詳现確認
$ aws ecs describe-tasks --tasks task-id

# ログ確認
$ aws logs get-log-events --log-group-name /ecs/my-service

䜐藀先茩「倧抵の堎合、ログを芋れば原因が分かるよ。『OutOfMemory』ずか『Connection refused』ずか、分かりやすい゚ラヌが出おるこずが倚いからね。」

Blue/Greenデプロむメントで切り替えに倱敗した堎合

# 即座にロヌルバック
$ aws deploy stop-deployment --deployment-id deployment-123
$ aws deploy create-deployment --application-name my-app --deployment-group-name my-group --revision revisionType=S3,s3Location=bucket=my-bucket,key=old-version.zip

田䞭「ロヌルバックっお、そんなに簡単にできるんですね」

䜐藀先茩「Blue/Greenの最倧のメリットがそれなんだ。問題が起きおも、『はい、元に戻したヌす』っお感じで、数分で元の環境に戻せるからね。」

第6章実践的なTips

䜐藀先茩「最埌に、実際に運甚する䞊での実践的なTipsを教えるよ。」

ロヌリングアップデヌトのコツ

1. 段階的な蚭定倉曎

{
  "deploymentConfiguration": {
    "maximumPercent": 150,  // 最初は控えめに
    "minimumHealthyPercent": 75  // 段階的に調敎
  }
}

2. ヘルスチェックの工倫

# Dockerfileでのヘルスチェック
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

Blue/Greenデプロむメントのコツ

1. セッション管理

# Nginxでのセッション維持蚭定
upstream backend {
    ip_hash;  # IPベヌスでセッション維持
    server blue.example.com;
    server green.example.com backup;
}

2. デヌタベヌス接続の工倫

# アプリケヌション偎での接続切り替え
def get_db_connection():
    if os.environ.get('DEPLOYMENT_COLOR') == 'green':
        return connect_to_green_db()
    else:
        return connect_to_blue_db()

田䞭「なるほど现かい工倫がいっぱいあるんですね。」

䜐藀先茩「そうなんだ。最初は基本的な蚭定から始めお、埐々に现かいずころを調敎しおいけばいいよ。」

終章田䞭くんの成長

田䞭「先茩、今日は本圓にありがずうございたしたおかげで、ロヌリングアップデヌトずBlue/Greenデプロむメントの違いがよく分かりたした。」

䜐藀先茩「どういたしたしおで、結局田䞭くんのサヌビスはどっちを䜿うこずにしたの」

田䞭「えヌっず、僕のサヌビスは小芏暡なWebアプリで、倧きなスキヌマ倉曎もないので、ロヌリングアップデヌトで行こうず思いたす」

䜐藀先茩「いい刀断だねでも、将来的にサヌビスが倧きくなったら、Blue/Greenも怜蚎しおみおよ。」

田䞭「はいあず、監芖蚭定もちゃんずやりたす。゚ラヌ率ずレスポンス時間の監芖は必須ですよね」

䜐藀先茩「完璧君なら倧䞈倫だよ。䜕か困ったこずがあったら、たたい぀でも聞いおね。」

田䞭「ありがずうございたすこれで安心しおデプロむできたす」


たずめ

ECSでのデプロむ戊略遞択は、サヌビスの特性や芁件によっお決たりたす。重芁なのは

  • ロヌリングアップデヌト: コスト効率重芖、小芏暡倉曎に適しおいる
  • Blue/Greenデプロむメント: 安党性重芖、倧芏暡倉曎や重芁なサヌビスに適しおいる

どちらを遞んでも、適切な監芖蚭定ずトラブルシュヌティングの準備が欠かせたせん。最初は基本的な蚭定から始めお、埐々に運甚ノりハりを蓄積しおいきたしょう


この蚘事が、ECSでのデプロむ戊略遞択に悩む党おの゚ンゞニアの助けになれば幞いです。Happy Deploying! 🚀

この蚘事が圹に立ったらシェアしおください

ECSデプロむ戊略に぀いおのナレッゞをみんなで共有したしょう

カテゎリ

技術開発

公開日

2025幎8月3日

お気軜にご盞談ください

蚘事に関するご質問や、AI・IT技術導入のご盞談など、お気軜にお問い合わせください。