こんにちは。プロダクト事業部のまつもとです。
今回は、ピープルソフトウェア社内で実施した 🎮ゲームコンテスト🎉でコンテストにエントリーされた各ゲームを実行させるために、AWS環境を新規作成したのでご紹介します!
ゲームコンテストの内容については別の機会でご紹介できたらと思い、ここでは割愛します。
今回開催されたゲームコンテストは
- Webブラウザで動作するゲームであること。
- 開発言語は自由。
- プレーヤーはピープルの社員全員が対象。
- ピープル社員以外はアクセス禁止。
- ゲームをプレーする場所はどこでもOK。
- 開催期間中はいつでもアクセス可能。
- エントリーされるゲームの最大容量は200MBが上限。
できるだけランニングコストを抑える!
という前提条件があったので、サクッと公開環境が揃えられるAWSを利用することにしました。
構成
前提条件を踏まえて、こんな形の動作環境を作成しました!
CloudFront
前提条件の ゲームの最大容量は200MB
があり、ピープル社員全員が同時にアクセスしに来た場合を想定すると、 CDNは絶対必要になるので、CloudFront を配備しました。
社員のみアクセス可能とするため、単純ではありますが CloudFront Functions で Basic認証
を設定しました。
S3
作成されたゲームの開発言語は
と、多種多様な言語で開発されていましたが、 Scratch 以外は、ホームページの素材として静的サイトに配備すれば動作するので、静的サイトを簡単に公開できる S3 を準備しました。
AWS CodePipeline & CodeCommit
ゲームを実行環境に配備させるために、ゲーム製作者一人一人に対してAWSコンソールを公開したくなかったのと、デプロイ作業は、S3にファイルアップロード後、CloudFrontでキャッシュ削除といった具合に、意外と手間が発生するため、デプロイは AWS CodePipeline を使って、自動的にアップロードされるようにしました。
こうしておくことで、ゲーム製作者が増減しても、 AWS CodeCommit へのアクセス権限だけ設定すれば、デプロイ手順を展開する必要もなくなりますし、ゲーム開発者は修正→テスト→デプロイの頻度が高くなり、より良いゲーム開発に注力できるようになりました。
LoadBalancer & ECS
作成されたゲームの開発言語の中で、 Scratch のみ、実行環境 (Scratch VM) が必要だったため、Scratchのコンテナイメージくらいいくらでもあるっしょ!と思い、 Scratch の実行環境は、ECS で作成しました。
また、スパイクアクセスが発生しても捌けるように Application Load Balancer を配備して、スケールアウト・スケールインを自動で行うようにしました。
Docker Hub (Scratch3 Image)
Scratchのコンテナイメージくらいいくらでもあるっしょ!
この考えが甘かったです。😱 (ちゃんと下調べはするべきです!)
まず、Docker Hub にはWebでアクセスできるWebサーバーを梱包した形のコンテナイメージはありませんでした。
なので、自前で作成する必要が出てきたので、 Amazon ECR を利用する方向を検討しましたが、ECRの料金(プライベートリポジトリの場合) は
- プライベートリポジトリまたはパブリックリポジトリに保存されたデータのストレージは、GB/月あたり 0.10USD
- データ送信量: 1GB/月〜9.999 TB/月まで 0.114USD/GB (←単位がGBってのが引っ掛け)
Scratchのコンテナイメージが、 3GBとかで、 ECS がALBで自動起動される度に発生するって。。。と、考えただけでヤヴァイ!と思い、Docker Hub にコンテナイメージを Push
しました。
ECS から Docker Hub の Pull
は料金発生しないので経済的です。
Docker Hub
kiyorin/scratch-gui
NginX & Scratch3 VMの組み合わせのコンテナーになります。
メンテしない&いつ消えるかわからない状態ですが、よかったら使ってやって下さい😅
あと、大したこともしていないので Dockerfile
も公開しておきます。よければ使って下さい。
Dockerfile
FROM node:12.22.3-alpine3.12 as builder
RUN apk add --update --no-cache git
RUN git clone --depth 1 https://github.com/LLK/scratch-gui.git \
&& git clone --depth=1 https://github.com/llk/scratch-vm
WORKDIR /scratch-vm
RUN npm install \
&& npm link
WORKDIR /scratch-gui
RUN npm link scratch-vm \
&& npm install \
&& npm run build
FROM nginx:alpine
RUN mkdir -p /usr/share/nginx/html/scratch-gui
COPY --from=builder /scratch-gui/build /usr/share/nginx/html/scratch-gui
作成してみての感想
本当は、AWS Amplify で構築作業も楽にできるかしら?と、淡い願望を抱いてましたが Scratch へのリクエストも同一ドメインのURLパターンで捌く必要があったので、断念しました。
このくらいの環境であれば、1週間もかからないくらいのスピードで構築できるのは、さすがクラウド、さすがAWSだと思います!
PS:
ゲームコンテストは問題も発生することなく(?)、無事に審査発表まで迎えることが出来ました!