Amazon Simple Storage Service (S3) - AWS Mobile SDK for Unity

AWS Mobile SDK for Unity が、AWS SDK for .NET に含まれるようになりました。このガイドでは Mobile SDK for Unity のアーカイブバージョンを参照します。詳細については、AWS Mobile SDK for Unity とは を参照してください。

Amazon Simple Storage Service (S3)

Amazon Simple Storage Service (Amazon S3) を使用すると、開発者および IT チームは、耐久性および耐障害性が高く、セキュアなオブジェクトストレージを使用できるようになります。Unity の開発者は、S3 を活用して、ゲームで使用されるアセットを動的にロードすることができます。これにより、最初から迅速にアプリストアからのダウンロードを行うことができます。

S3 の詳細については、「Amazon S3」を参照してください。

AWS S3 リージョンの可用性の詳細については、「AWS サービスリージョンの可用性」を参照してください。

注記

このドキュメントの一部サンプルでは、ResultText と呼ばれる可変のテキストボックスを使用して、トレース出力を表示していることを前提としています。

S3 バケットの作成と設定

Amazon S3 は、特定のリージョンに存在するクラウドストレージコンテナである Amazon S3 バケットにリソースを保存します。Amazon S3 バケットの名前は、それぞれグローバルに一意である必要があります。Amazon S3 コンソールを使用して、バケットを作成します。

S3 バケットの作成

  1. Amazon S3 コンソールにサインインし、[バケットを作成する] をクリックします。

  2. バケット名を入力してリージョンを選択したら [作成] をクリックします。

S3 のアクセス許可を設定

デフォルトの IAM ロールのポリシーでは、Amazon Mobile Analytics および Amazon Cognito Sync へのアクセス権がアプリケーションに付与されています。Cognito ID プールから Amazon S3 にアクセスできるようにするには、ID プールのロールを変更する必要があります。

  1. Identity and Access Management コンソールに移動し、左側のペインの [ロール] をクリックします。

  2. 検索ボックスに ID プールの名前を入力します。2 つのロール (未認証ユーザーと認証済みユーザー) が表示されます。

  3. 未認証ユーザーのロールをクリックします (unauth を ID プール名に追加)。

  4. [ロールポリシーの作成] をクリックして [Policy Generator] を選択し、[選択] をクリックします。

  5. [アクセス許可の編集] ページで、以下のイメージに示す設定を入力し、Amazon リソースネーム (ARN) を実際の名前に置き換えます。S3 バケットの ARN は、arn:aws:s3:::examplebucket/* のように表示され、バケットを配置するリージョンとバケットの名前で構成されます。以下に示す設定では、ID プールから指定したバケットのすべてのアクションにフルアクセスを付与しています。

  1. [ステートメントを追加] ボタンをクリックし、[次のステップ] をクリックします。

  2. ウィザードに、生成した設定が表示されます。[ポリシーの適用] をクリックします。

S3 に対するアクセス権の付与の詳細については、「Amazon S3 バケットへアクセス権を付与する」を参照してください。

コンソールからファイルをアップロードする

テストファイルをバケットにアップロードするには、以下のように行います。

  1. S3 コンソールのバケットビューで、[アップロード] をクリックします。

  2. [ファイルを追加] をクリックし、アップロードするテストファイルを選択します。このチュートリアルでは、イメージ (myImage.jpg) をアップロードしていることを前提としています。

  3. テストイメージを選択した状態で、[Start Upload (アップロードを開始)] をクリックします。

(オプション) S3 リクエストの署名バージョンを設定する

Amazon S3 とのすべてのやり取りは認証されるか匿名で行われます。AWS では、署名バージョン 4 または署名バージョン 2 のアルゴリズムを使用して、サービスへの呼び出しを認証します。

2014 年 1 月以降に作成されたすべての新しい AWS リージョンでは、署名バージョン 4 のみをサポートしています。ただし、以前のリージョンの多くは、現在も署名バージョン 4 および署名バージョン 2 のリクエストに対応しています。

バケットが、このページの署名バージョン 2 のリクエストをサポートしていないリージョンのいずれかにある場合は、AWSConfigsS3.UseSignatureVersion4 プロパティを「true」に設定する必要があります。

AWS 署名バージョンの詳細については、「リクエストの認証 (AWS 署名バージョン 4)」を参照してください。

Amazon S3 クライアントの作成

Amazon S3 を使用するには、まず、以前に作成した CognitoAWSCredentials インスタンスを参照する AmazonS3Client インスタンスを作成する必要があります。

AmazonS3Client S3Client = new AmazonS3Client (credentials);

AmazonS3Client クラスは、高レベルの S3 API のエントリポイントです。

バケットの一覧表示

AWS アカウントのバケットを一覧表示するには、次のサンプルコードに示すように、AmazonS3Client.ListBucketsAsync メソッドを呼び出します。

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Buckets"; Client.ListBucketsAsync(new ListBucketsRequest(), (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.Buckets.ForEach((s3b) => { ResultText.text += string.Format("bucket = {0}, created date = {1} \n", s3b.BucketName, s3b.CreationDate); }); } else { ResultText.text += "Got Exception \n"; } });

オブジェクトのリスト化

バケットのオブジェクトをすべて一覧表示するには、次のサンプルコードに示すように、AmazonS3Client.ListObjectsAsync メソッドを呼び出します。

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Objects from " + S3BucketName; var request = new ListObjectsRequest() { BucketName = S3BucketName }; Client.ListObjectsAsync(request, (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.S3Objects.ForEach((o) => { ResultText.text += string.Format("{0}\n", o.Key); }); } else { ResultText.text += "Got Exception \n"; } });

オブジェクトのダウンロード

オブジェクトをダウンロードするには、バケット名およびキーを指定しながら GetObjectRequest を作成して、Client.GetObjectAsync に対する呼び出しにオブジェクトを渡します。

private void GetObject() { ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => { string data = null; var response = responseObj.Response; if (response.ResponseStream != null) { using (StreamReader reader = new StreamReader(response.ResponseStream)) { data = reader.ReadToEnd(); } ResultText.text += "\n"; ResultText.text += data; } }); }

GetObjectAsync は、GetObjectRequest のインスタンス、コールバック、AsyncOptions インスタンスを受け取ります。コールバックの型は AmazonServiceCallback<GetObjectRequest, GetObjectResponse> である必要があります。AsyncOptions インスタンスはオプションです。指定した場合、メインスレッドでコールバックが実行されるかどうかを決定します。

オブジェクトのアップロード

オブジェクトをアップロードするには、オブジェクトをストリームに書き込み、新しい PostObjectRequest を作成して、バケット名およびストリームデータを指定します。

AWS SDK for Unity では、WWW HTTP クライアントを使用します。このクライアントは、HTTP PUT オペレーションをサポートしていません。S3 バケットにオブジェクトをアップロードするためには、以下に示すように、S3 のブラウザを使用する必要があります。

public void PostObject(string fileName) { ResultText.text = "Retrieving the file"; var stream = new FileStream(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName, FileMode.Open, FileAccess.Read, FileShare.Read); ResultText.text += "\nCreating request object"; var request = new PostObjectRequest() { Bucket = S3BucketName, Key = fileName, InputStream = stream, CannedACL = S3CannedACL.Private }; ResultText.text += "\nMaking HTTP post call"; Client.PostObjectAsync(request, (responseObj) => { if (responseObj.Exception == null) { ResultText.text += string.Format("\nobject {0} posted to bucket {1}", responseObj.Request.Key, responseObj.Request.Bucket); } else { ResultText.text += "\nException while posting the result object"; ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString()); } }); }