Ruby から Azure Table Storage と Azure Cosmos DB for Table を使用する方法

適用対象: テーブル

警告

このプロジェクトは、ライフサイクルの コミュニティ サポート 段階にあります。 最終的に、関連付けられているすべてのクライアント ライブラリは完全に廃止されます。 このプロジェクトを使用するための廃止と代替方法の詳細については、「 廃止に関する通知: Azure Storage PHP クライアント ライブラリ」を参照してください。

ヒント

この記事の内容は、Azure Table Storage と Azure Cosmos DB for Table に適用されます。 Table 用 API は、スループット最適化テーブル、グローバル分散、自動セカンダリ インデックスを提供するテーブル ストレージ向けの Premium オファリングです。

この記事では、テーブルの作成、データの格納、データに対する CRUD 操作の実行を行う方法について説明します。 Azure Table service または Azure Cosmos DB for Table のいずれかを選択してください。 この記事で説明するサンプルは Ruby で記述され、Ruby 用 Azure Storage Table クライアント ライブラリを使用しています。 紹介するシナリオは、テーブルの作成、テーブルの削除、エンティティの挿入、テーブルからのエンティティのクエリの実行などです。

Azure サービス アカウントを作成する

Azure Table ストレージまたは Azure Cosmos DB を使用してテーブルを操作できます。 これら 2 つのサービスのテーブル サービスの違いについては、Table 用 API の概要に関するページを参照してください。 使用するサービスのアカウントを作成する必要があります。 以下のセクションでは、Azure Table ストレージと Azure Cosmos DB アカウントの両方を作成する方法について説明しますが、そのうちの 1 つのみを使用できます。

Azure Table Storage

Azure ストレージ アカウントを作成する最も簡単な方法は、Azure portal を利用することです。 詳細については、「 ストレージ アカウントの作成」を参照してください。

Azure PowerShell または Azure CLI を使って、Azure Storage アカウントを作成することもできます。

現時点でストレージ アカウントを作成しない場合は、Azure Storage エミュレーターを使って、ローカル環境でコードの実行とテストを行うこともできます。 詳細については、「開発とテストのための Azure のストレージ エミュレーター使用」を参照してください。

Azure Cosmos DB for Table

Azure Cosmos DB for Table アカウントの作成手順については、「データベース アカウントの作成」を参照してください。

Azure Storage または Azure Cosmos DB へのアクセスを追加する

Azure Storage または Azure Cosmos DB を使用するには、Ruby Azure パッケージをダウンロードして使用します。 このパッケージには、Table REST サービスと通信する便利なライブラリのセットが含まれています。

RubyGems を使用してパッケージを取得する

  1. PowerShell (Windows)、ターミナル (Mac)、Bash (Unix) などのコマンド ライン インターフェイスを使用します。
  2. コマンド ウィンドウに「gem install azure-storage-table」と入力して、gem と依存関係をインストールします。

パッケージをインポートする

任意のテキスト エディターを使用して、Storage を使用する Ruby ファイルの先頭に次のコードを追加します。

require "azure/storage/table"

接続文字列を追加する

Azure Storage アカウントまたは Azure Cosmos DB for Table アカウントのいずれかに接続できます。 使用しているアカウントの種類に基づいて接続文字列を取得します。

Azure Storage 接続を追加する

Azure Storage モジュールは、Azure ストレージ アカウントに接続するために必要な情報として、環境変数 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_ACCESS_KEY を読み取ります。 これらの環境変数が設定されていない場合は、次のコードで Azure::Storage::Table::TableService を使用する前に、アカウント情報を指定する必要があります。

Azure.config.storage_account_name = "<your Azure Storage account>"
Azure.config.storage_access_key = "<your Azure Storage access key>"

Azure ポータルでクラシックまたは Resource Manager ストレージ アカウントからこれらの値を取得するには:

  1. Azure ポータルにサインインします。
  2. 使用するストレージ アカウントを表示します。
  3. [設定] ページで、[ アクセス キー] を選択します。
  4. [アクセス キー] ページで、アクセス キー 1 とアクセス キー 2 を確認します。 これらのキーのいずれかを使用できます。
  5. コピー アイコンをクリックして、キーをクリップボードにコピーします。

Azure Cosmos DB の接続を追加する

Azure Cosmos DB に接続するには、Azure Portal からプライマリ接続文字列をコピーし、コピーした接続文字列を使って Client オブジェクトを作成します。 TableService オブジェクトの作成時に Client オブジェクトを渡すことができます。

common_client = Azure::Storage::Common::Client.create(storage_account_name:'myaccount', storage_access_key:'mykey', storage_table_host:'mycosmosdb_endpoint')
table_client = Azure::Storage::Table::TableService.new(client: common_client)

テーブルを作成する

Azure::Storage::Table::TableService オブジェクトを使用して、テーブルとエンティティを操作できます。 テーブルを作成するには、create_table() メソッドを使用します。 次の例では、テーブルを作成するか、エラーがある場合にエラーを出力します。

azure_table_service = Azure::Storage::Table::TableService.new
begin
    azure_table_service.create_table("testtable")
rescue
    puts $!
end

エンティティをテーブルに追加する

エンティティを追加するには、エンティティのプロパティを定義するハッシュ オブジェクトを最初に作成します。 すべてのエンティティに対して、 PartitionKeyRowKey を指定する必要があります。 これらのエンティティはエンティティの一意の識別子であり、他のプロパティよりも高速にクエリできる値です。 Azure Storage では、テーブルのエンティティを多数のストレージ ノードに自動的に配布するために PartitionKey を使用します。 PartitionKey が同じエンティティは同じノードに格納されます。 RowKey は、エンティティが属するパーティション内のエンティティの一意の ID です。

entity = { "content" => "test entity",
    :PartitionKey => "test-partition-key", :RowKey => "1" }
azure_table_service.insert_entity("testtable", entity)

エンティティを更新する

既存のエンティティを更新するには、複数のメソッドがあります。

説明
update_entity() 既存のエンティティを置換することで更新します。
merge_entity() 新しいプロパティ値を既存のエンティティにマージすることで既存のエンティティを更新します。
insert_or_merge_entity() 既存のエンティティを置換することで更新します。 エンティティが存在しない場合は、新しいエンティティが挿入されます。
insert_or_replace_entity() 新しいプロパティ値を既存のエンティティにマージすることで既存のエンティティを更新します。 エンティティが存在しない場合は、新しいエンティティが挿入されます。

次の例は、update_entity() を使用してエンティティを更新する方法を示しています。

entity = { "content" => "test entity with updated content",
    :PartitionKey => "test-partition-key", :RowKey => "1" }
azure_table_service.update_entity("testtable", entity)

update_entity()merge_entity()では、更新するエンティティが存在しない場合、更新操作は失敗します。 したがって、既に存在しているかどうかに関係なくエンティティを格納するには、insert_or_replace_entity() または insert_or_merge_entity() を使用する必要があります。

エンティティのグループを操作する

状況によって、複数の操作をバッチとして送信し、サーバーによるアトミック処理を行うことが合理的である場合があります。 このためには、まず Batch オブジェクトを作成し、次に TableServiceexecute_batch() メソッドを使用します。 次の例では、RowKey が 2 および 3 である 2 つのエンティティをバッチで送信する方法を示します。 これは、同じ PartitionKey を持つエンティティでのみ機能することに注意してください。

azure_table_service = Azure::TableService.new
batch = Azure::Storage::Table::Batch.new("testtable",
    "test-partition-key") do
    insert "2", { "content" => "new content 2" }
    insert "3", { "content" => "new content 3" }
end
results = azure_table_service.execute_batch(batch)

エンティティを照会する

テーブル内のエンティティを照会するには、get_entity() メソッドを使用して、テーブル名、PartitionKey、および RowKey を渡します。

result = azure_table_service.get_entity("testtable", "test-partition-key",
    "1")

エンティティのセットを照会する

テーブル内のエンティティのセットを照会するには、クエリ ハッシュ オブジェクトを作成し、query_entities() メソッドを使用します。 次の例では、同じ PartitionKeyを持つエンティティをすべて取得します。

query = { :filter => "PartitionKey eq 'test-partition-key'" }
result, token = azure_table_service.query_entities("testtable", query)

注意

結果セットが大きすぎて単一のクエリで返すことができない場合は、継続トークンが返されます。この継続トークンを使用して、後続のページを取得できます。

エンティティ プロパティのサブセットを照会する

テーブルに対するクエリでは、ごくわずかのプロパティだけをエンティティから取得できます。 この "プロジェクション" 手法は帯域幅を削減し、特に大規模なエンティティの場合はクエリのパフォーマンスを向上させることができます。 select 句を使用して、クライアントに渡すプロパティの名前を指定します。

query = { :filter => "PartitionKey eq 'test-partition-key'",
    :select => ["content"] }
result, token = azure_table_service.query_entities("testtable", query)

エンティティを削除する

エンティティを削除するには、delete_entity() メソッドを使用します。 目的のエンティティを含んでいるテーブルの名前、PartitionKey、および エンティティの RowKey を渡します。

azure_table_service.delete_entity("testtable", "test-partition-key", "1")

テーブルを削除する

テーブルを削除するには、delete_table() を使用して、削除するテーブルの名前を渡します。

azure_table_service.delete_table("testtable")