メインコンテンツに移動
デベロッパーのためのクラウド活用方法
AWS for Games logo featuring a white game controller icon and the text 'AWS FOR GAMES'.

Amazon S3 と Amazon CloudFront を活用したグローバル向けゲームビルドバイナリ共有環境の構築

2024-05-01 | Author : 森下 真孝

はじめに

ゲームなみなさんこんにちは、Game Solutions Architect の森下です。
この投稿では、ゲームのビルドバイナリをグローバルに共有する方法として、Amazon S3 と Amazon CloudFront をご紹介します。


X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 
今すぐ特典を受け取る »

AWS for Games

ゲームなみなさんこんにちは、Game Solutions Architect の森下です。
この投稿では、ゲームのビルドバイナリをグローバルに共有する方法として、Amazon S3 と Amazon CloudFront をご紹介します。

AWS for Games はより早い開発、よりスマートな運営、そしてより楽しいゲームへの成長という Build、Run、Grow の 3 つの柱に沿ってサポートします。今回は Build の柱 クラウドゲーム開発 のお話になります。

A diagram in Japanese illustrating the stages of cloud game development: Build, Run, and Grow. The 'Build' section shows cloud game development, the 'Run' section includes game server, game security, and game database, and the 'Grow' section features LiveOps, game analytics, and AI & ML, with corresponding icons and colorful section headers.

概要

ゲーム開発では、開発者や QA 担当者の間でビルドバイナリを共有する場面が発生します。しかし、ゲームのビルドバイナリは数 GB ~ 数十 GB になることも多く、保存領域と転送帯域の確保が課題になります。また、ビルドバイナリは機密性が高いため、セキュリティについての考慮も必要です。

さらに、開発したゲームをグローバル展開する場合、各ローカライズバージョンの動作確認を現地のチームに任せるという方法がよく取られます。この際、ビルドバイナリを世界各地でダウンロードする際に、転送速度が問題になる場合もあります。

本稿では、コスト効率に優れたストレージサービスである Amazon S3 と、グローバルなコンテンツ配信サービスである Amazon CloudFront を活用し、ゲーム開発向けのグローバルかつセキュアなビルドバイナリ共有環境を構築します。

構築するアーキテクチャ

本投稿で構築するアーキテクチャは 2023 年度 GIC の公演 Game production in the Cloud の Build Sharing Soulution を参考にします。

今回構築するアーキテクチャ図を次に示します。

以下、このアーキテクチャにおいて重要な 2 つのポイントを解説します。

アーキテクチャ図

Amazon S3 によるビルドバイナリの管理

ビルドバイナリの管理には、Amazon S3 を活用します。Amazon S3 はコスト効率に優れたオブジェクトストレージサービスで、特にゲームビルドのような、大きな単一のファイルを管理する上で非常に優れたソリューションになります。

今回構築するアーキテクチャでは、ビルドサーバーとして稼働している Amazon EC2 上から直接ビルドバイナリのアップロードを行います。ビルドサーバーには Amazon S3 への Permission を有するロールを付与します。

Amazon CloudFront 署名付き URL の活用

このアーキテクチャでは、Amazon CloudFront を活用することでグローバル対応を行います。Amazon CloudFront は、世界中に分散した 600 以上(2024/4 投稿時点)の Point of Presence (PoP) を経由してコンテンツを配信することで、レイテンシーを低減することができるサービスです。

ただし、コンテンツにアクセスできるのは認証されたユーザーに限る必要があります。そうしないと、S3 にアップロードされている開発中のゲームビルドを誰でもダウンロードできるようになってしまいます。

本稿では、コンテンツへのアクセスの際に RSA 暗号鍵で署名された 署名付き URL を必須とすることでアクセスを制限します。署名付き URL は期限付きのアクセス許可を付与されたコンテンツへの URL です。その署名付き URL が正しい RSA 暗号鍵で署名されたものであれば、誰でもファイルにアクセスすることができます。

本投稿では、署名付き URL の配布をサーバーレスで行います。具体的には、AWS Lambda で署名付き URL を発行する関数を作成し、Amazon API Gateway で API を公開します。API へのアクセスは、Amazon Cognito によるユーザー認証を必須とします。


(画像は * 2024 年 4 月時点)

A world map visualization showing the global distribution of AWS CloudFront edge locations, multiple edge locations, and regional edge caches. The map uses colored dots and circles to represent the locations and density of AWS CloudFront infrastructure across different continents.

手順

以降より、アーキテクチャの構築手順をまとめます。

注意: 本投稿の手順を手元のアカウントで試す場合は AWS の利用料金が発生します。リソースの削除忘れには十分ご注意ください。

1. Amazon S3 バケットの作成

まずは、Amazon S3 バケットを作成します。

マネジメントコンソールで Amazon S3 の画面を開き「バケットの作成」をクリックします。

バケットの設定は以下のようにします。

  • AWS リージョン : ap-northeast-1

  • バケット名 : 任意のバケット名を入力します。全世界でユニークでなければならないので、日付やランダムな文字列を組み合わせましょう。

それ以外は全てデフォルトのままで「バケットを作成」をクリックします。

2. Amazon CloudFront の設定

次に、Amazon S3 のコンテンツを配信する Amazon CloudFront ディストリビューションの設定を行います。

RSA 暗号鍵の作成

まず初めに、Amazon CloudFront の署名付き URL を発行するための RSA 暗号鍵を作成します。以下のコマンドを、AWS CloudShell などで実行してください。ローカルの PC でも構いません。

bash
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem

秘密鍵と公開鍵について

作成したキーのうち、秘密鍵は AWS Secrets Manager に保存し、AWS Lambda で暗号化に利用します。公開鍵は Amazon CloudFront に登録し、Amazon CloudFront 内部で利用されます。以下の手順で、暗号鍵の各種設定と Amazon CloudFront ディストリビューションの作成を同時に行います。

AWS Secrets Manager への登録

AWS Lambda で利用する秘密鍵を、AWS Secrets Manager に登録します。

AWS Secrets Manager の画面を開き、「新しいシークレットを保存する」をクリックしてください。

シークレットのタイプその他のシークレットのタイプ とします。その後、キー/値のペア で プレーンテキスト を選択し、秘密鍵の内容をコピペします(すでに入力されている文字列は全て上書きしてください)

シークレットの名前binary_share_secret とします。

それ以外は全てデフォルトのまま作成してください。

Screenshot of the AWS Secrets Manager interface in Japanese showing how to select the secret type for storing an RSA private key, with various options for secret types and an example RSA private key displayed in plaintext.

Amazon CloudFront で公開鍵を登録

Amazon CloudFront の画面を開き、左側のメニューから「キー管理」>「パブリックキー」>「パブリックキーを作成」を選択します。

  • 名前 : secret

  • キー : public_key.pem の内容をコピペ

Amazon CloudFrontのパブリックキー作成画面を日本語インターフェースで表示したスクリーンショット。名前、説明、PEM形式の公開鍵入力フィールド、作成ボタンなどが確認できる。

キーグループを作成

次に、左側のメニューから「キー管理」>「キーグループ」>「キーグループを作成」を選択します。

  • 名前 : secret_keygroup

  • パブリックキー : 先ほど作成した secret を選択

Screenshot of the AWS CloudFront key group creation interface with fields for group name, description, and public key selection, displayed in Japanese.

Amazon CloudFront ディストリビューションの作成

Amazon CloudFront の画面で、左側のメニューから「ディストリビューション」を選択し、「ディストリビューションを作成」をクリックします。

ディストリビューションの設定は以下の通りとしてください。

  • Origin domain : S3 バケットの名前

  • オリジンアクセス : Origin access control settings

Origin access control は、右にある「Create new OAC」ボタンをクリックし、全てデフォルトのまま Create をクリックしてください。(名前が 64 文字を超えるとエラーになるため、その場合は修正してください)

Screenshot of the AWS CloudFront origin access control settings page in the Japanese interface, showing options for public, origin access control, and legacy access identities, with the 'Create new OAC' button highlighted.

ビューワーのアクセス制限

ビューワーのアクセスを制限するでは「Yes」を選択し、キーグループを追加で先ほど作成した secret_keygroup を選択します。

Screenshot of the CloudFront key group access settings interface in Japanese, showing options to restrict viewer access using trusted key groups or trusted signer, with a key group named 'secret_keygroup' selected.

ウェブアプリケーションファイアウォール (WAF)

また、ウェブアプリケーションファイアウォール (WAF) の項目では セキュリティ保護を有効にしないでください を選択します。

Screenshot showing the security protection options for AWS Web Application Firewall (WAF) in Japanese. The image presents choices to enable or disable security protections for web applications using AWS WAF.

ディストリビューションを作成

それ以外は全てデフォルトで「ディストリビューションを作成」をクリックします。

ディストリビューションの作成後、上部に 「S3 バケットポリシーを更新する必要があります」 というポップアップが出ています。右の「ポリシーをコピー」をクリックしてクリップボードにコピーした後「S3 バケットの権限に移動してポリシーを更新する」リンクをクリックします。

Screenshot of the AWS CloudFront distribution management console in Japanese, displaying an update notification for S3 bucket policy. Users are prompted to update the S3 policy to allow CloudFront origin access control. The UI shows distribution details, ARN, and various distribution configuration sections.

S3 バケットポリシーの追加

作成したディストリビューションからのアクセスを許可するように、S3 のバケットポリシーを変更します。

バケットポリシー」の項目から「編集」をクリックし、先ほどクリップボードにコピーした内容をコピペしてください。

Amazon S3のバケットポリシー設定画面を示す日本語のスクリーンショット。公開アクセスがブロックされている旨の通知と、編集ボタンが表示されています。

S3 バケットポリシー

なお、上の手順でポリシーをコピーし忘れた場合は、以下のステートメントの S3_BUCKET_ARN と CLOUD_FRONT_DISTRIBUTION_ARN を置き換えてコピペを行なってください。

json
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "{S3_BUCKET_ARN}",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "{CLOUD_FRONT_DISTRIBUTION_ARN}"
                }
            }
        }
    ]
}

3. Lambda 関数の作成

次に、署名付き URL を発行する Lambda 関数を作成します。

マネジメントコンソールで Lambda の画面を開き「関数の作成」をクリックします。

関数の設定は以下のようにします。

  • 関数名 : get_presigned_url

  • ランタイム : Node.js 20.x

それ以外は全てデフォルトで「関数の作成」をクリックします。

コードの入力・デプロイ

Lambda 関数の内容は以下の通りとします。ただし、CLOUD_FRONT_URL と PUBLIC_KEYPAIR_ID を正しい値に置き換える必要があります。

javascript
import {
  SecretsManagerClient,
  GetSecretValueCommand
} from "@aws-sdk/client-secrets-manager";
import crypto from 'crypto';

const secretsManager = new SecretsManagerClient({region: 'ap-northeast-1'});
const replacementChars = {'+':'-', '=':'_', '/':'~'}

export const getSecretValue = async (secretName = 'binary_share_secret') => {
  const client = new SecretsManagerClient();
  const response = await client.send(
    new GetSecretValueCommand({
      SecretId: secretName,
    }),
  );
  
  if (response.SecretString) {
    return response.SecretString;
  }

  if (response.SecretBinary) {
    return response.SecretBinary;
  }
};

export const handler = async (event) => {
  let expiration = Date.now() + (60 * 30 * 1000);
  let baseUrl = 'CLOUD_FRONT_URL';
  let keyPairId = 'PUBLIC_KEYPAIR_ID';
  let objectName = event.queryStringParameters.object_name;
  
  let queryUrl = baseUrl + "/" + objectName;

  let cannedPolicy = {
    "Statement":[
      {
        "Resource": queryUrl,
        "Condition":{
          "DateLessThan":{
            "AWS:EpochTime": expiration
          }
        }
      }
    ]
  };
  cannedPolicy = JSON.stringify(cannedPolicy);

  let encodedPolicy = new Buffer.from(cannedPolicy).toString("base64");
  encodedPolicy = encodedPolicy.replace(/[+=/]/g, m => replacementChars[m]);

  const signer = crypto.createSign('RSA-SHA1');
  signer.update(cannedPolicy);
  let signedPolicy = signer.sign(await getSecretValue(), 'base64');
  signedPolicy = signedPolicy.replace(/[+=/]/g, m => replacementChars[m]);

  const paramDelimiter = (queryUrl.indexOf('?') === -1) ? '?' : '&';
  const cfSignedUrl = `${queryUrl}${paramDelimiter}Expires=${expiration}&Signature=${signedPolicy}&Key-Pair-Id=${keyPairId}`;

  const response = {
    statusCode: 200,
    body: JSON.stringify(cfSignedUrl),
  };

  return response;
}

CLOUD_FRONT_URL

CLOUD_FRONT_URL は Amazon CloudFront ディストリビューションの画面で確認できるドメイン名になります。横のコピーボタンをクリックすると https から始まる URL をコピーできます。

Screenshot of the AWS CloudFront distribution details page displayed in the Japanese interface, showing distribution domain name, ARN, and last modified date.

PUBLIC_KEYPAIR_ID

PUBLIC_KEYPAIR_ID は、Amazon CloudFront パブリックキーの画面で確認できる ID になります。

Screenshot of the AWS CloudFront public key list page, displayed in Japanese, showing an example public key entry with ID, name, and description fields.

デプロイ

関数のコードを入力したら、Deploy ボタンも忘れず押してください。

Screenshot of the AWS Lambda online code editor with a Python script using Boto3 to generate a presigned URL for Amazon S3. The interface is in Japanese, highlighting code deployment and environment variables.

AWS Secrets Manager へのアクセス許可を追加

AWS Secrets Manager にあるシークレットキーに、Lambada 関数からアクセスできるようにします。

まず、Lambda 関数の実行ロールの ARN を調べます。Lambda 関数の「設定」からロール名をクリックし、IAM の画面でロール ARN を控えます。

AWS IAMコンソールで表示される『get_presigned_url_role-fte8p5c5』ロールの詳細画面。作成日、最大セッション時間、ARN(Amazon Resource Name)などが日本語UIで確認できるスクリーンショット。

リソースのアクセス許可

AWS Secrets Manager で作成したシークレットの画面で、「リソースのアクセス許可」>「許可を編集」をクリックします。

AWS マネジメントコンソールのシークレットマネージャーで、リソースのアクセス許可を編集する日本語インターフェース画面。『概要』『ローテーション』『バージョン』『レプリケーション』『タグ』などのタブや、シークレットの値取得、許可を編集ボタンが表示されています。

許可設定の編集

入力欄に以下のコードを入力します。ただし、arn:aws:iam::123456789012:role/MyRole の部分は控えた IAM ロールの ARN に置き換えてください。

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/MyRole"
            },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "*"
        }
    ]
}

4. Cognito の設定

次に Cognito ユーザープールを作成します。

ユーザープールの作成

マネジメントコンソールで Cognito の画面を開き「ユーザープールを作成」をクリックします。

ユーザープールの設定は以下のようにします。設定項目が多いのでご注意ください。
なお、説明で触れていない項目に関しては全てデフォルトとします。

ステップ 1 : サインインエクスペリエンスを設定

 「ユーザー名」と「E メール」のチェックボックスをオン

AWS Cognitoのユーザープールのサインインエクスペリエンス設定画面の日本語インターフェース。認証プロバイダーのタイプ選択やサインインオプション設定などの項目が表示されています。

ステップ 2 セキュリティ要件を設定

 「多要素認証」の項目で「MFA なし」を選択

Screenshot of the AWS user interface displaying multi-factor authentication (MFA) settings options in Japanese, including mandatory MFA, optional MFA, and no MFA selection.

ステップ 3 サインアップエクスペリエンスを設定

全てデフォルトのままとします。

ステップ 4 メッセージ配信を設定

E メールプロバイダー」で「Cognito で E メールを送信」を選択します。

Screenshot of the AWS Cognito email settings interface in Japanese, showing configuration options for selecting an email provider (Amazon SES or Cognito) and related region settings.

ステップ 5 アプリケーションを統合

  • ユーザープール名: developer

  • ホストされた認証ページ: 「Cognito のホストされた UI を使用」をオンにします

  • Cognito ドメイン: 任意の文字列とします。グローバルで一意にする必要があります

  • アプリケーションクライアント名: build-binary-share

  • 許可されているコールバック URL: http://localhost (httpsではないので注意)

  • 高度なアプリケーションクライアントの設定 欄を開き「OAuth 2.0 許可タイプ」を「暗黙的な付与」のみとします


許可されているコールバックに http://localhost を指定していますが、これにより、Cognito の 認証ページからローカルに立ち上げたダウンロードアプリへ認証情報を引き継いでリダイレクトされるようになります。

あとは「次へ」をクリックしてユーザープールの作成を完了させます。

設定画面イメージ

Amazon Cognitoのユーザープールドメイン設定画面(日本語UI)のスクリーンショットです。ユーザープール名の入力、ホストされた認証ページ、ドメインタイプやドメインプレフィックスの入力など、Cognitoドメインのセットアップ手順が表示されています。 ユーザープール名

AWS Cognitoのアプリケーションクライアント設定画面(日本語インタフェース)のスクリーンショット。パブリッククライアントやシークレットの有無、許可されているコールバックURLなどの設定項目が表示されています。 最初のアプリケーションクライアント

Screenshot of the AWS Cognito user interface in Japanese showing the OAuth 2.0 authorization type selection, with an informational warning about implicit flow and PKCE recommendation. OAuth 2.0 許可タイプ

Cognito ユーザーの作成

動作確認用の Cognito ユーザーを作成します。

作成した developer ユーザープールの画面を開き「ユーザー」の欄で「ユーザーを作成」をクリックします。

Screenshot of the AWS Cognito user pool interface in Japanese, displaying the 'Create User' screen with various user and email options.

ユーザーの設定

ユーザーの設定は以下のようにします。

  • 招待メッセージ : 「E メールで招待を送信」を選択

  • ユーザー名 : 任意のものを入力

  • E メールアドレス : メールを受け取りたいアドレスを入力

  • 仮パスワード : 「パスワードの生成」を選択


入力したメールに Your temporary password というタイトルでメールが来ます。本文に仮パスワードが記載されているので控えておきましょう (メール本文末尾のピリオドはパスワードではないのでご注意ください)

Amazon Cognito の日本語インターフェースでユーザーを作成する画面。ユーザー名、Eメールアドレス、仮パスワードなどの入力欄とオプションが表示されている。

認証ページの確認

設定は以上ですが、念のためユーザーが作成できているかを確認します。

画面遷移イメージ

developer ユーザープールの画面から「アプリケーションの統合 」> 「アプリクライアントと分析」と遷移し、binary-share-client をクリックします。

ユーザープールの統合・設定セクションを表示する日本語のアプリケーションクライアント管理インターフェース画面のスクリーンショット。タブメニューや設定項目の説明が含まれる。

Screenshot of the Amazon Cognito application client list interface in Japanese, showing the application client name and client ID in the AWS Management Console.

Cognito の認証画面

アプリケーションクライアントの画面に遷移後「ホストされた UI を表示」をクリックします。

Cognito の認証画面に遷移するので、ユーザー名と仮パスワードを入力します。初回ログイン時はパスワードの変更を求められるので任意のパスワードを入力します。

正しく認証できれば、ブラウザのエラー画面に遷移するかと思います。まだ localhost にダウンロード用のアプリケーションサーバを立てていないので、これは正常な動作になります。

Screenshot of the AWS Cognito Hosted UI settings page displayed in Japanese, showing configuration details such as UI status, callback URLs, sign out URLs, and identity provider information.

5. Amazon API Gateway の設定

API Gateway のエンドポイントを作成し、Lambda 関数のトリガーとして設定します。

エンドポイントの作成

マネジメントコンソールで Lambda の画面を開きます。

Lambda 関数 get_presigned_url の画面で「関数の概要」から「トリガーを追加」をクリックします。

A diagram in Japanese showing the AWS Lambda function 'get_presigned_url' with options to add triggers and destinations, from the AWS Management Console.

トリガーの設定

トリガーの設定画面では以下のようにします。

  • ソースを選択 : 「API Gateway」を選択

  • Create a new API のラジオボタンをオン

  • Security :「Create JWT authorizer」を選択

  • Identity source : $request.header.Authorization

  • Issuer : https://cognito-idp.ap-northeast-1.amazonaws.com/{ユーザープールID}

  • Audience : binary-share-client のクライアントID


ユーザープール ID と クライアント ID は cognito の画面で確認可能です。

設定が終わったら「追加」をクリックします。

cognito の画面イメージ

Screenshot of the AWS Cognito user pool list interface displayed in Japanese, showing user pool name, ID, and a search bar. ユーザープール ID

Screenshot of the AWS Cognito console showing the application client list interface in Japanese, displaying details such as client names and IDs. クライアント ID

CORS の設定

次に、CORS の設定を行います。この設定をしておかないと、localhost に立てたダウンロード用のアプリケーションから API の呼び出しができません。

マネジメントコンソールで API Gateway の画面を開き、先ほど作成した get_presigned_url-API の画面を開きます。

まず、API に紐づくメソッドを GET だけに変更します。左のメニューから「Routes」を選択し、ルートの「ANY」を選択した後、「ルートの詳細」にある「編集」ボタンをクリックします。

Screenshot of the AWS API Gateway console displaying route details in the Japanese interface, showing configuration settings for a route named get_presigned_url.

メソッドの設定

メソッドの設定を ANY から GET に変更して「保存」をクリックします。

Screenshot of the AWS API Gateway console in Japanese, showing the configuration interface for setting a route method to GET and entering the path '/get_presigned_url'.

CORS の設定

次に、左のメニューから「CORS」をクリックして、「設定」をクリックします。

(画像は設定後の画面です)


CORS の設定は以下の通りとします。(追加ボタンを押す必要があります)

  • Access-Control-Allow-Origin: *

  • Access-Control-Allow-Headers: authorization

  • Access-Control-Allow-Methods: *

それ以外はデフォルトのままとして「保存」をクリックします。

Screenshot of the Amazon API Gateway interface displaying CORS (Cross-Origin Resource Sharing) settings in Japanese. The interface shows configuration options for Access-Control-Allow-Origin, Methods, Headers, Expose-Headers, and Credentials, used for managing CORS on APIs.

6. ビルドマシンの立ち上げ

ビルドマシンを想定して EC2 インスタンスを立ち上げます。本投稿においてゲームのビルド作成は本筋ではないため、あくまでも仮想のビルドマシンとします。

インスタンスの設定

マネジメントコンソールで EC2 の画面を開き「インスタンスを起動」をクリックします。

インスタンスタイプが t2.micro(無料利用枠の対象) であることを確認します。

基本的な設定は何も変えずに「高度な詳細」を開きます。「IAM インスタンスプロフィール」の横にある「新しい IAM プロファイルの作成」をクリックします。

AWSコンソールの高度な詳細設定画面を示す日本語のスクリーンショット。IAMインスタンスプロファイルの選択や新規作成、ドメイン統合ディレクトリ、ホスト名のタイプなどの設定項目が表示されています。

ビルドマシン用 IAM ロールの作成

IAM ロールの設定画面に遷移するので「ロールを作成」をクリックします。

IAM ロールの設定は以下の通りとします。

  • サービスまたはユースケース : EC2

  • 許可ポリシー : 検索欄に AmazonS3FullAccess と入力しチェックボックスをオンにします

  • ロール名 : BuildServerRole



最後に「ロールを作成」をクリックします。

Screenshot of the AWS Identity and Access Management (IAM) console in Japanese, displaying the process of adding the AmazonS3FullAccess policy to a role. The policy provides full access to all Amazon S3 buckets.

ロールのアタッチ

EC2 インスタンスの設定画面に戻り「IAM インスタンスプロフィール」の項目で先ほど作ったロール BuildServerRole を選択します。

インスタンスの設定は以上です。「インスタンスを起動」ボタンをクリックしてください。

7. 簡易版ダウンロードアプリの立ち上げ

開発者がビルドバイナリをダウンロードする際に利用する web アプリケーションをローカルに立ち上げます。こちらも、本投稿の本筋ではないため、非常に簡易なもので済ませてしまいます。

以下の javascript コードのリンクをダウンロード・解凍し、node で実行してください。例えば server.js として保存したなら node server.js とします。80 番ポートで web サーバーが起動します。

{APIエンドポイントのID} の部分を、作成した API Gateway エンドポイントの ID に置き換える必要があることに注意してください。

javascript コードをダウンロード »

エンドポイント ID 確認

エンドポイントの ID は API Gateway の画面で確認可能です。(黒塗りにしている部分に表示されているものが ID)

構築の手順は以上になります ! お疲れ様でした。

Screenshot of the Amazon API Gateway management console in Japanese, displaying the list of APIs including a 'get_presigned_url-API' created by AWS Lambda, with details such as protocol, endpoint type, and creation date.

使ってみる

アップロード

まずは、ビルドサーバーに見立てた EC2 からファイルをアップロードしてみます。とはいえ、本投稿では touch コマンドで作成したファイルをビルドバイナリとみなして作業を行います。

Amazon EC2 への接続

まず、EC2 に接続します。ビルドサーバーインスタンスを選択し「接続」をクリックします。

Screenshot of the AWS Management Console in Japanese displaying a filtered list of EC2 instances with the "running" state. The instances are shown with details such as Instance ID, type, and status checks.

接続成功

EC2 Instance Connect が選択されていることを確認し、そのままの設定で「接続」をクリックします。

以下のような CLI が開かれれば接続成功です。

Screenshot of the terminal welcome message for Amazon Linux 2023, displaying ASCII art and a URL to the official page (https://aws.amazon.com/linux/amazon-linux-2023/).

ビルドの作成・アップロード

それでは、ビルドを模したファイルを作成します。以下のコマンドを実行してください。

bash
touch awesome_game_build

Amazon S3 へアップロード

次に、以下のコマンドで Amazon S3 へアップロードを行います。

bash
aws s3 cp awesome_game_build s3://{Amazon S3のバケット名}/awesome_game_build

ファイル確認

アップロードできているかどうか確認します。マネジメントコンソール上で Amazon S3 のバケットを開き、ファイルが存在するかを確認してください。

Screenshot of the Amazon S3 console object list in Japanese, displaying an object named 'awesome_game_build'. The interface includes options such as upload, download, copy S3 URI, and various actions, with visible Japanese UI text.

ビルドのダウンロード

改めて 3. Cognito の設定 で確認した認証ページを開き認証を行います。localhost にダウンロードアプリの web サーバーが立ち上がっている場合、ダウンロードページにアクセスできます。

Object Name」にオブジェクト名を入力して「Get」ボタンをクリックすると署名付き URL を取得することができます。


署名付き URL が有効であることを確認しましょう。ブラウザで署名付き URL を開いた際にファイルがダウンロードできれば成功です!

Screenshot of the AWS Console showing an example form for generating a presigned URL for an object in object storage. The form includes fields for object name and presigned URL, with the object name set to 'awesome_game_build'.

後片付け

構築したリソースの後片付けを行います。削除するリソースは以下の通りです。

  • Amazon CloudFront ディストリビューションの削除 : Amazon CloudFront の画面からディストリビューションを無効化後削除します。
  • AWS Secrets Manager の削除 : AWS Secrets Manager の画面から作成したシークレットを削除します。
  • Amazon S3 バケットの削除 : Amazon S3 の画面からバケットを削除します。バケットは空にしないと削除できないので注意してください
  • Lambda 関数の削除 : AWS Lambda の画面から関数を削除します
  • API Gateway エンドポイントの削除 : Amazon API Gateway の画面からエンドポイントを削除します
  • Cognito ユーザープールの削除 : Amazon Cognito の画面から ユーザープールを削除します
  • EC2 インスタンスの終了: Amazon EC2 の画面から立ち上げた EC2 インスタンスを終了します。

まとめ

今回は、ゲーム開発におけるビルドバイナリの共有環境を Amazon S3 上に構築し、Amazon CloudFront でグローバルにアクセスする方法について解説しました。Amazon S3 はコスト効率とセキュリティに優れたストレージサービスであり、ビルドバイナリのような単一で大きいファイルを管理する上では非常に優れたソリューションとなり得ます。Amazon CloudFront はグローバルにコンテンツを配信するサービスで、離れた位置にあるデータにも高速にアクセスすることが可能になります。

今回解説した内容が、皆様のゲーム開発の助けになれば幸いです。

筆者プロフィール

森下 真孝
アマゾン ウェブ サービス ジャパン合同会社
ソリューションアーキテクト

国内のモバイルゲーム開発会社でサーバーサイドからクライアントサイドまでを担当。
ゲーム業界向けのソリューションアーキテクトとしてゲーム開発に携わるお客様をご支援しております。

A man smiling outdoors with an urban background and buildings visible on a sunny day.