Azure Functions と Azure Cosmos DB を使用して非構造化データを格納する

Azure Cosmos DB は、非構造化 JSON データを格納するうえで最適な手段です。 Cosmos DB は、Azure Functions と連携させると、リレーショナル データベースにデータを格納する場合よりもはるかに少ないコードですばやく簡単にデータを格納することができます。

注意

現時点で、Azure Cosmos DB トリガー、入力バインディング、出力バインディングは、SQL API アカウントと Graph API アカウントにのみ使用できます。

Azure Functions では、入力および出力バインディングによって、関数から外部サービス データに接続する宣言方法が提供されます。 この記事では、Azure Cosmos DB ドキュメント内に非構造化データを格納する出力バインディングを追加するように既存の関数を更新する方法について説明します。

前提条件

このチュートリアルを完了するには、以下が必要です。

このトピックでは、「Azure Portal で初めての関数を作成する」で作成したリソースを使用して作業を開始します。 リソースの作成が済んでいない場合は、作成手順に従って Function App をすぐに作成してください。

Azure Cosmos DB アカウントを作成する

出力バインディングを作成する前に、SQL API を使用する Azure Cosmos DB アカウントが必要です。

  1. Azure portal のメニューまたは [ホーム] ページで、 [リソースの作成] を選択します。

  2. [新規] ページで、 [Azure Cosmos DB] を検索して選択します。

  3. [Azure Cosmos DB] ページで、 [作成] を選択します。

  4. [Azure Cosmos DB アカウントの作成] ページで、新しい Azure Cosmos アカウントの基本的な設定を入力します。

    設定 説明
    サブスクリプション サブスクリプション名 この Azure Cosmos アカウントに使用する Azure サブスクリプションを選択します。
    リソース グループ リソース グループ名 リソース グループを選択するか、 [新規作成] を選択し、新しいリソース グループの一意の名前を入力します。
    アカウント名 一意の名前 自分の Azure Cosmos アカウントを識別するための名前を入力します。 指定した名前に documents.azure.com が付加されて URI が作成されるので、一意の名前を使用してください。

    名前に含めることができるのは、英小文字、数字、ハイフン (-) のみです。 長さは 3 文字から 44 文字でなければなりません。
    API 作成するアカウントの種類。 ドキュメント データベースを作成し、SQL 構文を使用してクエリを実行するには、 [コア (SQL)] を選択します。

    API によって、作成するアカウントの種類が決まります。 Azure Cosmos DB には、5 種類の API が用意されています。ドキュメント データ用のコア (SQL) と MongoDB、グラフ データ用の Gremlin、Azure Table、Cassandra です。 現在は、API ごとに別のアカウントを作成する必要があります。
    容量モード プロビジョニング スループットまたはサーバーレス プロビジョニング スループット モードでアカウントを作成するには、 [Provisioned throughput](プロビジョニング スループット) を選択します。 サーバーレス モードでアカウントを作成するには、 [サーバーレス] を選択します。
    Apply Free Tier Discount (Free レベルの割引の適用) [適用] または [適用しない] Azure Cosmos DB Free レベルのアカウントでは、最初の 400 RU/秒と 5 GB のストレージを無料でご利用いただけます。 Free レベルの詳細を確認してください。
    場所 ユーザーに最も近いリージョン Azure Cosmos DB アカウントをホストする地理的な場所を選択します。 データに最も高速にアクセスできるよう、お客様のユーザーに最も近い場所を使用します。
    アカウントの種類 [運用] または [Non-Production](非運用) アカウントが運用ワークロードに使用される場合は、 [運用] を選択します。 アカウントが非運用環境 (開発、テスト、QA、ステージングなど) に使用される場合は、 [Non-Production](非運用) を選択します。 これは、ポータルでの操作を調整する Azure リソース タグの設定ですが、基になる Azure Cosmos DB アカウントには影響しません。 この値は、いつでも変更できます。

    注意

    Azure サブスクリプションにつき所有できる Free レベルの Azure Cosmos DB アカウントは 1 つまでです。また、アカウントの作成時にオプトインする必要があります。 Free レベルの割引を適用するオプションが表示されない場合は、サブスクリプション内の別のアカウントが Free レベルで既に有効になっていることを意味します。

    注意

    [Capacity mode](容量モード) として [サーバーレス] を選択した場合、以下のオプションは利用できません。

    • Apply Free Tier Discount (Free レベルの割引の適用)
    • geo 冗長
    • マルチリージョン ライター

    Azure Cosmos DB の新しいアカウント ページ

  5. [Review + create](レビュー + 作成) を選択します。 [ネットワーク] セクションと [タグ] セクションはスキップできます。

  6. アカウントの設定を確認し、 [作成] を選択します。 アカウントの作成には数分かかります。 ポータル ページに "デプロイが完了しました" と表示されるまで待ちます。

    Azure portal の [通知] ペイン

  7. [リソースに移動] を選択し、Azure Cosmos DB アカウント ページに移動します。

    Azure Cosmos DB アカウント ページ

出力バインディングを追加する

  1. Azure portal で、前に作成した関数アプリに移動して選択します。

  2. [関数] を選択し、HttpTrigger 関数を選択します。

    Azure portal で Http 関数を選択する。

  3. [統合] を選択し、 [+ 出力を追加する] を選択します。

    Azure Cosmos DB 出力バインディングを追加する。

  4. 次の表に指定されている [出力の作成] 設定を使用します。

    Azure Cosmos DB 出力バインディングを構成する。

    設定 推奨値 説明
    バインドの種類 Azure Cosmos DB Azure Cosmos DB への出力バインディングを作成するために選択するバインディングの種類の名前。
    [ドキュメント パラメーター名] taskDocument コード内で Cosmos DB オブジェクトを指す名前。
    データベース名 taskDatabase ドキュメントを保存するデータベースの名前。
    [コレクション名] taskCollection データベース コレクションの名前
    [If true, creates the Cosmos DB database and collection](オンの場合、Cosmos DB データベースとコレクションを作成する) はい コレクションはまだ存在していないため、作成します。
    Cosmos DB アカウント接続 新しい設定 [新規] を選択します。Azure Cosmos DB アカウント と前の手順で作成した データベース アカウント を選択し、 [OK] を選択します。 アカウントの接続のアプリケーション設定を作成します。 この設定は、データベースへの接続へのバインディングによって使用されます。
  5. [OK] を選択してバインディングを作成します。

関数コードを更新する

既存の関数コードを、次の選択した言語のコードに置き換えます。

既存の C# 関数を次のコードに置き換えます。

#r "Newtonsoft.Json"

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

public static IActionResult Run(HttpRequest req, out object taskDocument, ILogger log)
{
    string name = req.Query["name"];
    string task = req.Query["task"];
    string duedate = req.Query["duedate"];

    // We need both name and task parameters.
    if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(task))
    {
        taskDocument = new
        {
            name,
            duedate,
            task
        };

        return (ActionResult)new OkResult();
    }
    else
    {
        taskDocument = null;
        return (ActionResult)new BadRequestResult();
    }
}

このサンプル コードは、HTTP 要求のクエリ文字列を読み取り、それらを taskDocument オブジェクトのフィールドに代入します。 taskDocument バインディングは、このバインディング パラメーターのオブジェクト データを、バインドされたドキュメント データベースに格納されるように送信します。 データベースは、関数が初めて実行されるときに作成されます。

関数とデータベースをテストする

  1. [Test/Run](テストと実行) を選択します。 [クエリ] の下の [+ パラメーターの追加] を選択し、クエリ文字列に以下のパラメーターを追加します。

    • name
    • task
    • duedate

    関数をテストする。

  2. [実行] を選択して、200 状態が返されることを確認します。

    [実行] を選択した後で HTTP 応答コード 200 状態が強調表示されているスクリーンショット。

  3. Azure portal で、Azure Cosmos DB を検索して選択します。

    Cosmos DB サービスを検索する。

  4. 対象の Azure Cosmos DB アカウントを選択してから、 [データ エクスプローラー] を選択します。

  5. [TaskCollection] ノードを展開して新しいドキュメントを選択し、ドキュメントにクエリ文字列値といくつかの追加のメタデータが含まれていることを確認します。

    ドキュメント内の文字列値を確認する。

Azure Cosmos DB に非構造化データを格納するバインディングを HTTP トリガーに正常に追加できました。

リソースをクリーンアップする

前の手順では、リソース グループ内に Azure リソースを作成しました。 これらのリソースが将来必要になると思わない場合は、リソース グループを削除してリソースを削除できます。

Azure portal メニューまたは [ホーム] ページから、 [リソース グループ] を選択します。 次に、 [リソース グループ] ページで [myResourceGroup] を選択します。

[myResourceGroup] ページで、一覧表示されたリソースが、削除しようとするリソースであることを確認します。

[リソース グループの削除] を選択し、確認のためテキスト ボックスに「myResourceGroup」と入力して、 [削除] を選択します。

次のステップ

Cosmos DB データベースへのバインドの詳細については、「Azure Functions における Cosmos DB のバインド」を参照してください。