目次
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 への統合
目次
- 概要
- Elastic Beanstalk が解決する課題
- 主な特徴
- アーキテクチャ
- コアコンポーネント
- プラットフォームと対応言語
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較表
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース・参考文献
- 実装例
- チェックリスト
- まとめ
概要
初心者向けメモ: 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 から値を取得。
学習リソース・参考文献
公式ドキュメント
-
AWS Elastic Beanstalk Developer Guide
-
Elastic Beanstalk API Reference
-
EB CLI 3 リファレンス
-
Blue-Green Deployments Whitepaper
-
AWS Well-Architected Framework
AWS ブログ・サンプルコード
-
AWS Containers Blog - Elastic Beanstalk Articles
- Platform updates・ベストプラクティス記事
-
AWS Samples on GitHub
- elasticbeanstalk サンプルコード集
OSS / サードパーティリソース
-
Awesome Elastic Beanstalk(GitHub)
- コミュニティ製サンプル・ツール・デプロイスクリプト
-
CloudFormation Modules - Elastic Beanstalk
- IaC テンプレート再利用ライブラリ
ベンダー・学習プラットフォーム
-
Pluralsight:AWS Elastic Beanstalk パス
- 初級~上級の段階的学習
-
A Cloud Guru:Elastic Beanstalk ハンズオン
- 実践的な演習・デプロイ経験
ベストプラクティス・設計パターン
-
Medium:Elastic Beanstalk ベストプラクティスシリーズ
- .ebextensions 設計・デプロイ戦略
-
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
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