次の方法で共有


クイック スタート: Node.js 用の Azure Cosmos DB for Apache Cassandra クライアント ライブラリ

Important

99.999% 可用性サービス レベル アグリーメント (SLA)、インスタント 自動スケール、および複数のリージョン間の自動フェールオーバーを使用した 大規模 なシナリオ向けのデータベース ソリューションをお探しですか? Azure Cosmos DB for NoSQL について考えてみましょう。

既存の Apache Cassandra アプリケーションを移行しますか? Azure Managed Instance for Apache Cassandra について考えてみましょう。

非構造化データの格納、管理、クエリを Node.js するための Azure Cosmos DB for Apache Cassandra クライアント ライブラリの使用を開始します。 このガイドの手順に従って、新しいアカウントの作成、Node.js クライアント ライブラリのインストール、アカウントへの接続、一般的な操作の実行、最終的なサンプル データのクエリを実行します。

API リファレンスのドキュメント | ライブラリのソース コード | パッケージ (npm)

[前提条件]

  • Azure サブスクリプション

    • Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Azure Cloud ShellAzure CLI の最新バージョン。

    • CLI 参照コマンドをローカルで実行する場合は、 az login コマンドを使用して Azure CLI にサインインします。
  • Node.js 22 以降

セットアップ中

まず、このガイドのアカウントと開発環境を設定します。 このセクションでは、アカウントの作成、資格情報の取得、開発環境の準備のプロセスについて説明します。

アカウントを作成する

まず、Apache Cassandra アカウント用の API を作成します。 アカウントが作成されたら、キースペースとテーブル リソースを作成します。

  1. ターゲット リソース グループがまだない場合は、 az group create コマンドを使用して、サブスクリプションに新しいリソース グループを作成します。

    az group create \
        --name "<resource-group-name>" \
        --location "<location>"
    
  2. az cosmosdb create コマンドを使用して、既定の設定で新しい Azure Cosmos DB for Apache Cassandra アカウントを作成します。

    az cosmosdb create \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --locations "regionName=<location>" \
        --capabilities "EnableCassandra"
    
  3. az cosmosdb cassandra keyspace createという名前のcosmicworksを使用して、新しいキースペースを作成します。

    az cosmosdb cassandra keyspace create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --name "cosmicworks"
    
  4. 複数行の Bash コマンドを使用して、スキーマを表す新しい JSON オブジェクトを作成します。 次に、 az cosmosdb cassandra table create コマンドを使用して、 productsという名前の新しいテーブルを作成します。

    schemaJson=$(cat <<EOF
    {
      "columns": [
        {
          "name": "id",
          "type": "text"
        },
        {
          "name": "name",
          "type": "text"
        },
        {
          "name": "category",
          "type": "text"
        },
        {
          "name": "quantity",
          "type": "int"
        },
        {
          "name": "price",
          "type": "decimal"
        },
        {
          "name": "clearance",
          "type": "boolean"
        }
      ],
      "partitionKeys": [
        {
          "name": "id"
        }
      ]
    }
    EOF
    )
    
    az cosmosdb cassandra table create \
        --resource-group "<resource-group-name>" \
        --account-name "<account-name>" \
        --keyspace-name "cosmicworks" \
        --name "product" \
        --schema "$schemaJson"
    

資格情報の取得

ここで、最近作成したアカウントへの接続を作成するために使用するクライアント ライブラリのパスワードを取得します。

  1. az cosmosdb showを使用して、アカウントの連絡先ポイントとユーザー名を取得します。

    az cosmosdb show \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --query "{username:name,contactPoint:documentEndpoint}"
    
  2. 前のコマンドの出力の contactPoint プロパティと username プロパティの値を記録します。 これらのプロパティの値は、このガイドの後半でライブラリを使用してアカウントに接続するために使用する 連絡先ポイントユーザー名 です。

  3. az cosmosdb keys listを使用して、アカウントのキーを取得します。

    az cosmosdb keys list \
        --resource-group "<resource-group-name>" \
        --name "<account-name>" \
        --type "keys"
    
  4. 前のコマンドの出力の primaryMasterKey プロパティの値を記録します。 このプロパティの値は、このガイドの後半でライブラリを使用してアカウントに接続するために使用する パスワード です。

開発環境の準備

次に、新しいプロジェクトとクライアント ライブラリを使用して開発環境を構成します。 この手順は、このガイドの残りの部分に進む前に必要な最後の前提条件です。

  1. 空のフォルダーから開始します。

  2. 新しいモジュールを初期化します。

    npm init es6 --yes
    
  3. ノード パッケージ マネージャー (npm) から cassandra-driver パッケージをインストールします。

    npm install --save cassandra-driver
    
  4. index.js ファイルを作成します。

  1. 空のディレクトリから開始します。

  2. 新しいモジュールを初期化します。

    npm init es6 --yes
    
  3. ノード パッケージ マネージャー (npm) から typescript パッケージをインストールします。

    npm install --save-dev typescript
    
  4. npm から tsx パッケージをインストールします。

    npm install --save-dev tsx
    
  5. npm から cassandra-driver パッケージをインストールします。

    npm install --save cassandra-driver
    
  6. コンパイラ (tsc) を使用して TypeScript プロジェクトを初期化します。

    npx tsc --init --target es2017 --module es2022 --moduleResolution nodenext
    
  7. index.ts ファイルを作成します。

オブジェクト モデル

説明
Client クラスターへの特定の接続を表します
Mapper クエリの実行に使用される Cassandra クエリ言語 (CQL) クライアント

コード例

クライアントの認証

まず、このガイドで前に収集した資格情報を使用してクライアントを認証します。

  1. 統合開発環境 (IDE) で index.js ファイルを開きます。

  2. cassandra-driver モジュールから次の型をインポートします。

    • cassandra
    • cassandra.Client
    • cassandra.mapping.Mapper
    • cassandra.auth.PlainTextAuthProvider
    import cassandra from 'cassandra-driver';
    
    const { Client } = cassandra;
    const { Mapper } = cassandra.mapping;
    const { PlainTextAuthProvider } = cassandra.auth;
    
  3. このガイドで前に収集した資格情報の文字列定数変数を作成します。 変数に usernamepassword、および contactPointという名前を付けます。

    const username = '<username>';
    const password = '<password>';
    const contactPoint = '<contact-point>';
    
  4. Azure Cosmos DB for Apache Cassandra アカウントを作成したリージョンに別の文字列変数を作成します。 この変数に region名前を付けます。

    const region = '<azure-region>';
    
  5. 前の手順で指定した資格情報を使用して、新しい PlainTextAuthProvider オブジェクトを作成します。

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. 前の手順で作成した資格情報と構成変数を使用して、 Client オブジェクトを作成します。

    let client = new Client({
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: {
            secureProtocol: 'TLSv1_2_method'
        },
    });
    
  7. クラスターに非同期接続します。

    await client.connect();
    
  8. cosmicworksキースペースとproductテーブルをターゲットとする新しいマッパーを作成します。 マッパー Productに名前を付けます。

    const mapper = new Mapper(client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  9. forModel関数とProductマッパー名を使用してマッパー インスタンスを生成します。

    const productMapper = mapper.forModel('Product');
    
  1. 統合開発環境 (IDE) で index.ts ファイルを開きます。

  2. cassandra-driver モジュールから次の型をインポートします。

    • cassandra.auth
    • cassandra.mapping
    • cassandra.types
    • cassandra.Client
    • cassandra.ClientOptions
    • cassandra.mapping.Mapper
    • cassandra.auth.PlainTextAuthProvider
    import { auth, mapping, types, Client, ClientOptions } from 'cassandra-driver';
    
    const { Mapper } = mapping;
    const { PlainTextAuthProvider } = auth;
    
  3. このガイドで前に収集した資格情報の文字列定数変数を作成します。 変数に usernamepassword、および contactPointという名前を付けます。

    const username: string = '<username>';
    const password: string = '<password>';
    const contactPoint: string = '<contact-point>';
    
  4. Azure Cosmos DB for Apache Cassandra アカウントを作成したリージョンに別の文字列変数を作成します。 この変数に region名前を付けます。

    const region: string = '<azure-region>';
    
  5. 前の手順で指定した資格情報を使用して、新しい PlainTextAuthProvider オブジェクトを作成します。

    let authProvider = new PlainTextAuthProvider(
        username,
        password
    );
    
  6. トランスポート層セキュリティ (TLS) 1.2 プロトコルを使用していることを確認するオプションを含む匿名オブジェクトを作成します。

    let sslOptions = {
        secureProtocol: 'TLSv1_2_method'
    };
    
  7. 前の手順で作成した資格情報と構成変数を使用して、 ClientOptions オブジェクトを作成します。

    let clientOptions: ClientOptions = {
        contactPoints: [`${contactPoint}:10350`],
        authProvider: authProvider,
        localDataCenter: region,
        sslOptions: sslOptions
    };
    
  8. コンストラクターの Client 変数を使用して、clientOptions オブジェクトを作成します。

    let client = new Client(clientOptions);
    
  9. クラスターに非同期接続します。

    await client.connect();
    
  10. cosmicworksキースペースとproductテーブルをターゲットとする新しいマッパーを作成します。 マッパー Productに名前を付けます。

    const mapper = new Mapper( client, {
        models: {
            'Product': {
                tables: ['product'],
                keyspace: 'cosmicworks'
            }
        }
    });
    
  11. forModel関数とProductマッパー名を使用してマッパー インスタンスを生成します。

    const productMapper = mapper.forModel('Product');
    

Warnung

このガイドでは、認証を簡略化するために、トランスポート層セキュリティ (TLS) の完全な検証が無効になっています。 運用環境のデプロイでは、検証を完全に有効にします。

データをアップサートする

次に、新しいデータをテーブルにアップサートします。 アップサートにより、同じデータがテーブルに既に存在するかどうかに応じて、データが適切に作成または置換されます。

  1. productという名前の変数に新しいオブジェクトを作成します。

    const product = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        name: 'Yamba Surfboard',
        category: 'gear-surf-surfboards',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
  2. 前の手順で作成したinsert変数を渡すproduct関数を非同期で呼び出します。

    await productMapper.insert(product);
    
  1. このガイドで前に作成したテーブルに対応するフィールドを使用して、 Product という名前の新しいインターフェイスを定義します。

    タイプ
    Id string
    Name string
    Category string
    Quantity int
    Price decimal
    Clearance bool
    interface Product {
        id: string;
        name: string;
        category: string;
        quantity: number;
        price: number;
        clearance: boolean;
    }
    

    ヒント

    Node.jsでは、この型を別のファイルに作成することも、既存のファイルの末尾に作成することもできます。

  2. Product型の新しいオブジェクトを作成します。 オブジェクトを product という名前の変数に格納します。

    const product: Product = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        name: 'Yamba Surfboard',
        category: 'gear-surf-surfboards',
        quantity: 12,
        price: 850.00,
        clearance: false
    };
    
  3. 前の手順で作成したinsert変数を渡すproduct関数を非同期で呼び出します。

    await productMapper.insert(product);
    

データの読み取り

次に、テーブルにアップサートされたデータを読み取る。

  1. filterという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つ id という名前のプロパティを含めます。

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. get変数を渡すマッパーのfilter関数を呼び出します。 結果を matchedProduct という名前の変数に格納します。

    let matchedProduct = await productMapper.get(filter);
    
  1. filterという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つ id という名前のプロパティを含めます。

    const filter = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
    };
    
  2. get変数を渡すマッパーのfilter関数を呼び出します。 結果を、matchedProduct型のProductという名前の変数に格納します。

    let matchedProduct: Product = await productMapper.get(filter);
    

データのクエリを実行する

最後に、クエリを使用して、テーブル内の特定のフィルターに一致するすべてのデータを検索します。

  1. 同じquery フィールドを持つ項目と一致する CQL クエリを使用して、categoryという名前の新しい文字列変数を作成します。

    const query = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. paramsという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つ category という名前のプロパティを含めます。

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. execute変数とquery変数の両方を引数として渡すparams関数を非同期的に呼び出します。 結果の rows プロパティを matchedProducts という名前の変数として格納します。

    let { rows: matchedProducts } = await client.execute(query, params);
    
  4. 製品の配列に対して foreach メソッドを呼び出して、クエリ結果を反復処理します。

    matchedProducts.forEach(product => {
        // Do something here with each result
    });
    
  1. 同じquery フィールドを持つ項目と一致する CQL クエリを使用して、categoryという名前の新しい文字列変数を作成します。

    const query: string = `
    SELECT
        *
    FROM
        cosmicworks.product
    WHERE
        category = :category
    ALLOW FILTERING
    `;
    
  2. paramsという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つ category という名前のプロパティを含めます。

    const params = {
        category: 'gear-surf-surfboards'
    };
    
  3. execute変数とquery変数の両方を引数として渡すparams関数を非同期的に呼び出します。 結果を、result型のtypes.ResultSetという名前の変数に格納します。

    let result: types.ResultSet = await client.execute(query, params);
    
  4. 結果のrowsプロパティを、matchedProducts型のProduct[]という名前の変数として格納します。

    let matchedProducts: Product[] = result.rows;
    
  5. 製品の配列に対して foreach メソッドを呼び出して、クエリ結果を反復処理します。

    matchedProducts.forEach((product: Product) => {
        // Do something here with each result
    });
    

コードを実行する

アプリケーション ディレクトリのターミナルを使用して、新しく作成したアプリケーションを実行します。

node index.js
npx tsx index.ts

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

アカウントが不要になったら、リソースを削除して Azure サブスクリプションからアカウント を削除 します。

az cosmosdb delete \
    --resource-group "<resource-group-name>" \
    --name "<account-name>"

次のステップ