Azure Managed Service Column <Azure運用コラム>

Azureテーブルの紹介

Category: 実践編

2020.10.30

Azure テーブルとは

Azure ストレージが提供する4つ目のサービス、Azure テーブルを紹介します。

Azure テーブルは、NoSQL データベースサービスです。「NoSQL データベースって何?」という方は「リレーショナルデータベースとNoSQLデータベースの違いとは?」を御覧ください。

NoSQL データベースサービスがストレージサービスの一機能というのは、他のクラウドを使ったことのある方からすると違和感があるかもしれませんが、データの格納先として Azure ストレージを利用している、と考えていただくと納得できるかと思います。(Azure キューのときと同じことを言っています。)

Azure テーブルの構成要素

テーブル、エンティティ、プロパティの3つの要素から構成されます。

テーブルは、ストレージアカウント内に最初に作る要素です。リレーショナルデータベースでのテーブルとほぼ同じです。ただし、スキーマを持たない、というのが NoSQL の特徴です。

エンティティは、テーブルのなかに作成するもので、プロパティのセットでもあります。リレーショナルデータベースでいう「行」に相当します。

プロパティは、エンティティのなかに作成するもので、Key と Value のペアです。

Azure ポータルから利用してみる

実際に使ってみることで、テーブル、エンティティ、プロパティについて理解しましょう。

まずは、Azure キューのときと同じく、Azure テーブル専用のストレージアカウントを用意します。また、ネットワーク的なアクセス制限も掛けない状態とします。ストレージアカウントが用意できたら、左メニューの [テーブル] からテーブルを作成します。今回は “food” テーブルを作ることにします。

Storage Explorer の画面からデータベースの中身を見ることができます。また、ここからエンティティを追加することもできます。

試しに1つ、エンティティを追加してみましょう。PartitionKey と Rowkey は必ず指定しなければなりません。そして、PartitionKey と Rowkey の組み合わせはテーブル内でユニークである必要があります。Azure テーブルは、この2つの値から自動的にインデックスを作成します。本コラムでは詳しく触れませんが、PartitionKey と Rowkey に何を指定するかはパフォーマンスに大きく影響するため、テーブル設計の肝となります。今回は、PartitionKey に「カテゴリ」、Rowkey には「名前」を入れることにします。

テーブルは固定のスキーマを持ちませんから、以下のようにエンティティごとにバラバラのプロパティを持たせることもできます。プロパティが存在しない箇所については、value に “null” が入ります。

もちろん、[クエリ] から検索することも可能です。

function から利用してみる

イメージを掴んでもらうために Azure ポータル上からエンティティの追加を行っていましたが、アプリケーションで利用する場合は REST API 経由でアクセスします。本コラムでは簡単なサンプルとして、「Azure キュー」のコラムにて作成した function からアクセスさせてみましょう。以下のような「ユーザから HTTP アクセスがあった際に、クエリの内容をテーブルに書き込む」というアプリケーションを作成してみます。

function B に相当する function を開きます。左メニューにある [統合] を開き、[出力] に Azure Table Storage を指定します。以下のように、接続先となるストレージアカウントと、テーブル名を入力します。テーブルを事前に作成いておく必要はありません。

index.js には、以下のコードを貼り付けます。RowKey にキューメッセージの ID、Message にはメッセージの内容を挿入する簡単なアプリケーションです。

module.exports = function (context,message) {

    context.bindings.outputTable = [];

    context.bindings.outputTable.push({
        PartitionKey: "Queue",
        RowKey: context.bindingData.id,
        Message: message
    });
    
    context.done();
};

function A の URL にクエリをくっつけて、アクセスしてみます。

$ curl 'https://xxxxxxxxxxxx.azurewebsites.net/api/HttpTrigger-func?code=4GualX18fc0Lh04uELbxLixBd67qT1J0WFHuKmHqmIKtXz4tNDoHHg==&name=hoge'
$ curl 'https://xxxxxxxxxxxx.azurewebsites.net/api/HttpTrigger-func?code=4GualX18fc0Lh04uELbxLixBd67qT1J0WFHuKmHqmIKtXz4tNDoHHg==&name=fuga'
$ curl 'https://xxxxxxxxxxxx.azurewebsites.net/api/HttpTrigger-func?code=4GualX18fc0Lh04uELbxLixBd67qT1J0WFHuKmHqmIKtXz4tNDoHHg==&name=piyo'

以下の通り、3つのエンティティが追加されていることがわかります。

まとめ

本コラムでは、Azure ストレージの機能である Azure テーブルの紹介をしました。また、function を利用して簡単なアプリケーションを作成することで、Azure テーブルの使い方についても説明しました。本コラムを通して、Azure テーブル、及び、NoSQL データベースがどのように利用されるか、イメージの一助になれば幸いです。

おまけ. Azure テーブルと Azure Cosmos DB

Azure には、Azure Cosmos DB というフルマネージド NoSQL データベースサービスが存在します。最大の特徴は「マルチモデル」というところであり、SQL SQL、MongoDB、Table、Gremlin、Cassandra から好きなデータベースモデルと API を選択することができます。お気づきかと思いますが、選択対象に Table が入っていますから、Cosmos DB の1モデルとして Azure テーブルとほぼ同等の機能を利用することが可能です。

Cosmos DB は非常に強力なマネージドサービスであり、世界中のリージョンにレプリカを配置したり、スケーリングしたりといったことが簡単にできるだけではなく、読み込み・書き込みの両方に対して 99 パーセンタイルでの 10 ミリ秒未満の待機時間を保証しています。(非常に高速ということです。)

ミッションクリティカルなシステムに Azure テーブルを検討されている方は、Azure Cosmos DB も選択肢に入れていただくとよろしいかと思います。

Tag: Azurテーブル

Contactお問い合わせ

お見積もり・ご相談など、お気軽にお問い合わせください。

single.php