目次

AWS Elastic Beanstalk 完全ガイド v2.0

マネージドデプロイプラットフォームの実装と運用

AWS Elastic Beanstalk は、「アプリケーションのコードをアップロードするだけで、EC2 + ALB + Auto Scaling + RDS を自動プロビジョニングするフルマネージドデプロイメントサービス」 です。インフラ管理を最小化しながら、Node.js・Python・Java・.NET・Ruby・PHP・Go・Docker 等の Web アプリケーションを本番化できます。本ドキュメントは初心者から実務者向けに、Elastic Beanstalk のアーキテクチャ・コンポーネント・ユースケース・デプロイ戦略・2025-2026 動向を体系的に解説する包括的ガイドです。

ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け: Elastic Beanstalk とは何か、マネージドデプロイメントの基本を学びたい方
  • 開発者向け: Node.js・Python・Java アプリを Elastic Beanstalk でデプロイしたい方
  • SRE/インフラ向け: Blue-Green・Rolling・Immutable デプロイ・カスタムプラットフォーム構築
  • 意思決定者向け: Elastic Beanstalk vs App Runner vs ECS Fargate の選定

2025-2026 年の Elastic Beanstalk エコシステム

  • Spot Allocation Strategies: January 2025 追加、Green 環境のコスト最適化
  • PHP 8.3 / Node.js 22 LTS: 2025 年ランタイム更新、最新言語バージョン対応
  • Blue-Green 自動化: CodePipeline + Lambda による CNAME スワップ自動化
  • Enhanced Health Monitoring: CloudWatch アラームによる自動ロールバック強化
  • Secrets Manager 統合: 環境変数直接指定から SSM Parameter Store・Secrets Manager への統合

目次

  1. 概要
  2. Elastic Beanstalk が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. コアコンポーネント
  6. プラットフォームと対応言語
  7. 主要ユースケース
  8. 設定・操作の具体例
  9. 類似サービス比較表
  10. ベストプラクティス
  11. トラブルシューティング
  12. 2025-2026 最新動向
  13. 学習リソース・参考文献
  14. 実装例
  15. チェックリスト
  16. まとめ

概要

初心者向けメモ: Elastic Beanstalk は「コードを ZIP / WAR で機能性 push」「環境を選択(Web Server or Worker)」「リソース仕様を指定(vCPU・メモリ)」でデプロイが完了するシンプルさが特徴です。通常は EC2 + ALB + Auto Scaling + RDS を個別設定するのに数時間かかりますが、Elastic Beanstalk なら 15 分で環境構築が可能。ただし ECS Fargate や App Runner との選択を迫られるため、ユースケースに応じた判断が必要です。

AWS Elastic Beanstalk 公式定義:

“AWS Elastic Beanstalk is an easy-to-use service for deploying and scaling web applications and services developed with Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker on familiar servers such as Apache, Nginx, Passenger, and IIS.”

このサービスを選ぶ理由

なぜ Elastic Beanstalk でないといけないのか?

理由 詳細
既存アプリの継続運用 WAR / JAR / ZIP を再パッケージ化なしでクラウド化、アーキテクチャ変更不要
インフラ管理の最小化 EC2 / ALB / SG / Auto Scaling を手動設定不要、.ebextensions でコード化
デプロイ戦略の充実 Rolling・Immutable・Blue-Green・Canary など段階的デプロイで高可用性
環境管理の簡潔性 本番・ステージング・開発を .ebextensions で統一設定、複製・削除が容易
マネージドセキュリティ AWS が OS・Runtime パッチを自動適用、Security Group 最小化

具体的なユースケース

  • Java Spring Boot アプリケーション(既存 WAR ファイル)の EC2 ホスティング
  • Python Flask / Django アプリの AWS マネージドホスティング
  • Node.js Express API の自動スケーリング環境構築
  • Docker マルチコンテナアプリ(docker-compose.yml)のデプロイ
  • PHP / WordPress サイトの .ebextensions カスタマイズ
  • Worker 環境での SQS メッセージ非同期処理

Elastic Beanstalk が解決する課題

課題 従来(ECS Fargate) Elastic Beanstalk 解決方法
セットアップ時間 VPC / SG / ALB / TG / Auto Scaling / ECS Cluster / Task Definition で数時間 eb init / eb create で 15分以内に完了
デプロイ戦略 CodePipeline + CodeBuild + CodeDeploy の複合構築が必要 設定ファイル(option_settings)で Rolling / Immutable 選択
言語ランタイム管理 Docker イメージビルド・管理が必須 Elastic Beanstalk Platform が自動管理
環境複製 CloudFormation テンプレート手動作成、環境ごとのカスタマイズ Saved Configurations で本番設定を ステージング・開発に複製
セキュリティパッチ 手動で OS・Runtime アップデート管理 AWS が Platform Version 更新で自動適用
ロールバック 前バージョンのデプロイを手動実行 eb deploy --version で即座にロールバック

主な特徴

1. デプロイメントソース

ZIP / WAR パッケージ

  • アプリケーションコードを ZIP 形式でパッケージ
  • Node.js・Python・PHP は source bundle(package.json / requirements.txt 含)
  • Java は WAR または JAR ファイル

Git リポジトリ直接指定

  • eb deploy --message “Deploy from Git” で最新コミットをデプロイ
  • .ebignore ファイルで除外ファイル指定可能

Docker コンテナ

  • Single Docker:Dockerfile を含む ZIP
  • Multi-container Docker:Dockerrun.aws.json で複数コンテナ構成定義

2. 環境タイプ

Web Server 環境

  • HTTP/HTTPS トラフィック受け付け
  • ALB(デフォルト)、NLB、Classic LB から選択
  • Auto Scaling Group で自動スケーリング

Worker 環境

  • SQS キューからメッセージをポーリング
  • POST / で メッセージ処理ロジック実行
  • 長時間バッチ処理・非同期ワーカーに適合

3. リソース設定

インスタンス仕様

  • インスタンスタイプ:t3.micro~c6i.2xlarge(用途に応じて選択)
  • 最小インスタンス:1~10
  • 最大インスタンス:2~100

オートスケーリング

  • トリガー:CPU 利用率・ネットワークトラフィック
  • スケールアップ閾値:デフォルト 70%
  • スケールダウン閾値:デフォルト 30%

4. デプロイ戦略

All at once

  • 全インスタンスを同時更新
  • ダウンタイム:あり
  • ロールバック:手動

Rolling

  • インスタンスの一部をバッチで段階的更新
  • ダウンタイム:なし(一部リソース削減)
  • 更新中も一部インスタンスが稼働

Rolling with additional batch

  • 一時的に追加インスタンスを起動して更新
  • ダウンタイム:なし
  • コスト:中(一時的に 2 倍リソース)

Immutable

  • 新環境を完全にプロビジョニング、正常確認後トラフィック切り替え
  • ダウンタイム:なし
  • ロールバック:即座(古い環境のままで待機)

Blue-Green(Canary)

  • Traffic splitting で新環境に徐々にトラフィック流す
  • ダウンタイム:なし
  • 問題検知時は即座に旧環境にロールバック

アーキテクチャ

graph TD
    A["開発者"]
    B["eb deploy<br/>ZIP / WAR / Docker"]
    
    subgraph EB["Elastic Beanstalk"]
        C["Application"]
        D["Environment<br/>Web Server / Worker"]
        E["Platform<br/>Node.js / Python / Java / PHP / Go / .NET / Ruby / Docker"]
    end
    
    subgraph AWS_Resources["AWS Resources"]
        F["ALB<br/>Application Load Balancer"]
        G["Auto Scaling Group"]
        H["EC2 Instances<br/>AZ-a / AZ-b / AZ-c"]
        I["RDS<br/>Optional DB"]
        J["ElastiCache<br/>Optional Cache"]
        K["S3<br/>Application Versions"]
        L["CloudWatch<br/>Logs / Metrics"]
    end
    
    A -->|1. Code Upload| B
    B -->|2. Create / Update| C
    C -->|3. Environment Config| D
    D -->|4. Select Platform| E
    E -->|5. Provision| F
    F -->|6. Distribute Traffic| G
    G -->|7. Launch Instances| H
    H -->|8. Connect to| I
    H -->|9. Cache| J
    C -->|10. Store Versions| K
    H -->|11. Send Logs| L
    
    style A fill:#e6f3ff
    style EB fill:#fff0e6
    style AWS_Resources fill:#e6ffe6

コアコンポーネント

1. Application(アプリケーション)

Elastic Beanstalk 内の組織単位。複数の Environment を管理します。

  • 名前: my-web-app
  • 説明: Web Application を管理するコンテナ
  • 関連 Environment: production / staging / development

2. Environment(環境)

アプリケーションが実行されるリソース群。Web Server or Worker タイプ。

Web Server 環境の構成:

  • ALB / NLB
  • Auto Scaling Group
  • EC2 Instances (複数 AZ)
  • Security Groups

Worker 環境の構成:

  • SQS Queue
  • Worker Instances
  • Auto Scaling by Queue Depth

3. Platform(プラットフォーム)

Elastic Beanstalk が提供・管理するランタイム環境。

プラットフォーム 最新バージョン 用途
Node.js 22 LTS(2025年対応) JavaScript / Express
Python 3.12 Flask / Django / FastAPI
Java 17 / 21 LTS Spring Boot / Tomcat
PHP 8.3(2025年新規) Laravel / Symfony
Go 1.22 Go Web フレームワーク
.NET 8 LTS ASP.NET Core
Ruby 3.2 / 3.3 Rails / Sinatra
Docker 任意 カスタマイズが必要な場合

4. .ebextensions(拡張設定)

YAML ファイルでインフラをコード化。

# .ebextensions/01_packages.config
packages:
  yum:
    nginx: []
    gcc: []
    git: []

commands:
  01_create_dirs:
    command: "mkdir -p /var/log/app /var/cache/app"

option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"
    ProxyServer: nginx
  aws:elasticbeanstalk:environment:process:default:
    HealthyThreshold: 3
    UnhealthyThreshold: 2
    Timeout: 5
  aws:autoscaling:asg:
    RollingUpdateMinBatchSize: 1
    RollingUpdateMaxBatchSize: 2

Resources:
  MyCustomBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${AWS::StackName}-bucket"

5. Configuration Files(設定ファイル)

JSON 形式で環境設定をプロビジョニング・復元。

{
  "option_settings": [
    {
      "namespace": "aws:elasticbeanstalk:application:environment",
      "option_name": "DATABASE_URL",
      "value": "postgresql://user:pass@db.example.com:5432/app_db"
    },
    {
      "namespace": "aws:elasticbeanstalk:command",
      "option_name": "DeploymentPolicy",
      "value": "RollingWithAdditionalBatch"
    }
  ]
}

プラットフォームと対応言語

Node.js

対応バージョン: 18 LTS / 20 LTS / 22 LTS(2025年新規)

デプロイ例:

eb init -p "Node.js 22 running on 64bit Amazon Linux 2023" myapp
eb create production --instance-type t3.small
eb deploy

Python

対応バージョン: 3.9 / 3.10 / 3.11 / 3.12

デプロイ例:

eb init -p python-3.12 flask-app
eb create production
eb deploy

requirements.txt 管理: Elastic Beanstalk が自動的に pip install を実行

Java

対応フレームワーク: Tomcat / Corretto

デプロイ例:

eb init -p tomcat-11.0 spring-boot-app
mvn package -DskipTests
eb create production
eb deploy

PHP

対応バージョン: 7.4 / 8.0 / 8.1 / 8.2 / 8.3(2025年新規)

デプロイ例:

eb init -p php-8.3 laravel-app
eb create production --instance-type t3.micro
eb deploy

主要ユースケース

1. 既存 Java / Spring Boot アプリケーション

シナリオ

  • 企業内で稼働している Spring Boot アプリ
  • WAR ファイル形式でパッケージ化済み
  • RDS / MySQL バックエンド

実装方法

eb init -p tomcat-11.0 corporate-app --region ap-northeast-1
eb create production --instance-type t3.medium --envvars DB_HOST=mydb.c9akciq32.ap-northeast-1.rds.amazonaws.com,DB_USER=admin
eb deploy

2. Python Flask Web アプリケーション

シナリオ

  • Flask を使った REST API
  • PostgreSQL データベース
  • CloudWatch Logs で監視

実装方法

eb init -p python-3.12 flask-api --region ap-northeast-1
eb create production --instance-type t3.small
eb setenv production DATABASE_URL="postgresql://user:pass@rds-endpoint:5432/app"
eb deploy

3. Node.js / Express マイクロサービス

シナリオ

  • Express.js REST API
  • Redis キャッシング
  • Auto Scaling(CPU 70% でスケールアップ)

実装方法

eb init -p "Node.js 22 running on 64bit Amazon Linux 2023" express-api
eb create production --instance-type t3.micro --min-instances 2 --max-instances 10
eb deploy

4. Docker マルチコンテナアプリケーション

シナリオ

  • Frontend(Nginx)+ Backend(Node.js)+ Cache(Redis)
  • Dockerrun.aws.json で構成定義

実装方法

eb init -p docker my-multicontainer-app
eb create production
eb deploy

5. Worker 環境での非同期処理

シナリオ

  • SQS キューからメッセージを取得
  • 画像処理・バッチジョブ実行
  • Worker Auto Scaling

実装方法

eb create worker-env --tier Worker --instance-type t3.small --envvars QUEUE_URL=https://sqs.ap-northeast-1.amazonaws.com/123456789012/myqueue
eb deploy

6. Blue-Green デプロイでゼロダウンタイム更新

シナリオ

  • 本番環境でダウンタイムなしのリリース
  • 旧環境保持で即座ロールバック可能

実装方法

# Blue 環境(現在の本番)
eb create blue-prod --instance-type t3.medium

# Green 環境(新バージョン)
eb create green-prod --instance-type t3.medium
# ...アプリをデプロイ・テスト...

# CNAME スワップで切り替え
aws elasticbeanstalk swap-environment-cnames \
  --source-environment-id blue-prod \
  --destination-environment-id green-prod

設定・操作の具体例

CLI 例 1:Node.js アプリケーションの初期化とデプロイ

# アプリケーション初期化
eb init -p "Node.js 22 running on 64bit Amazon Linux 2023" \
  --region ap-northeast-1 \
  myapp

# package.json で "start" スクリプト定義
# { "scripts": { "start": "node server.js" } }

# 環境の作成(Web Server タイプ)
eb create production \
  --instance-type t3.small \
  --min-instances 1 \
  --max-instances 5 \
  --elb-type application \
  --envvars LOG_LEVEL=info,NODE_ENV=production

# アプリケーションのデプロイ
eb deploy production

# 環境の状態確認
eb status production

# ログの確認
eb logs production

# SSH で インスタンスに接続
eb ssh production -i ~/.ssh/my-key.pem

CLI 例 2:.ebextensions でカスタマイズ

# ディレクトリ構造
.
├── .ebextensions
│   ├── 01_packages.config
│   ├── 02_environment.config
│   └── 03_commands.config
├── package.json
├── server.js
└── .ebignore

.ebextensions/01_packages.config

packages:
  yum:
    nginx: []
    httpd-tools: []

commands:
  01_test_connectivity:
    command: "curl -I https://www.google.com"
    ignoreErrors: true

.ebextensions/02_environment.config

option_settings:
  aws:elasticbeanstalk:application:environment:
    APP_ENV: production
    CACHE_TTL: "3600"
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"
    ProxyServer: nginx
  aws:elasticbeanstalk:cloudwatch:logs:
    StreamLogs: true
    DeleteOnTerminate: false
    RetentionInDays: 30
  aws:autoscaling:updatepolicy:rollingupdate:
    RollingUpdateEnabled: true
    MaxBatchSize: 2
    MinInstancesInService: 1
    RollingUpdateType: Health
    Timeout: PT30M

.ebextensions/03_commands.config

commands:
  01_npm_build:
    command: "npm ci && npm run build"
    leader_only: true
  02_migrate_db:
    command: "npm run migrate"
    leader_only: true
    ignoreErrors: true

デプロイ実行:

eb deploy production
# .ebextensions が自動的に適用される

CLI 例 3:環境変数とシークレット管理

# 環境変数(平文)の設定
eb setenv production \
  NODE_ENV=production \
  LOG_LEVEL=info \
  API_TIMEOUT=30

# Secrets Manager から環境変数を取得
# オプション設定で Secrets Manager の ARN を指定
eb config production
# ↓ 編集モード
# option_settings:
#   aws:elasticbeanstalk:application:environment:
#     DATABASE_URL: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:db-prod

eb deploy production

CLI 例 4:Saved Configuration でデプロイ設定の保存・復元

# 現在の環境設定を保存
eb config production --download
# → ebextensions/saved_configs/production.cfg.yml が生成

# ステージング環境に同じ設定で反映
eb create staging --cfg saved_configs/production.cfg.yml

# または既存環境に反映
eb config staging --upload saved_configs/production.cfg.yml

CLI 例 5:デプロイ戦略の変更

# 現在のデプロイポリシーを確認
eb config production | grep DeploymentPolicy

# Immutable デプロイに変更
eb config production
# namespace: aws:elasticbeanstalk:command
# option_name: DeploymentPolicy
# value: Immutable

# Blue-Green Canary デプロイ
eb config production
# TrafficWeight: 10
# HealthyPercentage: 75

CLI 例 6:Auto Scaling 設定の変更

# CPU 使用率ベースのスケーリング
eb config production
# option_settings:
#   aws:autoscaling:trigger:
#     MeasureName: CPUUtilization
#     Statistic: Average
#     Unit: Percent
#     UpperThreshold: 70
#     LowerThreshold: 30
#     UpperBreachScaleIncrement: 2
#     LowerBreachScaleIncrement: -1

SDK 例(Python)

import boto3

eb_client = boto3.client('elasticbeanstalk', region_name='ap-northeast-1')

# 環境作成
response = eb_client.create_environment(
    ApplicationName='my-app',
    EnvironmentName='production',
    PlatformArn='arn:aws:elasticbeanstalk:ap-northeast-1::platform/Node.js 22 running on 64bit Amazon Linux 2023/5.x',
    OptionSettings=[
        {
            'Namespace': 'aws:autoscaling:launchconfiguration',
            'OptionName': 'InstanceType',
            'Value': 't3.small'
        },
        {
            'Namespace': 'aws:elasticbeanstalk:application:environment',
            'OptionName': 'NODE_ENV',
            'Value': 'production'
        }
    ]
)

print(f"Created environment: {response['Environment']['EnvironmentName']}")
print(f"CNAME: {response['Environment']['CNAME']}")

# アプリケーションバージョンの作成
app_version = eb_client.create_application_version(
    ApplicationName='my-app',
    VersionLabel='v1.2.3',
    SourceBundle={
        'S3Bucket': 'my-app-versions',
        'S3Key': 'app-v1.2.3.zip'
    }
)

# デプロイ
deployment = eb_client.update_environment(
    EnvironmentName='production',
    VersionLabel='v1.2.3'
)

print(f"Deployment Status: {deployment['Status']}")

IaC 例(CloudFormation)

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Elastic Beanstalk Application'

Resources:
  MyApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      ApplicationName: my-node-app
      Description: My Node.js Application

  MyEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName: !Ref MyApplication
      EnvironmentName: production
      PlatformArn: !Sub 'arn:aws:elasticbeanstalk:${AWS::Region}::platform/Node.js 22 running on 64bit Amazon Linux 2023/5.x'
      OptionSettings:
        - Namespace: 'aws:autoscaling:launchconfiguration'
          OptionName: 'InstanceType'
          Value: 't3.small'
        - Namespace: 'aws:autoscaling:asg'
          OptionName: 'MinSize'
          Value: '1'
        - Namespace: 'aws:autoscaling:asg'
          OptionName: 'MaxSize'
          Value: '5'
        - Namespace: 'aws:elasticbeanstalk:environment'
          OptionName: 'DeploymentPolicy'
          Value: 'RollingWithAdditionalBatch'
        - Namespace: 'aws:elasticbeanstalk:application:environment'
          OptionName: 'NODE_ENV'
          Value: 'production'
      VersionLabel: 'v1.0.0'

  MyApplicationVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName: !Ref MyApplication
      VersionLabel: 'v1.0.0'
      SourceBundle:
        S3Bucket: 'my-app-bucket'
        S3Key: 'app-v1.0.0.zip'

Outputs:
  EnvironmentURL:
    Value: !Sub 'http://${MyEnvironment.EndpointURL}'
    Description: Elastic Beanstalk Environment URL

IaC 例(Terraform)

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_elastic_beanstalk_app" "myapp" {
  name            = "my-nodejs-app"
  description     = "My Node.js Application"
}

resource "aws_elastic_beanstalk_environment" "production" {
  name                = "production"
  application         = aws_elastic_beanstalk_app.myapp.name
  platform_arn        = "arn:aws:elasticbeanstalk:ap-northeast-1::platform/Node.js 22 running on 64bit Amazon Linux 2023/5.x"
  solution_stack_name = null
  tier                = "WebServer"
  wait_for_ready_timeout = "20m"

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name      = "InstanceType"
    value     = "t3.small"
  }

  setting {
    namespace = "aws:autoscaling:asg"
    name      = "MinSize"
    value     = "1"
  }

  setting {
    namespace = "aws:autoscaling:asg"
    name      = "MaxSize"
    value     = "5"
  }

  setting {
    namespace = "aws:elasticbeanstalk:environment"
    name      = "DeploymentPolicy"
    value     = "RollingWithAdditionalBatch"
  }

  setting {
    namespace = "aws:elasticbeanstalk:application:environment"
    name      = "NODE_ENV"
    value     = "production"
  }
}

resource "aws_elastic_beanstalk_application_version" "app_version" {
  name        = "v1.0.0"
  application = aws_elastic_beanstalk_app.myapp.name
  bucket      = aws_s3_bucket.app_bucket.id
  key         = aws_s3_object.app_zip.key
}

output "environment_endpoint" {
  value       = aws_elastic_beanstalk_environment.production.endpoint_url
  description = "Elastic Beanstalk Environment Endpoint"
}

類似サービス比較表

観点 Elastic Beanstalk App Runner(2026年新規終了) ECS Fargate Heroku Render
抽象化レベル 中(言語・フレームワーク) 高(HTTP API) 低(完全制御) 最高(Git push) 高(シンプル)
セットアップ時間 15 分 5 分 1 時間 5 分 10 分
既存アプリの運用 最適 非対応 要リパッケージ化 中程度 中程度
インフラ管理 最小(.ebextensions) なし 高(Task Definition) なし なし
EC2 SSH アクセス 可能 なし なし(Fargate) 限定 限定
デプロイ戦略 Rolling / Immutable / Blue-Green Canary / Traffic Split 高度な制御 Simple Advanced
スケール範囲 1-数百インスタンス 1-100 無制限 自動 自動
料金モデル 従量課金(EC2 + ALB) 従量課金(時間 + メモリ) 従量課金(CPU + メモリ) $7/月~ $7/月~
言語・フレームワーク 7 言語対応 コンテナ全般 コンテナ全般 Node / Python / Ruby / Java 全言語(Dockerfile)
推奨ユースケース 既存アプリ・中規模 MVP / スタートアップ エンタープライズ・複雑構成 PaaS 習熟者 PaaS 習熟者

ベストプラクティス

チェックリスト(優先順)

✅ 推奨事項

  • [ ] .ebextensions でインフラをコード化 → environment.config で option_settings 定義、Git 管理
  • [ ] デプロイポリシーは RollingWithAdditionalBatch → 本番環境でダウンタイムなし
  • [ ] 環境変数は Secrets Manager で管理 → 平文を避ける、GitHub Secrets 連携
  • [ ] RDS は環境に含めず独立 → 環境削除でデータ損失防止
  • [ ] Blue-Green デプロイで本番更新 → 旧環境保持、即座ロールバック可能
  • [ ] CloudWatch アラームで自動ロールバック → 異常検知で前バージョンに復元
  • [ ] Saved Configurations で環境複製 → 本番設定を ステージング・開発に適用
  • [ ] ヘルスチェックエンドポイント実装 → /health で 200 OK 返却
  • [ ] Enhanced Health Reporting を有効化 → インスタンス・環境の詳細監視
  • [ ] ACM 証明書を使用して HTTPS → カスタムドメイン + HTTPS 自動更新

❌ アンチパターン

アンチパターン 問題 代替
Platform Version を固定しない セキュリティパッチが自動適用されず脆弱性リスク Platform Version を定期的に更新
環境変数に直接シークレット記載 コンソール・ログに露出、セキュリティリスク Secrets Manager + option_settings
RDS を環境に含める 環境削除で誤ってデータベース削除 RDS を独立リソース化
All at once デプロイで本番更新 ダウンタイム発生、顧客に影響 Rolling / Immutable / Blue-Green を使用
.ebextensions なしのカスタマイズ 環境削除で設定消失、複製不可 .ebextensions で設定をコード化
ヘルスチェック未実装 異常サーバーが削除されず、リクエスト失敗 /health で 200 OK を確実に返す
インスタンス SSH 直接操作 設定がコード外で管理、環境複製失敗 全ての設定を .ebextensions に移動

トラブルシューティング

症状 原因 解決策
「環境が Terminated 状態で復旧不可」 Unknown エラー、CloudFormation スタック削除失敗 AWS サポートに連絡、環境ログから原因特定
「デプロイ後、アプリが起動しない」 Platform コマンド実行エラー、アプリケーション起動コマンド不正 eb logs で詳細確認、platform.log / eb-activity.log を検査
「Auto Scaling が反応しない」 スケーリングポリシー設定不足、CPU 利用率計測できていない CloudWatch Metrics で CPU 値確認、スケーリング規則再設定
「Blue-Green CNAME スワップが遅い」 DNS TTL が長い(デフォルト 60秒) 待機、または DNS TTL を短縮
「RDS 接続タイムアウト」 セキュリティグループでポート 3306 / 5432 ブロック、ネットワークルート不正 RDS SG で EC2 SG からのインバウンド許可確認
「ヘルスチェック失敗で常にインスタンス再起動 ヘルスチェック URL が 200 OK 返さない、レスポンスが遅い /health エンドポイント実装確認、タイムアウト延長
「環境変数が反映されていない」 eb setenv 後に eb deploy していない、.ebextensions で上書き eb deploy 実行、.ebextensions での option_settings 確認
「ディスク容量不足(No space left)」 ログ / キャッシュが蓄積 CloudWatch Logs で自動削除設定、インスタンスストレージ確認
「Git リポジトリから eb deploy がエラー .git ディレクトリ巨大、eb init で正しく初期化されていない eb init --force で再初期化、.gitignore で node_modules 等除外

2025-2026 最新動向

2025年1月:Spot Allocation Strategies

アップデート内容

Elastic Beanstalk が環境作成時に Spot Allocation Strategies を選択できるようになりました。

  • Spot Only: すべて Spot インスタンス(~70% コスト削減)
  • On-Demand Only: 安定性優先
  • Capacity Optimized: Spot と On-Demand の最適ミックス

用途

Green 環境(テスト用)で Spot インスタンスを使用、コスト最適化。

eb create green-env \
  --instance-type t3.small \
  --spot-fleet-config "AllocationStrategy=capacity-optimized" \
  --min-instances 1 \
  --max-instances 5

2025年4月:PHP 8.3 Platform リリース

新機能

  • PHP 8.3 正式対応
  • Performance 向上(JIT コンパイラ最適化)
  • セキュリティパッチ最新版

デプロイ例

eb init -p "PHP 8.3 running on 64bit Amazon Linux 2023" laravel-app
eb create production
eb deploy

2025年5月:Node.js 22 LTS Platform リリース

対応バージョン

  • Node.js 22 LTS(April 2025 リリース)
  • Node.js 20 LTS(継続サポート)
  • Node.js 18(セキュリティアップデートのみ)

2026年3月:Blue-Green Canary デプロイ強化

新機能

  • Traffic splitting を自動化(10% / 50% / 100%)
  • CloudWatch Alarms による自動ロールバック
  • Session 固定(sticky sessions)対応

Secrets Manager / SSM Parameter Store 統合

環境変数の安全な管理

# .ebextensions/secrets.config
option_settings:
  aws:elasticbeanstalk:application:environment:
    # ARN で Secrets Manager 参照
    DATABASE_URL: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:db-prod-url
    API_KEY: arn:aws:ssm:ap-northeast-1:123456789012:parameter/api-key

Elastic Beanstalk が自動的に Secrets Manager / Parameter Store から値を取得。


学習リソース・参考文献

公式ドキュメント

  1. AWS Elastic Beanstalk Developer Guide

  2. Elastic Beanstalk API Reference

  3. EB CLI 3 リファレンス

  4. Blue-Green Deployments Whitepaper

  5. AWS Well-Architected Framework

AWS ブログ・サンプルコード

  1. AWS Containers Blog - Elastic Beanstalk Articles

    • Platform updates・ベストプラクティス記事
  2. AWS Samples on GitHub

    • elasticbeanstalk サンプルコード集

OSS / サードパーティリソース

  1. Awesome Elastic Beanstalk(GitHub)

    • コミュニティ製サンプル・ツール・デプロイスクリプト
  2. CloudFormation Modules - Elastic Beanstalk

    • IaC テンプレート再利用ライブラリ

ベンダー・学習プラットフォーム

  1. Pluralsight:AWS Elastic Beanstalk パス

    • 初級~上級の段階的学習
  2. A Cloud Guru:Elastic Beanstalk ハンズオン

    • 実践的な演習・デプロイ経験

ベストプラクティス・設計パターン

  1. Medium:Elastic Beanstalk ベストプラクティスシリーズ

    • .ebextensions 設計・デプロイ戦略
  2. Dev.to:AWS Elastic Beanstalk チュートリアル

    • 初心者向けステップバイステップガイド

実装例

例 1:Python Flask アプリケーション(GitHub 連携)

リポジトリ構成

my-flask-api/
├── .ebextensions
│   ├── 01_packages.config
│   └── 02_environment.config
├── .ebignore
├── app.py
├── requirements.txt
├── wsgi.py
└── Procfile

app.py

from flask import Flask, jsonify
import os

app = Flask(__name__)

@app.route('/health', methods=['GET'])
def health():
    return jsonify({'status': 'healthy'}), 200

@app.route('/api/users', methods=['GET'])
def get_users():
    db_url = os.getenv('DATABASE_URL', 'sqlite:///app.db')
    return jsonify([
        {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'},
        {'id': 2, 'name': 'Bob', 'email': 'bob@example.com'}
    ]), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=False)

requirements.txt

  • Flask==3.0.0
  • Gunicorn==21.2.0
  • psycopg2-binary==2.9.9
  • requests==2.31.0

.ebextensions/01_packages.config

packages:
  yum:
    postgresql15-devel: []
    gcc: []

.ebextensions/02_environment.config

option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: wsgi:app
    NumProcesses: 4
    NumThreads: 15
  aws:elasticbeanstalk:application:environment:
    FLASK_ENV: production
    LOG_LEVEL: info
  aws:elasticbeanstalk:cloudwatch:logs:
    StreamLogs: true
    DeleteOnTerminate: false
    RetentionInDays: 7

Procfile

  • web: gunicorn --workers 4 --threads 15 --worker-class gthread app:app

デプロイ

eb init -p python-3.12 my-flask-api --region ap-northeast-1
eb create production --instance-type t3.small
eb setenv production DATABASE_URL="postgresql://user:pass@rds-endpoint:5432/app"
eb deploy

例 2:Node.js Express API(Docker マルチコンテナ)

Dockerrun.aws.json

{
  "AWSEBDockerrunVersion": 2,
  "containerDefinitions": [
    {
      "name": "api",
      "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-api:latest",
      "essential": true,
      "memory": 512,
      "portMappings": [
        {
          "hostPort": 3000,
          "containerPort": 3000,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "NODE_ENV",
          "value": "production"
        }
      ],
      "links": ["cache"],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/aws/elasticbeanstalk/api",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "web"
        }
      }
    },
    {
      "name": "cache",
      "image": "redis:7-alpine",
      "essential": false,
      "memory": 256,
      "portMappings": [
        {
          "hostPort": 6379,
          "containerPort": 6379
        }
      ]
    }
  ]
}

デプロイ

eb init -p docker my-multicontainer-api --region ap-northeast-1
eb create production --instance-type t3.small
eb deploy

例 3:Blue-Green デプロイの自動化(Lambda 使用)

Lambda 関数:auto-bluegreen-deploy.py

import boto3
import time

eb_client = boto3.client('elasticbeanstalk', region_name='ap-northeast-1')

def lambda_handler(event, context):
    app_name = 'my-app'
    blue_env = 'production-blue'
    green_env = 'production-green'
    
    # 現在のバージョンを取得
    blue_response = eb_client.describe_environments(
        ApplicationName=app_name,
        EnvironmentNames=[blue_env]
    )
    current_version = blue_response['Environments'][0]['VersionLabel']
    
    # Green 環境に新バージョンをデプロイ
    new_version = event.get('version_label', 'v1.0.0')
    
    eb_client.update_environment(
        ApplicationName=app_name,
        EnvironmentName=green_env,
        VersionLabel=new_version
    )
    
    # デプロイ完了待機(最大 30 分)
    max_attempts = 60
    for attempt in range(max_attempts):
        green_response = eb_client.describe_environments(
            ApplicationName=app_name,
            EnvironmentNames=[green_env]
        )
        status = green_response['Environments'][0]['Status']
        
        if status == 'Ready':
            break
        
        time.sleep(30)
    
    # CNAME スワップ(Blue ← → Green)
    eb_client.swap_environment_cnames(
        SourceEnvironmentName=blue_env,
        DestinationEnvironmentName=green_env
    )
    
    return {
        'statusCode': 200,
        'body': f'Swapped {blue_env} ← → {green_env}'
    }

チェックリスト

デプロイ前

  • [ ] .ebextensions でインフラ設定をコード化
  • [ ] requirements.txt / package.json / pom.xml で依存関係定義
  • [ ] ヘルスチェックエンドポイント(/health)実装
  • [ ] 環境変数設定は Secrets Manager で管理
  • [ ] RDS / ElastiCache が別リソースとして存在することを確認
  • [ ] IAM ロールに必要な権限(RDS / S3 アクセス)があることを確認

デプロイ後

  • [ ] eb status で環境が Ready 状態であることを確認
  • [ ] eb open でアプリケーションにアクセス、動作確認
  • [ ] /health エンドポイントで 200 OK を確認
  • [ ] CloudWatch Logs で application logs を確認
  • [ ] Auto Scaling グループの最小・最大インスタンス数を確認
  • [ ] CloudWatch Alarms でメトリクス監視を設定
  • [ ] Saved Configuration を保存(環境復元用)

運用時

  • [ ] 月 1 回 Platform Version を最新に更新
  • [ ] 週 1 回 CloudWatch Metrics を確認
  • [ ] 定期的に Blue-Green デプロイでリリース
  • [ ] ログ保持期限を設定(デフォルト 7 日)
  • [ ] セキュリティパッチが自動適用されていることを確認

まとめ

AWS Elastic Beanstalk は 「既存 Web アプリケーション(Java / Python / Node.js / PHP)をクラウドに簡単にデプロイし、自動スケーリング・ロードバランシング・デプロイ戦略を完全マネージド化するサービス」 です。

Elastic Beanstalk が向いている場合

  • 既存 Java Spring Boot / Python Flask アプリの継続運用
  • インフラ管理を最小化したい開発チーム
  • 中規模 Web アプリケーション(数千~数万 RPS)
  • Blue-Green デプロイでゼロダウンタイムリリースが必要

現在の推奨

  • 新規 HTTP API: App Runner(シンプル)または ECS Fargate(制御性)を検討
  • 既存アプリ運用: Elastic Beanstalk が最適
  • エンタープライズ・複雑構成: ECS Fargate + CloudFormation

.ebextensions でインフラをコード化し、デプロイポリシーを RollingWithAdditionalBatch に設定、環境変数を Secrets Manager で管理することで、安全で予測可能なデプロイメントを実現してください。


最終更新:2026-04-27 バージョン:v2.0