はじめに
ゲーム開発者のみなさま ! こんにちは、Game Solutions Architect の鷲見 啓志です。
この記事をご覧になられているあなたはきっとマルチプレイゲームの構築に興味があるのではないかと思います。突然ですが、そんなあなたに質問です。
オンラインマルチプレイゲームの構築方法どのようなものがあるでしょうか ? すこし頭に思い浮かべてみてください。おそらくは以下に挙げる 3 つの方式のどれかが思い浮かんだのではないかと思います。
Peer to Peer 型
プレイヤー同士が互いに接続し通信する方式Listen Server 型
プレイヤーの一人がホストとなって通信を仲介する方式専用ゲームサーバー型
専用のゲームサーバーを準備し、プレイヤーが用意されたサーバーに接続する方式
Peer to Peer 型や Listen Server 型の場合は、マルチプレイのための通信をプレイヤーのゲームクライアントが担うため、プレイヤーの通信環境などによっては安定してゲームをプレイすることができないといった事情があり、最近は専用ゲームサーバー型のマルチプレイゲームが注目を集めています。
そんな専用ゲームサーバー型のマルチプレイゲームを実現してくれる OSS のソフトウェアが「Agones」となります。Agones は Kubernetes ネイティブのオープンソースのゲームサーバーホスティングプラットフォームです。2018 年の 3 月に最初の v0.1 がリリースされたのち、現在もアップデートが定期的に行われており、2024 年 9 月 17 日現在では v1.43 がリリースされていいます。
Agones の特徴の一つは Kubernetes ネイティブであるということが挙げれらます。Kubernetes をベースに専用ゲームサーバーの構築を実現します。ゲームサーバーをコンテナ化して、Kubernetes 上でゲームサーバーを実行します。また、Kubernetes のリソース管理機能を活用して、専用ゲームサーバーの構築・デプロイ・スケーリングを実現します。
Kubernetes ネイティブということもあり、Kubernetes の利用が前提となりますが、幅広いツールやコミュニティなどのKubernetes のエコシステムをそのまま利用することができるというのも魅力の一つとなっています。
今回本記事では、この Agones について解説したのち、 Agones を Amazon EKS 上で動かすところまでご紹介してみたいと思います。

builders.flash メールメンバー登録
Agones のコンポーネントのご紹介
Agones を AWS 上で動かす前に、Agones の構成要素について、それぞれ簡単にご紹介しておこうと思います。
Agones の リソースの全体像を表した図がこちらとなります。それぞれの要素についてご紹介していきます。

GameServer
Fleet
Fleet は GameServer の集合で、GameServer をまとめて管理する役割を持ったリソースです。Fleet を利用することで、個々の GameServer ではなく、グループとして全体で管理し、スケーリング・デプロイ・リソースの割り当てといったタスクを効率的に行うことができます。
たとえば、replica というフィールドの数値を変更することで、Fleet 内の GameServer の数を調整し、スケーリングすることができます。

Fleet Autoscaler
その名の通り Fleet のオートスケーリングの制御する役割のリソースです。バッファとしてもつ Ready の GameServer の数もしくは割合を指定し、その数が維持されるよう GameServer をスケールしていきます。

Agones Allocator と GameServerAllocation
Agones allocator はクライアントからの要求を受け取り、適切な GameServer を割り当て、接続情報をクライアントに返す役割と持ったサービスです。割り当て時には GameServer Allocation というリソースを作成して割り当てを行います。
GameServer Allocation は、GameServer の集合から GameServer を割り当てるために使用されるリソースです。フィルター条件を定義することができ、定義した条件にマッチする GameServer を選択し、その詳細を返す役割を持っています。

Agones Controller / Agones Extensions / Agones Ping
Allocator 以外の ControlPlane の コンポーネントとしては Agones Controller / Agones Extensions / Agones Ping があります。
Agones Controller はGameServer リソースのライフサイクル全体を管理する役割を持ったサービスです。
Agones Extensions は WebHook と拡張 API を扱うサービスです。
Agones Ping は、HTTP と UDP の両方でレイテンシーの計測を行うことができるサービスです。
本記事ではあまり登場しませんが、Agones を支える大事な役割を持ったコンポーネントです。
Agones チュートリアル
それでは Agones を構成する各コンポーネントとその役割について理解することができたので、ここからはこの Agones を AWS 上で動かす方法をご紹介していきます。Agones は Kubernetes ネイティブのソフトウェアということで、AWS 上で構築する際には、Amazon EKS を利用することで簡単に専用ゲームサーバーを構築することができます。
この章を進めていくことで、以下のような構成で Agones を稼働させることができます。
それでは始めていきましょう。

1. EKS クラスターの作成
Agones を稼働させるための EKS クラスターを作成します。今回は Kubernetes のバージョンは「1.30」としていますが、適宜利用するバージョンに合わせて変更してください。 Agones のバージョンと対応する Kubernetes バージョンの状況についてはリンクを確認ください。 実行完了までは 20 - 30 分ほど時間がかかります。
eksctl create cluster --name bf-agones-cluster --version 1.30 \
--nodegroup-name standard-workers --node-type t3.medium \
--nodes 3 --nodes-min 3 --nodes-max 4
2. SecurityGroup の設定
Agones を稼働させるためには、EKS のワーカーノードに対して UDP トラフィックを許可するよう SecurityGroup の設定を以下の手順で行います。
AWS マネジメントコンソールにアクセスします。
VPC ダッシュボードに移動し、左のメニューから「セキュリティグループ」を選択します。
ワーカーノードプールのセキュリティグループを見つけます。名前は、「eks-cluster-sg-bf-agones-cluster-XXXXXXXXX」のようになります。
該当するセキュリティグループを選択して、「インバウンドルール」のタブを開き、「インバウンドのルールを編集」ボタンをクリックします。
「ルールを追加」ボタンをクリックして、以下の内容で入力して「ルールを保存」ボタンをクリックします。
タイプ : カスタム UDP
ポート範囲 : 7000 - 8000
ソース : Anywhere-IPv4
3. Agones のインストール
前の手順で作成した EKS クラスターに Agones をインストールします。 以下のコマンドを実行して、Agones をインストールします。今回は Agones のバージョンは「1.43.0」としていますが、適宜利用するバージョンに合わせて変更してください。 Agones のバージョンと対応する Kubernetes バージョンの状況についてはリンクを確認ください。
helm repo add agones https://agones.dev/chart/stable
helm repo update
helm install bf-release --namespace agones-system --create-namespace agones/agones --version 1.43.0
4. デプロイされた Agones の Control Plane の確認
Agones をインストールすると、Agones の Control Plane がデプロイされますので、デプロイされたコンポーネントを確認してみましょう。
kubectl get pods --namespace=agones-system
コマンド実行結果
コマンドを実行すると以下のような内容が表示されます。「Agones Allocator」「Agones Controller」「Agones Extentions」「Agones Ping」が稼働しているのが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)
NAME READY STATUS RESTARTS AGE
agones-allocator-7879fd785f-s6v94 1/1 Running 0 29s
agones-allocator-7879fd785f-sw8hb 1/1 Running 0 29s
agones-allocator-7879fd785f-xn6zj 1/1 Running 0 29s
agones-controller-d9895b5b8-64f6n 1/1 Running 0 28s
agones-controller-d9895b5b8-l4fqh 1/1 Running 0 28s
agones-extensions-6df8d6f9c7-mdcxv 1/1 Running 0 28s
agones-extensions-6df8d6f9c7-rhgpw 1/1 Running 0 28s
agones-ping-6598fb4d44-7rmac 1/1 Running 0 28s
agones-ping-6598fb4d44-5tavv 1/1 Running 0 28s
5. GameServer の作成
今回は Agones のサンプルとして準備されている Simple Game Server の Docker イメージ を利用します。コマンドを受け取った場合はコマンドを実行し、コマンド以外のテキストを受け取った場合は受け取ったテキストをそのまま返してくれると言ったシンプルな内容です。
5-1. GameServer のマニフェストファイルの作成
GameServer の作成にはマニフェストファイルを利用します。 以下のような内容の GameServer のマニフェストファイルを作成して、gameserver.yaml として保存します。今回は Simple Game Server のバージョンは「0.34」としていますが、適宜利用するバージョンに合わせて変更してください。 内容としてはイメージの指定とポートの指定をしているだけのシンプルな内容となっています。
apiVersion: agones.dev/v1
kind: GameServer
metadata:
generateName: bf-game-server-
spec:
ports:
- name: default
portPolicy: Dynamic
containerPort: 7654
template:
spec:
containers:
- name: bf-game-server
image: us-docker.pkg.dev/agones-images/examples/simple-game-server:0.34
imagePullPolicy: Always
resources:
requests:
cpu: 20m
5-2. GameServer のマニフェストファイルの適用
作成したマニフェストファイルを適用します。
kubectl create -f gameserver.yaml
GameServer の状況を確認
作成できたら「gameserver.agones.dev/bf-game-server-wp4wp created」といったメッセージが表示されます。 GameServer が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。
kubectl get gs
NAME STATE ADDRESS PORT NODE AGE
bf-game-server-wp4wp Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7254 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 24s
作成完了
GameServer が作成されているのが確認できます。(NAMEのランダム英数字の羅列の箇所は環境により変わります)
Ready になっていない場合は、しばらく待った後で再度上記コマンドを実行してください。
6. Fleet の作成
では次に Fleet を作成してみたいと思います。Fleet もマニフェストファイルを利用して作成します。
6-1. Fleet のマニフェストファイルの作成
以下のような内容の Fleet のマニフェストファイルを作成して、fleet.yaml として保存します。
apiVersion: agones.dev/v1
kind: Fleet
metadata:
name: bf-game-server
spec:
replicas: 3
template:
spec:
ports:
- name: default
containerPort: 7654
template:
spec:
containers:
- name: bf-game-server
image: us-docker.pkg.dev/agones-images/examples/simple-game-server:0.34
imagePullPolicy: Always
resources:
requests:
cpu: 20m
memory: 64Mi
6-2. Fleet のマニフェストファイルの適用
作成したマニフェストファイルを適用します。
kubectl create -f fleet.yaml
GameServer の状況を確認
作成できたら「fleet.agones.dev/bf-game-server created」といったメッセージが表示されます。 Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。
kubectl get gs
NAME STATE ADDRESS PORT NODE AGE
bf-game-server-wp4wp Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7254 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 30m
bf-game-server-x4qrk-b2m2h Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7130 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 24s
bf-game-server-x4qrk-lg8d6 Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7344 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 24s
bf-game-server-x4qrk-pp2jg Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7208 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 24s
Fleet の情報確認
先ほど作成した GameServer に加えて、新たな GameServer が 3 つ作成されているのがわかります。(NAME のランダム英数字の羅列の箇所は環境により変わります) Fleet の情報も確認してみましょう。 bf-game-server という Fleet が作成されていて、現在の状況を確認することができます。
kubectl get fleet
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
bf-game-server Packed 3 3 0 3 4m13s
6-3. Fleet の操作
では、ここで Fleet の replica 数を変更してみましょう。レプリカ数を倍の 6 に設定してみます。
kubectl scale fleet bf-game-server --replicas=6
Fleet の情報を確認
Fleet の情報を確認してみます。 Desired (必要数) が 6 になっているのを確認できます。
kubectl get fleet
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
bf-game-server Packed 6 6 0 6 9m13s
GameServer の状況を確認
GameServer の状況も確認してみます。 Fleet の GameServer が新たに 3 つ作成されていることが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)。
kubectl get gs
NAME STATE ADDRESS PORT NODE AGE
bf-game-server-wp4wp Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7254 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 41m
bf-game-server-x4qrk-b2m2h Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7130 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 11m
bf-game-server-x4qrk-lg8d6 Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7344 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 11m
bf-game-server-x4qrk-pp2jg Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7408 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 11m
bf-game-server-x4qrk-pp2jg Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7208 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 40s
bf-game-server-x4qrk-pvck6 Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7508 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 40s
bf-game-server-x4qrk-spplq Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7564 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 40s
7. Fleet Autoscaler の作成
では次に Fleet Autoscaler を作成してみます。
7-1. Fleet Autoscaler のマニフェストファイルの作成
以下のような内容の Fleet Autoscaler のマニフェストファイルを作成して、fleetautoscaler.yaml として保存します。 今回は Buffer を 3 に設定しているので、常に Ready の GameServer が 3 つある状態を維持してスケールします。
apiVersion: autoscaling.agones.dev/v1
kind: FleetAutoscaler
metadata:
name: bf-fleet-autoscaler
spec:
fleetName: bf-game-server
policy:
type: Buffer
buffer:
bufferSize: 3
minReplicas: 0
maxReplicas: 10
7-2. Fleet Autoscaler のマニフェストファイルの適用
作成したマニフェストファイルを適用します。
kubectl create -f fleetautoscaler.yaml
GameServer の状況を確認
作成できたら「fleetautoscaler.autoscaling.agones.dev/bf-fleet-autoscaler created」といったメッセージが表示されます。 Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。
kubectl get gs
NAME STATE ADDRESS PORT NODE AGE
bf-game-server-wp4wp Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7254 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 41m
bf-game-server-x4qrk-pp2jg Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7208 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
bf-game-server-x4qrk-pvck6 Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7508 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
bf-game-server-x4qrk-spplq Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7564 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
確認結果
Fleet の GameServer が 3 つになっていることが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)
それでは、GameServer を割り当てて、Fleet がスケールするか確認してみましょう。
8. GameServer の割り当て
GameServer の割り当ては Agones Allocator を利用する方法と、GameServerAllocation を直接作成する方法があります。今回は GameServerAllocation を直接作成する方法で割り当ててみたいと思います。
8-1. GameServerAllocation のマニフェストの作成
以下のような内容の GameServerAllocation のマニフェストファイルを作成して、gameserverallocation.yaml として保存します。
apiVersion: allocation.agones.dev/v1
kind: GameServerAllocation
spec:
selectors:
- matchLabels:
agones.dev/fleet: bf-game-server
8-2. GameServerAllocation のマニフェストの適用
作成したマニフェストファイルを適用します。
kubectl create -f gameserverallocation.yaml -o yaml
詳細情報
成功した場合は以下のように詳細が接続情報とともに表示されます。
apiVersion: allocation.agones.dev/v1
kind: GameServerAllocation
metadata:
creationTimestamp: "2024-09-08T01:05:02Z"
name: bf-game-server-x4qrk-pp2jg
namespace: default
spec:
metadata: {}
multiClusterSetting:
policySelector: {}
required: {}
scheduling: Packed
selectors:
- gameServerState: Ready
matchLabels:
agones.dev/fleet: bf-game-server
status:
address: ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
addresses:
- address: XXX.XXX.XXX.XXX
type: InternalIP
- address: XXX.XXX.XXX.XXX
type: ExternalIP
- address: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
type: InternalDNS
- address: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
type: Hostname
- address: ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
type: ExternalDNS
- address: XXX.XXX.XXX.XXX
type: PodIP
gameServerName: bf-game-server-x4qrk-nvfls
metadata:
annotations:
agones.dev/last-allocated: "2024-09-08T01:05:02.60831937Z"
agones.dev/ready-container-id: containerd://038a38f3c82fbd8408504bc72cc334fdfbc6f67f5ad74826253f32cdf170e62d
agones.dev/sdk-version: 1.43.0
labels:
agones.dev/fleet: bf-game-server
agones.dev/gameserverset: bf-game-server-x4qrk
nodeName: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
ports:
- name: default
port: 7208
source: local
state: Allocated
GameServer の状況を確認
GameServerAllocation の生成が成功すると、Ready の GameServer が 1 つ割り当てられます。 Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。 1 つの GameServer の STATE が Allocated になっているのがわかります。
kubectl get gs
NAME STATE ADDRESS PORT NODE AGE
bf-game-server-wp4wp Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7254 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 101m
bf-game-server-x4qrk-nvfls Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7623 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 3m57s
bf-game-server-x4qrk-pp2jg Allocated ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7208 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
bf-game-server-x4qrk-pvck6 Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7508 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
bf-game-server-x4qrk-spplq Ready ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com 7564 ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal 12m
Fleet の情報を確認
Fleet の情報も確認してみましょう。 また、Fleet 内の Ready の GameServer が 2 つになってしまったため、Fleet Autoscaler が Fleet のレプリカ数を 4 に変更し、Ready の GameServer が 3 つある状態を維持して、スケールアウトしているのが確認できます。
kubectl get fleet
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
bf-game-server Packed 4 4 1 3 143m
GameServer に接続
当然ですが、この GameServer には実際に接続することが可能です。nc コマンドなどで IP アドレスとポート番号で接続し、テキストメッセージを送るとそのまま返してくれます。IP アドレスとポート番号は GameServerAllocation の作成時に返却された情報で取得できているので、取得した IP アドレスとポート番号を利用します。 コマンドを送るとコマンドも実行してくれますが、今回は割愛します。詳細は リンクをご確認ください。
nc -u XXX.XXX.XXX.XXX 7208
Builders Flash!
ACK: Builders Flash!
9. 後片付け
チュートリアルは以上となります。最後に今回のチュートリアルで作ったリソースを削除します。
9-1. リソースの削除
以下のコマンドで作成した Agones のリソース (Fleet Autoscaler, Fleet, GameServer ) を削除します
kubectl delete fleetautoscaler bf-fleet-autoscaler
kubectl delete fleet bf-game-server
kubectl get gs |awk '/bf-game-server-*/{print $1}' |xargs kubectl delete gs
9-2. Agones のアンインストール
以下のコマンドで Agones をアンインストールします。
helm uninstall bf-release --namespace=agones-system
9-3. EKS クラスターの削除
最後に作成した EKS クラスターを削除します。以上でチュートリアルは全て終了となります。
eksctl delete cluster --name bf-agones-cluster
Amazon GameLift との違いについて
これで AWS 上で Agones をつかってマルチプレイゲームの専用ゲームサーバーを構築することができました。
でもちょっと待ってください。AWS に詳しい人なら「あれ ?」と思われた方もいるのでないかとおもいます。そうです、AWS には「Amazon GameLift」という専用ゲームサーバーをマネージドに提供するサービスがあったんじゃなかったけ ? と疑問を持たれたのではないかと思います。
もちろん「Amazon GameLift」をつかっても専用ゲームサーバーを実現することは可能です。では、Agones と GameLift にはどのような違いがあるのでしょうか ? それを簡単にまとめたものがこちらとなります。
Agones は カスタマイズ性の高さという点と Kubernetes を前提としているため Kubernetes エコシステムのツールなどを利用できるという点に大きなメリットがあります。逆にマッチメイク・プレイヤーセッション管理などの機能がなく実装が必要となりますし、また Kubernetes 自体の運用の複雑さという点もデメリットとして挙げられるかと思います。
この点を踏まえたうえで、コンテナを利用する必要があり、Kubernetes の運用になれている場合は、Agones が第一選択肢となってきます。
このあたりはご自身の会社の体制や今までの経験・対象となるプロジェクトの要件と付き合わせて、ご検討いただければと思います。

まとめ
今回は「Agones on Amazon EKS で構築するマルチプレイゲームの専用ゲームサーバー」というお題で、Agones の説明と、EKS 上で Agonesを動かす手順をご紹介させていただきました。
Agones を使うとかなり簡単に専用ゲームサーバーを構築できることを体感いただき、Agones の全体像と AWS 上で動かすイメージを持っていただけたのではないかと思います。Agones を使って専用ゲームサーバー方式のマルチプレイゲームを作ってみたいと思われた方は、ぜひ AWS のソリューションアーキテクトにご相談いただければと思います。
この Agones を大規模に展開する際のベストプラクティスについて、以前 AWS Summit Japan 2024 でお話させていただいたセッション動画 がありますので、ご興味をお持ちいただけた方はこちらもぜひご覧ください。
筆者プロフィール
鷲見 啓志 (@harsm1979)
アマゾン ウェブ サービス ジャパン合同会社
ゲームソリューションアーキテクト
ゲーム業界に特化したソリューションアーキテクトとして、西日本や関西のお客様を支援させていただいております。以前はモバイルゲームの開発・インフラ構築・データ分析やゲームプロデューサー・ディレクターなんかをしておりました。趣味は自転車、いつかは PBP (Paris Brest Paris) を完走してみたいなと思っています。
