Amazon DynamoDB - AWS Mobile SDK for Unity

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

Amazon DynamoDB

Amazon DynamoDB は、拡張性と可用性に優れた、費用効果の高い、高速な非リレーショナルデータベースサービスです。DynamoDB により、データストレージに対して低いレイテンシーと予測可能なパフォーマンスを維持しながら、従来の拡張性の限界を排除できます。DynamoDB に関する詳細については、「Amazon DynamoDB」を参照してください。

AWS Mobile SDK for Unity には、DynamoDB を操作するための高レベルのライブラリが用意されています。低レベルの DynamoDB API に対してリクエストすることもできますが、ほとんどのユースケースにおいて、ハイレベルのライブラリが推奨されています。特に、AmazonDynamoDBClient は高レベルライブラリの便利な部分です。このクラスを使用することで、さまざまな (CRUD) 操作の作成、読み取り、更新、削除、およびクエリの実行を行うことができます。

注記

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

Amazon DynamoDB の統合

Unity アプリケーションで DynamoDB を使用するには、プロジェクトに Unity SDK を追加する必要があります。追加していない場合は、SDK for Unity をダウンロードし、「AWS Mobile SDK for Unity のセットアップ」の手順に従います。アプリケーションに一時的な AWS 認証情報を提供するには、Amazon Cognito ID を使用することをおすすめします。これらの認証情報を使用すると、アプリから AWS サービスおよびリソースにアクセスできるようになります。

DynamoDB をアプリケーションで使用するには、適切なアクセス許可を設定する必要があります。次の IAM ポリシーでは、ユーザーは特定の DynamoDB テーブルの項目を削除、取得、挿入、スキャン、更新することができます。このポリシーは、ARN によって識別されます。

{ "Statement": [{ "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/MyTable" }] }

このポリシーは、Cognito ID プールに割り当てられているロールに適用されますが、Resource 値を DynamoDB テーブルの適切な ARN に置き換える必要があります。Cognito によって、自動的に新しい ID プールのロールが作成されると、IAM コンソールで、このロールにポリシーを適用することができます。

アプリケーションのニーズに応じて、許可されているアクションを追加または削除する必要があります。IAM ポリシーの詳細については、「IAM の使用」を参照してください。DynamoDB 固有のポリシーの詳細については、「IAM を使用して DynamoDB リソースへのアクセスをコントロールする」を参照してください。

DynamoDB テーブルの作成

これでアクセス許可と認証情報がセットアップされたため、アプリケーションの DynamoDB テーブルを作成しましょう。テーブルを作成するには、DynamoDB コンソールに移動し、次の手順に従って操作します。

  1. [テーブルの作成] をクリックします。

  2. テーブルの名前に Bookstore と入力します。

  3. プライマリキーのタイプとして、[ハッシュ] を選択します。

  4. [数値] を選択し、ハッシュ属性名の id を入力します。[次へ] をクリックします。

  5. [次へ] を再度クリックして、インデックスの追加をスキップします。

  6. 読み込みキャパシティーを 10、書き込みキャパシティーを 5 に設定します。[次へ] をクリックします。

  7. 通知 E メールを入力したら、[次へ] をクリックしてスループットアラームを作成します。

  8. [Create] (作成) をクリックします。DynamoDB にデータベースが作成されます。

DynamoDB クライアントの作成

アプリで DynamoDB テーブルを操作するには、クライアントが必要です。デフォルトの DynamodDB クライアントは、次のように作成できます。

var credentials = new CognitoAWSCredentials(IDENTITY_POOL_ID, RegionEndpoint.USEast1); AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials); DynamoDBContext Context = new DynamoDBContext(client);

AmazonDynamoDBClient クラスは、DynamoDB API のエントリポイントです。このクラスには、他のアプリケーション間で、テーブルを作成、記述、更新、削除するインスタンスメソッドがあります。コンテキストによって、クライアントの抽象化レイヤーが追加され、オブジェクト永続性モデルなどの追加の機能を使用できるようになります。

テーブルの説明

DynamoDB テーブルの説明を取得するには、次のコードを使用します。

resultText.text +=("\n*** Retrieving table information ***\n"); var request = new DescribeTableRequest { TableName = @"ProductCatalog" }; Client.DescribeTableAsync(request, (result) => { if (result.Exception != null) { resultText.text += result.Exception.Message; Debug.Log(result.Exception); return; } var response = result.Response; TableDescription description = response.Table; resultText.text += ("Name: " + description.TableName + "\n"); resultText.text += ("# of items: " + description.ItemCount + "\n"); resultText.text += ("Provision Throughput (reads/sec): " + description.ProvisionedThroughput.ReadCapacityUnits + "\n"); resultText.text += ("Provision Throughput (reads/sec): " + description.ProvisionedThroughput.WriteCapacityUnits + "\n"); }, null); }

この例では、クライアントと DescribeTableRequest オブジェクトを作成し、テーブルの名前を TableName プロパティに割り当て、リクエストオブジェクトを AmazonDynamoDBClient オブジェクトの DescribeTableAsync メソッドに渡します。また、DescribeTableAsync では、非同期操作が完了すると委任されます。

注記

AmazonDynamoDBClient の非同期メソッドでは、非同期操作が完了すると必ず、委任が呼び出されます。

オブジェクトの保存

オブジェクトを DynamoDB に保存するには、AmazonDynamoDBClient オブジェクトの SaveAsync<T> メソッドを使用します。ここで、T は、保存するオブジェクトのタイプです。

データベースを「Bookstore」としたので、そのテーマに沿って、本に関する属性を記録するデータモデルを実装します。データモデルを定義するクラスは、次のとおりです。

[DynamoDBTable("ProductCatalog")] public class Book { [DynamoDBHashKey] // Hash key. public int Id { get; set; } [DynamoDBProperty] public string Title { get; set; } [DynamoDBProperty] public string ISBN { get; set; } [DynamoDBProperty("Authors")] // Multi-valued (set type) attribute. public List<string> BookAuthors { get; set; } }

もちろん、実店舗の書店アプリケーションでは、作者や価格などのフィールドを追加する必要があります。Book クラスは [DynamoDBTable] 属性で指定されており、この属性によって、Book が書き込まれるタイプのデータベーステーブルオブジェクトが定義されます。Book クラスの各インスタンスのキーは、[DynamoDBHashKey] 属性を使用して特定されます。プロパティは、[DynamoDBProperty] 属性を使用して識別されているため、プロパティが書き込まれるデータベーステーブルの列を指定します。データモデルを定義して、Book オブジェクトを作成、取得、更新、および削除するメソッドを書き込むことができます。

ボットを作成する

private void PerformCreateOperation() { Book myBook = new Book { Id = bookID, Title = "object persistence-AWS SDK for.NET SDK-Book 1001", ISBN = "111-1111111001", BookAuthors = new List<string> { "Author 1", "Author 2" }, }; // Save the book. Context.SaveAsync(myBook,(result)=>{ if(result.Exception == null) resultText.text += @"book saved"; }); }

本を取得する

private void RetrieveBook() { this.displayMessage += "\n*** Load book**\n"; Context.LoadAsync<Book>(bookID, (AmazonDynamoResult<Book> result) => { if (result.Exception != null) { this.displayMessage += ("LoadAsync error" +result.Exception.Message); Debug.LogException(result.Exception); return; } _retrievedBook = result.Response; this.displayMessage += ("Retrieved Book: " + "\nId=" + _retrievedBook.Id + "\nTitle=" + _retrievedBook.Title + "\nISBN=" + _retrievedBook.ISBN); string authors = ""; foreach(string author in _retrievedBook.BookAuthors) authors += author + ","; this.displayMessage += "\nBookAuthor= "+ authors; this.displayMessage += ("\nDimensions= "+ _retrievedBook.Dimensions.Length + " X " + _retrievedBook.Dimensions.Height + " X " + _retrievedBook.Dimensions.Thickness); }, null); }

本を更新する

private void PerformUpdateOperation() { // Retrieve the book. Book bookRetrieved = null; Context.LoadAsync<Book>(bookID,(result)=> { if(result.Exception == null ) { bookRetrieved = result.Result as Book; // Update few properties. bookRetrieved.ISBN = "222-2222221001"; // Replace existing authors list with this bookRetrieved.BookAuthors = new List<string> { "Author 1", "Author x" }; Context.SaveAsync<Book>(bookRetrieved,(res)=> { if(res.Exception == null) resultText.text += ("\nBook updated"); }); } }); }

本を削除する

private void PerformDeleteOperation() { // Delete the book. Context.DeleteAsync<Book>(bookID,(res)=> { if(res.Exception == null) { Context.LoadAsync<Book>(bookID,(result)=> { Book deletedBook = result.Result; if(deletedBook==null) resultText.text += ("\nBook is deleted"); }); } }); }