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 Shell の Azure CLI の最新バージョン。
- CLI 参照コマンドをローカルで実行する場合は、
az loginコマンドを使用して Azure CLI にサインインします。
- CLI 参照コマンドをローカルで実行する場合は、
- Node.js 22 以降
セットアップ中
まず、このガイドのアカウントと開発環境を設定します。 このセクションでは、アカウントの作成、資格情報の取得、開発環境の準備のプロセスについて説明します。
アカウントを作成する
まず、Apache Cassandra アカウント用の API を作成します。 アカウントが作成されたら、キースペースとテーブル リソースを作成します。
ターゲット リソース グループがまだない場合は、
az group createコマンドを使用して、サブスクリプションに新しいリソース グループを作成します。az group create \ --name "<resource-group-name>" \ --location "<location>"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"az cosmosdb cassandra keyspace createという名前のcosmicworksを使用して、新しいキースペースを作成します。az cosmosdb cassandra keyspace create \ --resource-group "<resource-group-name>" \ --account-name "<account-name>" \ --name "cosmicworks"複数行の 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"
資格情報の取得
ここで、最近作成したアカウントへの接続を作成するために使用するクライアント ライブラリのパスワードを取得します。
az cosmosdb showを使用して、アカウントの連絡先ポイントとユーザー名を取得します。az cosmosdb show \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --query "{username:name,contactPoint:documentEndpoint}"前のコマンドの出力の
contactPointプロパティとusernameプロパティの値を記録します。 これらのプロパティの値は、このガイドの後半でライブラリを使用してアカウントに接続するために使用する 連絡先ポイント と ユーザー名 です。az cosmosdb keys listを使用して、アカウントのキーを取得します。az cosmosdb keys list \ --resource-group "<resource-group-name>" \ --name "<account-name>" \ --type "keys"前のコマンドの出力の
primaryMasterKeyプロパティの値を記録します。 このプロパティの値は、このガイドの後半でライブラリを使用してアカウントに接続するために使用する パスワード です。
開発環境の準備
次に、新しいプロジェクトとクライアント ライブラリを使用して開発環境を構成します。 この手順は、このガイドの残りの部分に進む前に必要な最後の前提条件です。
空のフォルダーから開始します。
新しいモジュールを初期化します。
npm init es6 --yesノード パッケージ マネージャー (npm) から
cassandra-driverパッケージをインストールします。npm install --save cassandra-driverindex.js ファイルを作成します。
空のディレクトリから開始します。
新しいモジュールを初期化します。
npm init es6 --yesノード パッケージ マネージャー (npm) から
typescriptパッケージをインストールします。npm install --save-dev typescriptnpm から
tsxパッケージをインストールします。npm install --save-dev tsxnpm から
cassandra-driverパッケージをインストールします。npm install --save cassandra-driverコンパイラ (
tsc) を使用して TypeScript プロジェクトを初期化します。npx tsc --init --target es2017 --module es2022 --moduleResolution nodenextindex.ts ファイルを作成します。
オブジェクト モデル
| 説明 | |
|---|---|
Client |
クラスターへの特定の接続を表します |
Mapper |
クエリの実行に使用される Cassandra クエリ言語 (CQL) クライアント |
コード例
クライアントの認証
まず、このガイドで前に収集した資格情報を使用してクライアントを認証します。
統合開発環境 (IDE) で index.js ファイルを開きます。
cassandra-driverモジュールから次の型をインポートします。cassandracassandra.Clientcassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import cassandra from 'cassandra-driver'; const { Client } = cassandra; const { Mapper } = cassandra.mapping; const { PlainTextAuthProvider } = cassandra.auth;このガイドで前に収集した資格情報の文字列定数変数を作成します。 変数に
username、password、およびcontactPointという名前を付けます。const username = '<username>'; const password = '<password>'; const contactPoint = '<contact-point>';Azure Cosmos DB for Apache Cassandra アカウントを作成したリージョンに別の文字列変数を作成します。 この変数に
region名前を付けます。const region = '<azure-region>';前の手順で指定した資格情報を使用して、新しい
PlainTextAuthProviderオブジェクトを作成します。let authProvider = new PlainTextAuthProvider( username, password );前の手順で作成した資格情報と構成変数を使用して、
Clientオブジェクトを作成します。let client = new Client({ contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: { secureProtocol: 'TLSv1_2_method' }, });クラスターに非同期接続します。
await client.connect();cosmicworksキースペースとproductテーブルをターゲットとする新しいマッパーを作成します。 マッパーProductに名前を付けます。const mapper = new Mapper(client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });forModel関数とProductマッパー名を使用してマッパー インスタンスを生成します。const productMapper = mapper.forModel('Product');
統合開発環境 (IDE) で index.ts ファイルを開きます。
cassandra-driverモジュールから次の型をインポートします。cassandra.authcassandra.mappingcassandra.typescassandra.Clientcassandra.ClientOptionscassandra.mapping.Mappercassandra.auth.PlainTextAuthProvider
import { auth, mapping, types, Client, ClientOptions } from 'cassandra-driver'; const { Mapper } = mapping; const { PlainTextAuthProvider } = auth;このガイドで前に収集した資格情報の文字列定数変数を作成します。 変数に
username、password、およびcontactPointという名前を付けます。const username: string = '<username>'; const password: string = '<password>'; const contactPoint: string = '<contact-point>';Azure Cosmos DB for Apache Cassandra アカウントを作成したリージョンに別の文字列変数を作成します。 この変数に
region名前を付けます。const region: string = '<azure-region>';前の手順で指定した資格情報を使用して、新しい
PlainTextAuthProviderオブジェクトを作成します。let authProvider = new PlainTextAuthProvider( username, password );トランスポート層セキュリティ (TLS) 1.2 プロトコルを使用していることを確認するオプションを含む匿名オブジェクトを作成します。
let sslOptions = { secureProtocol: 'TLSv1_2_method' };前の手順で作成した資格情報と構成変数を使用して、
ClientOptionsオブジェクトを作成します。let clientOptions: ClientOptions = { contactPoints: [`${contactPoint}:10350`], authProvider: authProvider, localDataCenter: region, sslOptions: sslOptions };コンストラクターの
Client変数を使用して、clientOptionsオブジェクトを作成します。let client = new Client(clientOptions);クラスターに非同期接続します。
await client.connect();cosmicworksキースペースとproductテーブルをターゲットとする新しいマッパーを作成します。 マッパーProductに名前を付けます。const mapper = new Mapper( client, { models: { 'Product': { tables: ['product'], keyspace: 'cosmicworks' } } });forModel関数とProductマッパー名を使用してマッパー インスタンスを生成します。const productMapper = mapper.forModel('Product');
Warnung
このガイドでは、認証を簡略化するために、トランスポート層セキュリティ (TLS) の完全な検証が無効になっています。 運用環境のデプロイでは、検証を完全に有効にします。
データをアップサートする
次に、新しいデータをテーブルにアップサートします。 アップサートにより、同じデータがテーブルに既に存在するかどうかに応じて、データが適切に作成または置換されます。
productという名前の変数に新しいオブジェクトを作成します。const product = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', name: 'Yamba Surfboard', category: 'gear-surf-surfboards', quantity: 12, price: 850.00, clearance: false };前の手順で作成した
insert変数を渡すproduct関数を非同期で呼び出します。await productMapper.insert(product);
このガイドで前に作成したテーブルに対応するフィールドを使用して、
Productという名前の新しいインターフェイスを定義します。タイプ IdstringNamestringCategorystringQuantityintPricedecimalClearanceboolinterface Product { id: string; name: string; category: string; quantity: number; price: number; clearance: boolean; }ヒント
Node.jsでは、この型を別のファイルに作成することも、既存のファイルの末尾に作成することもできます。
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 };前の手順で作成した
insert変数を渡すproduct関数を非同期で呼び出します。await productMapper.insert(product);
データの読み取り
次に、テーブルにアップサートされたデータを読み取る。
filterという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つidという名前のプロパティを含めます。const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };get変数を渡すマッパーのfilter関数を呼び出します。 結果をmatchedProductという名前の変数に格納します。let matchedProduct = await productMapper.get(filter);
filterという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つidという名前のプロパティを含めます。const filter = { id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' };get変数を渡すマッパーのfilter関数を呼び出します。 結果を、matchedProduct型のProductという名前の変数に格納します。let matchedProduct: Product = await productMapper.get(filter);
データのクエリを実行する
最後に、クエリを使用して、テーブル内の特定のフィルターに一致するすべてのデータを検索します。
同じ
queryフィールドを持つ項目と一致する CQL クエリを使用して、categoryという名前の新しい文字列変数を作成します。const query = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;paramsという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つcategoryという名前のプロパティを含めます。const params = { category: 'gear-surf-surfboards' };execute変数とquery変数の両方を引数として渡すparams関数を非同期的に呼び出します。 結果のrowsプロパティをmatchedProductsという名前の変数として格納します。let { rows: matchedProducts } = await client.execute(query, params);製品の配列に対して
foreachメソッドを呼び出して、クエリ結果を反復処理します。matchedProducts.forEach(product => { // Do something here with each result });
同じ
queryフィールドを持つ項目と一致する CQL クエリを使用して、categoryという名前の新しい文字列変数を作成します。const query: string = ` SELECT * FROM cosmicworks.product WHERE category = :category ALLOW FILTERING `;paramsという名前の匿名オブジェクトを作成します。 このオブジェクトには、このガイドで前に作成した製品と同じ値を持つcategoryという名前のプロパティを含めます。const params = { category: 'gear-surf-surfboards' };execute変数とquery変数の両方を引数として渡すparams関数を非同期的に呼び出します。 結果を、result型のtypes.ResultSetという名前の変数に格納します。let result: types.ResultSet = await client.execute(query, params);結果の
rowsプロパティを、matchedProducts型のProduct[]という名前の変数として格納します。let matchedProducts: Product[] = result.rows;製品の配列に対して
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>"