「EC2のインフラ管理に時間を取られすぎている」——そんなSESエンジニアにとって、Elastic Beanstalkは最適な選択肢です。
AWS Elastic Beanstalkは、インフラの構築・管理を自動化しながら、アプリケーションのデプロイに集中できるPaaS(Platform as a Service)です。 本記事では、SES案件で求められるElastic Beanstalkのスキルを基礎から実践まで解説します。
この記事を3秒でまとめると
- Elastic BeanstalkはEC2・ALB・RDSなどのインフラを自動構築するAWSのPaaS
- Blue/Green デプロイ、Auto Scaling、ヘルスモニタリングを標準で提供
- SES案件ではWebアプリ・API開発の基盤として需要が高い
Elastic Beanstalkとは何か
PaaSとしての位置づけ
Elastic Beanstalk(EB)は、AWSが提供するPaaSです。EC2を直接管理する「IaaS」と、サーバーレスの「FaaS(Lambda)」の中間に位置します。
- IaaS(EC2直接管理): インフラの完全制御が可能だが、管理負荷が高い
- PaaS(Elastic Beanstalk): アプリのデプロイに集中でき、インフラは自動管理
- FaaS(Lambda): サーバー管理不要だが、実行時間やランタイムに制約がある
EBは「インフラの自動管理」と「カスタマイズ性」を両立しており、SES案件で最も採用されやすいデプロイ方式の一つです。
サポートされるプラットフォーム
Elastic Beanstalkは以下のプラットフォームをサポートしています。
| プラットフォーム | バージョン例 | 用途 |
|---|---|---|
| Node.js | 20, 22 | Web API、SSR |
| Python | 3.11, 3.12 | Django、FastAPI |
| Java | 17, 21 | Spring Boot |
| .NET | 8.0 | ASP.NET Core |
| Go | 1.21, 1.22 | REST API |
| PHP | 8.2, 8.3 | Laravel |
| Ruby | 3.2, 3.3 | Rails |
| Docker | マルチコンテナ対応 | 任意のランタイム |

環境構築のステップバイステップ
EB CLIのインストール
# EB CLIのインストール(pipx推奨)
pipx install awsebcli
# バージョン確認
eb --version
# AWS認証情報の確認
aws sts get-caller-identity
プロジェクトの初期化
# プロジェクトディレクトリで初期化
eb init
# 対話形式での設定
# 1. リージョン選択: ap-northeast-1(東京)
# 2. アプリケーション名: my-web-app
# 3. プラットフォーム: Node.js 20
# 4. CodeCommit連携: No
# 5. SSH: Yes(デバッグ用)
環境の作成
# 環境作成(Web Server環境)
eb create my-app-production \
--instance_type t3.small \
--region ap-northeast-1 \
--elb-type application \
--vpc.id vpc-xxxxxxxx \
--vpc.ec2subnets subnet-private-a,subnet-private-b \
--vpc.elbsubnets subnet-public-a,subnet-public-b \
--vpc.securitygroups sg-xxxxxxxx \
--database.engine postgres \
--database.instance db.t3.micro \
--database.size 20 \
--envvars NODE_ENV=production,PORT=8080
.ebextensions での環境カスタマイズ
.ebextensions ディレクトリに設定ファイルを配置することで、環境を細かくカスタマイズできます。
# .ebextensions/01-nginx.config
files:
"/etc/nginx/conf.d/proxy.conf":
mode: "000644"
owner: root
group: root
content: |
upstream nodejs {
server 127.0.0.1:8080;
keepalive 256;
}
server {
listen 80;
# ヘルスチェック用
location /health {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# gzip圧縮
gzip on;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript text/xml;
# セキュリティヘッダー
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://nodejs;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 静的ファイルのキャッシュ
location /static/ {
alias /var/app/current/public/;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
# .ebextensions/02-packages.config
packages:
yum:
postgresql-devel: []
commands:
01_timezone:
command: "ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime"
# .ebextensions/03-autoscaling.config
option_settings:
aws:autoscaling:asg:
MinSize: 2
MaxSize: 8
aws:autoscaling:trigger:
MeasureName: CPUUtilization
Statistic: Average
Unit: Percent
UpperThreshold: 70
LowerThreshold: 30
UpperBreachScaleIncrement: 2
LowerBreachScaleIncrement: -1
aws:elasticbeanstalk:environment:
ServiceRole: aws-elasticbeanstalk-service-role
aws:elasticbeanstalk:healthreporting:system:
SystemType: enhanced
デプロイ戦略
デプロイポリシーの選択
Elastic Beanstalkは複数のデプロイポリシーを提供しています。
| ポリシー | ダウンタイム | デプロイ速度 | ロールバック | 追加コスト |
|---|---|---|---|---|
| All at once | あり | 最速 | 手動再デプロイ | なし |
| Rolling | なし | 中速 | 手動再デプロイ | なし |
| Rolling with additional batch | なし | 中速 | 手動再デプロイ | 一時的 |
| Immutable | なし | 低速 | 自動(新インスタンス削除) | 一時的 |
| Blue/Green | なし | 中速 | DNS切替 | 常時2環境 |
Blue/Green デプロイの実装
本番環境では、ゼロダウンタイムのBlue/Greenデプロイが推奨です。
# 新しい環境(Green)の作成
eb create my-app-green \
--instance_type t3.small \
--cname my-app-green \
--envvars NODE_ENV=production
# Greenへのデプロイ
eb deploy my-app-green
# ヘルスチェックの確認
eb health my-app-green
# CNAMEスワップ(Blue → Green に切替)
eb swap my-app-production --destination_name my-app-green
# 旧環境(Blue)の削除(問題なければ)
eb terminate my-app-blue
Immutable デプロイの設定
# .ebextensions/04-deploy.config
option_settings:
aws:elasticbeanstalk:command:
DeploymentPolicy: Immutable
HealthCheckSuccessThreshold: Ok
IgnoreHealthCheck: false
Timeout: 600
aws:elasticbeanstalk:managedactions:
ManagedActionsEnabled: true
PreferredStartTime: "Tue:09:00"
aws:elasticbeanstalk:managedactions:platformupdate:
UpdateLevel: minor
InstanceRefreshEnabled: true
環境変数とシークレット管理
環境変数の設定
# 個別設定
eb setenv DATABASE_URL=postgresql://user:pass@host:5432/db
eb setenv REDIS_URL=redis://host:6379
eb setenv API_KEY=your-api-key
# 一括設定
eb setenv \
DATABASE_URL=postgresql://user:pass@host:5432/db \
REDIS_URL=redis://host:6379 \
NODE_ENV=production \
LOG_LEVEL=info
AWS Secrets Managerとの連携
機密情報はSecrets Managerで管理し、EBから安全にアクセスします。
# .ebextensions/05-secrets.config
files:
"/opt/elasticbeanstalk/hooks/appdeploy/pre/01_fetch_secrets.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
# Secrets Managerから環境変数を設定
SECRET=$(aws secretsmanager get-secret-value \
--secret-id my-app/production \
--query SecretString \
--output text \
--region ap-northeast-1)
# 環境変数ファイルに書き出し
echo "$SECRET" | jq -r 'to_entries[] | "\(.key)=\(.value)"' > /opt/elasticbeanstalk/deployment/env
AWS Secrets Managerガイドで、シークレット管理の詳細を解説しています。
モニタリングとアラート
Enhanced Health Reportingの活用
# .ebextensions/06-monitoring.config
option_settings:
aws:elasticbeanstalk:healthreporting:system:
SystemType: enhanced
aws:elasticbeanstalk:cloudwatch:logs:
StreamLogs: true
DeleteOnTerminate: false
RetentionInDays: 14
aws:elasticbeanstalk:cloudwatch:logs:health:
HealthStreamingEnabled: true
DeleteOnTerminate: false
RetentionInDays: 7
CloudWatchアラームの設定
Resources:
CPUAlarmHigh:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: "CPU使用率が80%を超えました"
MetricName: CPUUtilization
Namespace: AWS/EC2
Statistic: Average
Period: 300
EvaluationPeriods: 2
Threshold: 80
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !Ref NotificationTopic
HealthyHostAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: "正常なホスト数が閾値を下回りました"
MetricName: HealthyHostCount
Namespace: AWS/ApplicationELB
Statistic: Minimum
Period: 60
EvaluationPeriods: 2
Threshold: 1
ComparisonOperator: LessThanOrEqualToThreshold
AlarmActions:
- !Ref NotificationTopic
NotificationTopic:
Type: AWS::SNS::Topic
Properties:
Subscription:
- Endpoint: [email protected]
Protocol: email
ログの確認
# 最新ログの取得
eb logs
# 特定の環境のログ
eb logs --environment my-app-production
# リアルタイムログ(ストリーミング)
eb logs --stream
# CloudWatch Logsでの検索
aws logs filter-log-events \
--log-group-name /aws/elasticbeanstalk/my-app-production/var/log/web.stdout.log \
--filter-pattern "ERROR" \
--start-time $(date -v-1H +%s000)
AWS CloudWatchモニタリングガイドも参考にしてください。
パフォーマンスチューニング
インスタンスタイプの選定
SES案件でよく使われるインスタンスタイプの選定ガイドです。
| ユースケース | 推奨インスタンス | 理由 |
|---|---|---|
| 開発・ステージング | t3.small | コスト重視、バースト対応 |
| 小規模Webアプリ | t3.medium | バランス型 |
| API サーバー | c6g.large | CPU重視(Graviton) |
| メモリ集約型 | r6g.large | メモリ重視(キャッシュ多用) |
| 大規模本番 | c6g.xlarge | 高パフォーマンス |
Auto Scalingの最適化
# .ebextensions/07-autoscaling-advanced.config
option_settings:
aws:autoscaling:asg:
MinSize: 2
MaxSize: 10
Cooldown: 300
aws:autoscaling:trigger:
MeasureName: CPUUtilization
Statistic: Average
Unit: Percent
Period: 1
BreachDuration: 3
UpperThreshold: 70
UpperBreachScaleIncrement: 2
LowerThreshold: 30
LowerBreachScaleIncrement: -1
Resources:
AWSEBAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
HealthCheckType: ELB
HealthCheckGracePeriod: 300
# リクエスト数ベースのスケーリングポリシー
RequestCountScaleUp:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref AWSEBAutoScalingGroup
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ALBRequestCountPerTarget
ResourceLabel: !GetAtt AWSEBLoadBalancer.LoadBalancerFullName
TargetValue: 1000
CI/CDパイプラインの構築
GitHub Actionsとの連携
# .github/workflows/deploy.yml
name: Deploy to Elastic Beanstalk
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Generate deployment package
run: |
zip -r deploy.zip . \
-x "node_modules/*" \
-x ".git/*" \
-x "tests/*" \
-x ".github/*"
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v22
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: my-web-app
environment_name: my-app-production
version_label: ${{ github.sha }}
region: ap-northeast-1
deployment_package: deploy.zip
wait_for_environment_recovery: 120
AWS CodePipeline CI/CDガイドで、AWSネイティブのCI/CDパイプラインも解説しています。
トラブルシューティング
よくある問題と解決策
1. デプロイ失敗:ヘルスチェックタイムアウト
# ヘルスチェックの確認
eb health --refresh
# プロセスの確認
eb ssh
ps aux | grep node
curl -v http://localhost:8080/health
原因の多くは、アプリがヘルスチェックポートでリッスンしていないことです。Procfileで正しいポートを指定してください。
# Procfile
web: node dist/server.js
2. 環境変数が反映されない
# 現在の設定確認
eb printenv
# 設定の再適用
eb config --update
3. ストレージ不足
# .ebextensions/08-storage.config
option_settings:
aws:autoscaling:launchconfiguration:
RootVolumeType: gp3
RootVolumeSize: 30
RootVolumeIOPS: 3000
RootVolumeThroughput: 125
SES案件でのElastic Beanstalk活用
求められるスキルセット
SES案件でElastic Beanstalkを扱う場合、以下のスキルが求められます。
- 基本: EB CLIの操作、環境構築、デプロイ
- 中級: Blue/Greenデプロイ、Auto Scaling設定、.ebextensionsカスタマイズ
- 上級: Docker対応、マルチコンテナ、VPC設計、CI/CD構築
EB vs ECS vs EKS の選定基準
| 基準 | Elastic Beanstalk | ECS Fargate | EKS |
|---|---|---|---|
| 学習コスト | 低い | 中程度 | 高い |
| カスタマイズ性 | 中程度 | 高い | 非常に高い |
| 運用負荷 | 低い | 中程度 | 高い |
| スケーラビリティ | 中程度 | 高い | 非常に高い |
| 適するチーム規模 | 1〜10名 | 5〜50名 | 10名以上 |
| 月額コスト目安 | $50〜$500 | $100〜$1000 | $200〜$5000 |
AWS ECS Fargate ガイドやAWS EKS ガイドも参考にしてください。
まとめ:Elastic BeanstalkでSES案件の幅を広げる
Elastic Beanstalkは「インフラ管理の自動化」と「アプリケーション開発への集中」を両立するAWSのPaaSです。
- 簡単なデプロイ:
eb deploy一つで本番環境にデプロイ - 自動スケーリング: トラフィックに応じたインスタンス数の自動調整
- ゼロダウンタイム: Blue/Green デプロイとImmutableデプロイをサポート
- 充実したモニタリング: Enhanced Health Reporting と CloudWatch連携
SESエンジニアにとって、Elastic BeanstalkはAWS案件の入り口として最適なサービスです。EB での経験を基盤に、ECS/EKSなどのコンテナサービスへステップアップしていきましょう。
AWSシリーズの他の記事も読む
👉 AWS入門ガイド 👉 AWS ECS Fargate ガイド 👉 AWS CodePipeline CI/CDガイド 👉 SES BASEで案件を探す