社内ゲームコンテストの実行環境をAWSで構築した話

こんにちは。プロダクト事業部のまつもとです。

今回は、ピープルソフトウェア社内で実施した 🎮ゲームコンテスト🎉でコンテストにエントリーされた各ゲームを実行させるために、AWS環境を新規作成したのでご紹介します!

ゲームコンテストの内容については別の機会でご紹介できたらと思い、ここでは割愛します。

今回開催されたゲームコンテストは

  • Webブラウザで動作するゲームであること。
  • 開発言語は自由。
  • プレーヤーはピープルの社員全員が対象。
  • ピープル社員以外はアクセス禁止。
  • ゲームをプレーする場所はどこでもOK。
  • 開催期間中はいつでもアクセス可能。
  • エントリーされるゲームの最大容量は200MBが上限。
  • できるだけランニングコストを抑える!

という前提条件があったので、サクッと公開環境が揃えられるAWSを利用することにしました。

構成

構成図

前提条件を踏まえて、こんな形の動作環境を作成しました!

CloudFront

前提条件の ゲームの最大容量は200MB があり、ピープル社員全員が同時にアクセスしに来た場合を想定すると、 CDNは絶対必要になるので、CloudFront を配備しました。
社員のみアクセス可能とするため、単純ではありますが CloudFront FunctionsBasic認証 を設定しました。

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:
    ゲームコンテストは問題も発生することなく(?)、無事に審査発表まで迎えることが出来ました!

コメントを残す

%d人のブロガーが「いいね」をつけました。