目次
Amazon GameLift Servers v2.0 完全ガイド 2026
概要
Amazon GameLift Servers は、マルチプレイヤーゲームサーバーのデプロイ・スケーリング・マッチメイキングを統合管理するゲーム専用フルスタックサービスです。EC2・コンテナ・Anywhere(オンプレミス・他クラウド)で実行するゲームサーバーを、セッション管理・フリートオートスケール・FlexMatch マッチメイキング・スポットインスタンス活用により、低レイテンシで大規模マルチプレイヤー体験を実現します。2024-2026年の拡張により、Spot 統合、スケールトゥーゼロ、オンデマンド価格 9% 削減、グローバルマルチリージョン対応を実装。
解決する課題
ゲームサーバー基盤の複雑性排除
- EC2 でゲームサーバーを自前管理する場合、セッション管理・プレイヤー接続追跡・フリートスケーリング・プロセス再起動の実装が必須だが、GameLift は全てマネージド化
地理的遅延の最小化
- FlexMatch のレイテンシベースマッチングにより、プレイヤーが最も近いサーバーロケーションに自動配置されて 50ms 以下の低遅延を実現
動的スケーリング対応
- アクティブゲームセッション数に基づいてフリート容量を自動調整して、オンデマンド課金で無駄を排除
スポット活用による大幅コスト削減
- スポットインスタンスで 70-90% の実行コスト削減、セッション終了時は別インスタンスに自動移行
アーキテクチャ全体
ゲームクライアント層:
PC / Console (PlayStation/Xbox) / Mobile (iOS/Android)
├─ マッチメイキングリクエスト (プレイヤーメタデータ: スキル・レート・地域)
└─ GameLift バックエンド API
GameLift フロントエンド:
┌────────────────────────────────────────────────────────┐
│ FlexMatch Matchmaker │
│ ├─ Rule Engine (スキル等化・チーム構成・地理最適化) │
│ ├─ Ticket Queue (検索キューイング) │
│ ├─ Expansion Rules (タイムアウト時に条件緩和) │
│ └─ Backfill Mode (セッション途中の欠員補充) │
└────────────────────────────────────────────────────────┘
GameLift 管理平面:
┌────────────────────────────────────────────────────────┐
│ Fleet Management │
│ ├─ Fleet Types: EC2 / CONTAINER / ANYWHERE │
│ ├─ Locations: Multi-region (東京・シンガポール・米国西)│
│ ├─ Auto Scaling (Target: ActiveGameSessions) │
│ ├─ Health Check (Game Server SDK ハートビート) │
│ └─ Session Placement (ベストフィット配置アルゴ) │
└────────────────────────────────────────────────────────┘
ゲームサーバー実行層:
┌────────────────────────────────────────────────────────┐
│ Game Server Processes (EC2 Instance 上で複数プロセス) │
│ ├─ Instance: c6i.xlarge x 10 (フリート規模) │
│ ├─ Process 1: Game Session 1-10 (最大プレイヤー数) │
│ ├─ Process 2: Game Session 11-20 │
│ ├─ Process 3: Game Session 21-30 │
│ └─ Process N: Game Session N │
│ │
│ 各プロセスの責務: │
│ ├─ OnGameSessionCreated → ゲームロジック初期化 │
│ ├─ OnUpdateGameSession → リモートコマンド処理 │
│ ├─ Health Check Callback → 健全性報告 │
│ └─ OnProcessTerminate → クリーンアップ │
└────────────────────────────────────────────────────────┘
ネットワーク:
Game Server Port: UDP 7777-7788, TCP 7777-7780
CloudFront (optional): CDN 経由のリーダーボード・メタデータ配信
コアコンセプト詳細
1. Fleet(フリート)
フリートは、同一設定のゲームサーバープロセスを実行する EC2 インスタンスグループ。
# Fleet タイプの選択
# EC2 Fleet (推奨: 既存ゲームサーバーバイナリ対応)
aws gamelift create-fleet \
--fleet-type ON_DEMAND \
--ec2-instance-type c6i.xlarge \
--locations '{"Location": "ap-northeast-1"}' \
--runtime-configuration '{
"ServerProcesses": [{
"LaunchPath": "/local/game/server",
"Parameters": "-port 7777",
"ConcurrentExecutions": 5
}],
"MaxConcurrentGameSessionActivations": 10,
"GameSessionActivationTimeoutSeconds": 120
}'
# CONTAINER Fleet (Docker コンテナ: ECS オーケストレーション)
aws gamelift create-fleet \
--fleet-type ON_DEMAND \
--compute-type CONTAINER \
--container-group-definition-arn arn:aws:ec2:...
# → GameLift が ECS タスク管理を自動化
# ANYWHERE Fleet (オンプレミス・他クラウド: 固定コスト課金)
aws gamelift create-fleet \
--fleet-type ON_DEMAND \
--compute-type ANYWHERE \
--anywhere-configuration '{"Cost": 0}'
# → GameLift Anywhere Agent をオンプレミスで実行
2. Game Session(ゲームセッション)
1つのゲームマッチ = 1 Game Session。複数プレイヤーが同時参加する実行単位。
import boto3
gamelift = boto3.client('gamelift', region_name='ap-northeast-1')
# セッション作成(マッチメイキング完了後にバックエンドで実行)
response = gamelift.create_game_session(
FleetId='fleet-xxxxx',
MaximumPlayerSessionCount=10,
Name='Match-2026-01-15-001',
GameProperties=[
{'Key': 'GameMode', 'Value': 'TDM'},
{'Key': 'MapName', 'Value': 'Urban_Outpost'},
{'Key': 'Difficulty', 'Value': 'Hard'}
]
)
session = response['GameSession']
session_id = session['GameSessionId']
# プレイヤーセッション作成(各クライアントに接続URL+ポート情報を返す)
player_session = gamelift.create_player_session(
GameSessionId=session_id,
PlayerId='player-12345',
PlayerData=json.dumps({'Rank': 2500, 'Region': 'Tokyo'})
)
# クライアントに返す情報
player_session_id = player_session['PlayerSession']['PlayerSessionId']
ip_address = session['IpAddress']
port = session['Port']
# クライアントに通知
notify_client({
'server_ip': ip_address,
'server_port': port,
'player_session_id': player_session_id
})
# セッション終了
gamelift.terminate_game_session(GameSessionId=session_id)
3. FlexMatch マッチメイキング
スキル・ELO レート・地理的位置・チーム構成を考慮した自動マッチング。
{
"name": "RankedDuelMatchmaking",
"ruleLanguageVersion": "1.0",
"playerAttributes": [
{
"name": "skill_rating",
"type": "number",
"default": 1500
},
{
"name": "country",
"type": "string",
"default": "US"
}
],
"teams": [
{
"name": "Team_A",
"minPlayers": 1,
"maxPlayers": 1,
"quantity": 1
},
{
"name": "Team_B",
"minPlayers": 1,
"maxPlayers": 1,
"quantity": 1
}
],
"rules": [
{
"name": "BalancedTeams",
"type": "comparison",
"measurements": [
"avg(teams[*].players.attributes[skill_rating])"
],
"operation": "="
},
{
"name": "SkillProximity",
"type": "distanceRule",
"measurements": [
"avg(teams[*].players.attributes[skill_rating])"
],
"maxDistance": 300
},
{
"name": "RegionMatch",
"type": "comparison",
"measurements": [
"count(teams[Team_A].players.attributes[country])",
"count(teams[Team_B].players.attributes[country])"
],
"operation": "="
}
],
"expansions": [
{
"target": "rules[SkillProximity].maxDistance",
"steps": [
{"waitTimeSeconds": 10, "value": 500},
{"waitTimeSeconds": 20, "value": 1000},
{"waitTimeSeconds": 30, "value": 5000}
]
}
]
}
4. Game Server SDK 統合
ゲームサーバープロセスは GameLift Agent と通信してセッション管理。
// Unreal Engine 4/5 での統合例
#include "GameLiftServerSDK.h"
void FGameServer::Initialize()
{
// SDK 初期化(AWS IAM ロール自動使用)
Aws::GameLift::Server::InitSDK();
// コールバック登録
Aws::GameLift::Server::ProcessParameters parameters(
std::bind(&FGameServer::OnGameSessionStart, this, std::placeholders::_1),
std::bind(&FGameServer::OnGameSessionUpdate, this, std::placeholders::_1),
std::bind(&FGameServer::OnProcessTerminate, this),
std::bind(&FGameServer::OnHealthCheck, this),
7777, // Game Server port
{}
);
// GameLift に準備完了を報告
Aws::GameLift::Server::ProcessReady(parameters);
}
void FGameServer::OnGameSessionStart(
Aws::GameLift::Server::Model::GameSession gameSession)
{
// マッチメイキング完了 → セッション開始
std::string sessionId = gameSession.GetGameSessionId();
int maxPlayers = gameSession.GetMaximumPlayerSessionCount();
// ゲームロジック初期化
InitializeGameMatch(sessionId, maxPlayers);
// セッションをアクティベート(プレイヤー接続受け入れ開始)
Aws::GameLift::Server::ActivateGameSession();
}
void FGameServer::OnGameSessionUpdate(
Aws::GameLift::Server::Model::UpdateGameSession updateSession)
{
// リモートコマンド処理(例: マップ変更・パラメータ更新)
auto reason = updateSession.GetReason();
if (reason == "MATCHMAKING_DATA_UPDATED") {
// マッチメイキング情報の更新(例: プレイヤー追加)
RefreshPlayerData(updateSession.GetGameSessionData());
}
}
bool FGameServer::OnHealthCheck()
{
// GameLift エージェントの定期ヘルスチェック(15秒ごと)
// ゲームサーバーが正常に動作しているか報告
return (FPlatformTime::Seconds() - lastUpdateTime) < 30.0f;
}
void FGameServer::OnProcessTerminate()
{
// Fleet スケールダウン時の終了通知(5分間の Graceful Shutdown)
// セッション終了・プレイヤー切断・ネットワーククローズ
ShutdownAllSessions();
DisconnectAllPlayers();
Aws::GameLift::Server::ProcessEnding();
exit(0);
}
void FGameServer::ValidatePlayerSession(const FString& PlayerSessionId)
{
// クライアント接続時にプレイヤーセッション検証
auto outcome = Aws::GameLift::Server::AcceptPlayerSession(
std::string(TCHAR_TO_UTF8(*PlayerSessionId)));
if (!outcome.IsSuccess()) {
// 不正なセッション ID → 接続拒否
DisconnectPlayer(PlayerSessionId);
}
}
フリートのオートスケーリング設定
import boto3
gamelift = boto3.client('gamelift', region_name='ap-northeast-1')
# ターゲットトラッキングスケーリング(推奨: CloudWatch メトリクス不要)
gamelift.put_scaling_policy(
FleetId='fleet-xxxxx',
Name='scale-by-active-sessions',
PolicyType='TargetTrackingScaling',
TargetConfiguration={
'TargetValue': 70.0 # アクティブセッション 70% 目標
},
# Scaling metrics options
ComparisonOperator='GreaterThanOrEqualToThreshold',
EvaluationPeriods=2,
MetricAggregationType='Average'
)
# ルールベーススケーリング(手動でより細かく制御)
gamelift.put_scaling_policy(
FleetId='fleet-xxxxx',
Name='scale-up-fast',
PolicyType='RuleBased',
MetricName='ActiveGameSessions',
ComparisonOperator='GreaterThanThreshold',
Threshold=500,
ScalingAdjustmentType='PercentChangeInCapacity',
ScalingAdjustment=30, # 30% 増加
EvaluationPeriods=1,
CooldownMinutes=5
)
# スケールトゥーゼロ設定(2024 年以降: 完全にアイドル時に EC2 削減)
gamelift.put_scaling_policy(
FleetId='fleet-xxxxx',
Name='scale-to-zero-idle',
PolicyType='RuleBased',
MetricName='ActiveGameSessions',
ComparisonOperator='LessThanOrEqualToThreshold',
Threshold=0,
ScalingAdjustmentType='ExactCapacity',
ScalingAdjustment=0, # EC2 インスタンス数: 0
EvaluationPeriods=2,
CooldownMinutes=300 # 5 時間待機後にスケール
)
# リザベーション割引(年単位で 30-50% 割引)
ec2_fleet = ec2.Resource('ec2', region_name='ap-northeast-1')
reserved_instances = ec2_fleet.meta.client.describe_reserved_instances(
Filters=[
{'Name': 'instance-type', 'Values': ['c6i.xlarge']},
{'Name': 'scope', 'Values': ['Region']}
]
)
Spot インスタンス統合
Spot インスタンス活用で 70-90% のコスト削減(セッション中断時は自動フェイルオーバー)。
# Spot Fleet の作成
aws gamelift create-fleet \
--name production-spot-fleet \
--ec2-instance-type c6i.xlarge \
--fleet-type SPOT \
--locations '[{"Location": "ap-northeast-1"}]' \
--spot-price-strategy CAPACITY_OPTIMIZED \
--capacity-limiting-metric ActiveGameSessions \
--capacity-target-value 100
# Spot 中断時の自動リーバランス設定
aws gamelift put-scaling-policy \
--fleet-id fleet-spot-xxxxx \
--name spot-interruption-handler \
--policy-type RuleBased \
--metric-name AvailablePlayerSessions \
--comparison-operator LessThanThreshold \
--threshold 50 \
--scaling-adjustment 50 \
--scaling-adjustment-type PercentChangeInCapacity
# Spot インスタンス割り当て率の監視
aws cloudwatch get-metric-statistics \
--namespace AWS/GameLift \
--metric-name SpotRequestsFulfilled \
--dimensions Name=FleetId,Value=fleet-xxxxx \
--start-time 2026-01-01T00:00:00Z \
--end-time 2026-01-02T00:00:00Z \
--period 3600 \
--statistics Sum
GameLift Anywhere(オンプレミス対応)
自社データセンター・他クラウド(Azure・GCP)でゲームサーバーを実行しながら GameLift の管理機能を活用。
# オンプレミスの GameLift Agent をインストール(Linux/Windows)
curl https://releases.game-server-hosting.aws/amazon-gamelift-agent/releases/latest/amazon-gamelift-agent.tgz
# Agent 設定(認証情報)
cat > /etc/gamelift/agent.yaml << EOF
Credentials:
RoleArn: arn:aws:iam::123456789012:role/GameLiftAnywhereRole
AssumeRoleSessionDuration: 3600
ComputeName: onprem-server-001
ComputeLocation: tokyo-dc-01
LogParameters:
Level: INFO
Path: /var/log/gamelift-agent/
NetworkConfiguration:
PortRanges:
- FromPort: 7777
ToPort: 7788
Protocol: UDP
- FromPort: 7777
ToPort: 7780
Protocol: TCP
EOF
# Anywhere フリート作成(オンプレミスロケーション)
aws gamelift create-fleet \
--name on-premises-fleet \
--fleet-type ON_DEMAND \
--compute-type ANYWHERE \
--locations '[{"Location": "custom-tokyo-dc"}]' \
--anywhere-configuration '{"Cost": 0}'
# Anywhere コンピュート登録
aws gamelift register-compute \
--fleet-id fleet-anywhere-xxxxx \
--compute-name onprem-server-001 \
--certificate-path /etc/gamelift/server.crt
# オンプレミスサーバーでゲームサーバーを実行(GameLift Agent が管理)
systemctl start gamelift-agent
systemctl enable gamelift-agent
Queue(ゲームセッションキュー)
複数フリート・複数リージョンにまたがるマッチメイキング リクエストのルーティング。
# Queue 作成(優先度付きフリート配置)
aws gamelift create-game-session-queue \
--name main-queue \
--timeout-in-seconds 30 \
--priority-configuration '[
{"priority": 1, "destinationArn": "arn:aws:gamelift:ap-northeast-1:123456789012:fleet/fleet-tokyo"},
{"priority": 2, "destinationArn": "arn:aws:gamelift:ap-southeast-1:123456789012:fleet/fleet-singapore"},
{"priority": 3, "destinationArn": "arn:aws:gamelift:us-west-2:123456789012:fleet/fleet-california"}
]' \
--custom-event-data '{"Region": "APAC", "GameMode": "Ranked"}'
# マッチメイキング時に Queue を指定
aws gamelift start-matchmaking \
--ticket-id ticket-12345 \
--configuration-name ranked-match \
--players '[
{"PlayerId": "player-001", "Attributes": {"skill_rating": {"N": 2500}, "country": {"S": "JP"}}},
{"PlayerId": "player-002", "Attributes": {"skill_rating": {"N": 2480}, "country": {"S": "JP"}}}
]'
Alias(フリート抽象化)
フリート ID をクライアントに隠蔽して、バックエンドで透過的にフリート切り替え可能。
# Alias 作成(フリートのエイリアス)
aws gamelift create-alias \
--name production-alias \
--routing-strategy '{"Type": "SIMPLE", "FleetId": "fleet-xxxxx"}'
# Alias での参照(フリート ID が変わってもクライアント変更不要)
aws gamelift describe-alias \
--alias-id alias-xxxxxx
# Terminal Alias(廃止フリートへのリダイレクト)
aws gamelift update-alias \
--alias-id alias-xxxxxx \
--routing-strategy '{"Type": "TERMINAL", "Message": "This game version is no longer supported"}'
Real-time Servers
C++ コードなしで WebSocket ベースのマルチプレイヤーを実装(Node.js ランタイム)。
// GameLift Real-time Servers スクリプト
const kryo = require('@amazon-web-services-blox/gamelift-realtime-client-sdk');
const logger = console;
const onPlayerConnect = (session, connectMessage) => {
logger.log(`Player connected: ${connectMessage.opCode}`);
// クライアント接続イベント
const payload = connectMessage.getPayloadAsText();
session.setAttributes(connectMessage.peerId, {
playerName: payload.playerName,
team: payload.team
});
};
const onPlayerDisconnect = (session, peerId) => {
logger.log(`Player disconnected: ${peerId}`);
// クリーンアップ
};
const onMessage = (session, message) => {
// クライアントからのメッセージ受信
const opCode = message.opCode;
const payload = message.getPayloadAsText();
if (opCode === 1) {
// Movement 更新
session.sendMessage(message.peerId, {
opCode: 101,
data: {x: payload.x, y: payload.y, timestamp: Date.now()}
});
} else if (opCode === 2) {
// Shooting イベント
const otherPlayers = session.getAttributes();
// 他プレイヤーに自分の射撃を通知
session.broadcastMessage({
opCode: 102,
data: {shooter: message.peerId, targetPos: payload.target}
}, [message.peerId]);
}
};
module.exports = {onPlayerConnect, onPlayerDisconnect, onMessage};
料金体系(2026年時点)
| 項目 | 料金 | 備考 |
|---|---|---|
| EC2 インスタンス(フリート) | EC2 標準価格 | オンデマンド: 標準価格、Spot: 最大 90% 割引 |
| FlexMatch マッチメイキング | 無料(GameLift 統合) | 別途 MTurk/SageMaker 使用時のみ課金 |
| GameLift Anywhere | $1.50/リアルタイムサーバー時間 | オンプレミス・他クラウド実行時 |
| データ転送(フリート間) | AWS の通常データ転送料金 | リージョン内無料、リージョン間 $0.02/GB |
| Reserved Instance(年間) | EC2 定価の 30-50% 割引 | 1年・3年・全払い/時間払い |
| Realtime Servers | $0.0000141/秒/サーバープロセス | Node.js ランタイム |
比較: GameLift vs 競合サービス
| 観点 | GameLift | Unity Multiplay | Azure PlayFab | Edgegap |
|---|---|---|---|---|
| マッチメイキング | FlexMatch(完全統合) | 限定的 | PlayFab Party(別料金) | 外部統合必要 |
| フリート管理 | EC2/Container/Anywhere | Unity Cloud | Azure VM | Kubernetes |
| 地理的最適化 | レイテンシベース自動配置 | 手動設定 | リージョン選択 | 自動 CDN 最適化 |
| スポット対応 | ✓ 統合 | × | 限定的 | × |
| コスト削減 | 70-90%(Spot)、30-50%(RI) | 低価格 | Azure 価格設定 | 最低価格 |
| 学習曲線 | 中(SDK 統合) | 簡単 | 中(多機能) | 簡単 |
| 推奨ユースケース | AAA タイトル・大規模マッチ | インディー・中規模 | Microsoft エコ | 低コスト志向 |
ベストプラクティス
1. フリート設計
- 単一フリート・複数リージョン: 一貫した設定を複数リージョンに展開
- 専用フリート分離: ランク戦・カジュアル・新作テストを分離フリート化
- リザベーション契約: 基本負荷を Reserved Instance で確保、ピークを Spot で対応
2. マッチメイキング
- Expansion Rules: ウェイトタイムに応じて条件を段階的に緩和
- バックフィル: セッション途中の欠員補充で プレイヤー体験向上
- Latency-based routing: 地理的距離ベースで最適サーバー自動選択
3. モニタリング
- ActiveGameSessions: フリート使用率・スケーリング基準メトリクス
- PlayerConnectivity: プレイヤー接続エラー率・切断率監視
- SessionQueueDepth: マッチメイキング待機キューの深さを監視
4. Graceful Shutdown
- 5分間のシャットダウン期間: Fleet スケールダウン時に既存セッション完了を待機
- オンボード/オフボード: セッション中のプレイヤーを計画的に他インスタンスに移行
設計チェックリスト
- [ ] ゲームサーバーバイナリが GameLift SDK で SDK が正しく初期化されている
- [ ] マッチメイキングルール(PlayerAttributes・Teams・Rules・Expansions)が定義済み
- [ ] フリートスケーリングポリシーが設定済み(ターゲット値: 60-80%)
- [ ] CloudWatch でセッション数・レイテンシ・エラー率を監視中
- [ ] スポットインスタンス中断時の自動リーバランス機構が実装済み
- [ ] Anywhere フリート使用時は Agent ログ・証明書更新を自動化
- [ ] Queue で複数リージョンへの優先度付けが設定済み
- [ ] タイムアウト・キュー深さの上限閾値を定義済み
- [ ] DR: フリート丸ごと削除時のセッション移行戦略が決定済み
実装パターン: モバイル対戦ゲーム
要件: 1対1 デュエル・最大遅延 100ms・グローバル対応
# バックエンド統合フロー
class GameLiftMatchmaker:
def __init__(self):
self.gamelift = boto3.client('gamelift', region_name='ap-northeast-1')
self.matchmaking_config = 'ranked-duel-config'
def find_match(self, player_id: str, skill_rating: int, region: str):
# MatchMaking Ticket 作成
ticket = self.gamelift.start_matchmaking(
TicketId=f'ticket-{player_id}-{int(time.time())}',
ConfigurationName=self.matchmaking_config,
Players=[{
'PlayerId': player_id,
'Attributes': {
'skill_rating': {'N': str(skill_rating)},
'region': {'S': region}
}
}]
)
return ticket['MatchmakingTicket']['TicketId']
def get_match_status(self, ticket_id: str):
# マッチメイキング進行状況確認
ticket = self.gamelift.describe_matchmaking(TicketIds=[ticket_id])
if ticket['TicketList'][0]['Status'] == 'Matched':
game_session = ticket['TicketList'][0]['GameSessionConnectionInfo']
return {
'status': 'matched',
'server_ip': game_session['IpAddress'],
'port': game_session['Port'],
'session_id': game_session['GameSessionId']
}
elif ticket['TicketList'][0]['Status'] == 'Searching':
return {'status': 'searching', 'wait_ms': ...}
def create_player_session(self, session_id: str, player_id: str):
# プレイヤーセッション作成
response = self.gamelift.create_player_session(
GameSessionId=session_id,
PlayerId=player_id
)
return response['PlayerSession']['PlayerSessionId']
最新動向(2024-2026)
- スケールトゥーゼロ: アイドル完全削減で低トラフィック時コスト大幅削減
- コンテナ対応: ECS オーケストレーション統合で CI/CD パイプライン効率化
- Anywhere 拡大: オンプレミス・マルチクラウド対応で自由度向上
- リアルタイムサーバー: Node.js ランタイムで C++ コーディング不要化
- Spot 自動管理: セッション中断時の自動フェイルオーバー完全自動化
- グローバル拡張: 6 新リージョン追加(2026年初頭)
まとめ
Amazon GameLift Servers は 「ゲーム業界標準のマルチプレイヤーサーバー基盤」。FlexMatch マッチメイキング・マルチリージョン展開・スポット活用による大幅コスト削減を統合し、100ms 以下の低レイテンシでグローバルなマルチプレイヤー体験を実現する。
EC2 自前管理の複雑性を排除し、セッション管理・フリートスケーリング・プレイヤー接続の安全な処理をマネージド化。インディーゲームから AAA タイトルまで、スケーラブルなゲームサーバー基盤を数分で構築できる。