このチュートリアルでは、Azure DocumentDB に接続する Node.js Web アプリケーションを構築します。 MongoDB、Express、React.js、Node.js (MERN) スタックは、多くの最新の Web アプリケーションを構築するために使用される一般的なテクノロジのコレクションです。 Azure DocumentDB を使用すると、新しい Web アプリケーションを構築したり、既に使い慣れている MongoDB ドライバーを使用して既存のアプリケーションを移行したりできます。 このチュートリアルでは、次の操作を行います。
- 環境を設定する
- ローカル MongoDB コンテナーを使用して MERN アプリケーションをテストする
- クラスターを使用して MERN アプリケーションをテストする
- MERN アプリケーションを Azure App Service にデプロイする
[前提条件]
このチュートリアルを完了するには、以下のリソースが必要です。
Azure サブスクリプション
- Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください
既存の Azure DocumentDB クラスター
- クラスターがない場合は、新しいクラスターを作成します
- GitHub Codespaces エンタイトルメントを持つ GitHub アカウント
開発環境の設定
開発コンテナー環境は、このプロジェクトのすべての演習を完了するために必要なすべての依存関係と共に使用できます。 開発コンテナーは、GitHub Codespaces で実行することも、Visual Studio Code を使用してローカルで実行することもできます。
GitHub Codespaces は、Visual Studio Code for the Web をユーザー インターフェイスとして使用して GitHub によって管理される開発コンテナーを実行します。 最も簡単な開発環境では、GitHub Codespaces を使用して、このトレーニング モジュールを完了するための適切な開発者ツールと依存関係がプレインストールされるようにします。
Important
すべての GitHub アカウントでは、2 つのコア インスタンスで毎月最大 60 時間無料で Codespaces を使用できます。
mainGitHub リポジトリのazure-samples/msdocs-azure-cosmos-db-mongodb-mern-web-appブランチに新しい GitHub Codespace を作成するプロセスを開始します。[コードスペース の作成] ページで、コードスペースの構成設定を確認し、[新しいコードスペースの作成] を選択します。
Codespace が起動するまで待ちます。 このスタートアップ プロセスには数分かかる場合があります。
コードスペースで新しいターミナルを開きます。
このチュートリアルで使用するツールのバージョンを確認します。
docker --version node --version npm --version az --version注
このチュートリアルでは、環境にプレインストールされている次のバージョンの各ツールが必要です。
Tool Version Docker 20.10.0 以上 Node.js ≥ 18.0150 npm ≥ 9.5.0 Azure CLI ≥ 2.46.0 ターミナルを閉じます。
このチュートリアルの残りの手順は、この開発コンテナーのコンテキストで行われます。
MongoDB コンテナーを使用して MERN アプリケーションの API をテストする
まず、ローカル MongoDB コンテナーを使用してサンプル アプリケーションの API を実行し、アプリケーションが動作することを検証します。
Docker を使用して MongoDB コンテナーを実行し、一般的な MongoDB ポート (
27017) を発行します。docker pull mongo:6.0 docker run --detach --publish 27017:27017 mongo:6.0サイド バーで、MongoDB 拡張機能を選択します。
接続文字列
mongodb://localhostを使用して、MongoDB 拡張機能に新しい接続を追加します。
接続が成功したら、 data/products.mongodb プレイグラウンド ファイルを開きます。
[ すべて実行 ] アイコンを選択してスクリプトを実行します。
プレイグラウンドの実行により、ローカル MongoDB コレクション内のドキュメントの一覧が表示されます。 短縮された出力の例を以下に示します。
[ { "_id": { "$oid": "640a146e89286b79b6628eef" }, "name": "Confira Watch", "category": "watches", "price": 105 }, { "_id": { "$oid": "640a146e89286b79b6628ef0" }, "name": "Diannis Watch", "category": "watches", "price": 98, "sale": true }, ... ]注
オブジェクト識別子 (
_id) はランダムに生成され、この切り捨てられた出力例とは異なります。サーバー/ディレクトリで、新しい .env ファイルを作成します。
server/.env ファイルで、この値の環境変数を追加します。
環境変数 価値 CONNECTION_STRINGAzure DocumentDB クラスターへの接続文字列。 ここでは、 mongodb://localhost:27017?directConnection=trueを使用します。CONNECTION_STRING=mongodb://localhost:27017?directConnection=trueターミナルのコンテキストを サーバー/ フォルダーに変更します。
cd serverノード パッケージ マネージャー (npm) から依存関係をインストールします。
npm installNode.js > Express アプリケーションを起動します。
npm startAPI によってブラウザー ウィンドウが自動的に開き、製品ドキュメントの配列が返されることを確認します。
追加のブラウザー タブ/ウィンドウを閉じます。
ターミナルを閉じます。
Azure DocumentDB クラスターを使用して MERN アプリケーションをテストする
次に、アプリケーションが Azure DocumentDB とシームレスに動作することを検証しましょう。 このタスクでは、MongoDB シェルを使用して既存のクラスターにシード データを設定し、API の接続文字列を更新します。
Azure portal (https://portal.azure.com) にサインインします。
既存の Azure DocumentDB クラスター ページに移動します。
Azure DocumentDB クラスター ページで、[ 接続文字列 ] ナビゲーション メニュー オプションを選択します。
[接続文字列] フィールドの値を記録します。
Important
ポータルの接続文字列には、ユーザー名とパスワードの値は含まれません。
<user>と<password>プレースホルダーは、最初にクラスターを作成したときに使用した資格情報に置き換える必要があります。統合開発環境 (IDE) 内で新しいターミナルを開きます。
mongoshコマンドと、前に記録した接続文字列を使用して MongoDB シェルを起動します。<user>と<password>プレースホルダーは、最初にクラスターを作成したときに使用した資格情報に置き換えてください。mongosh "<mongodb-cluster-connection-string>"注
接続文字列の特定の値をエンコードする必要がある場合があります。 この例では、クラスターの名前が
msdocs-azure-documentdb-tutorialされ、ユーザー名がclusteradminされ、パスワードがP@ssw.rd。 パスワードでは、@を使用して%40文字をエンコードする必要があります。 ここでは、パスワードの正しいエンコードを使用して接続文字列の例を示します。CONNECTION_STRING=mongodb+srv://clusteradmin:P%40ssw.rd@msdocs-azure-documentdb-tutorial.mongocluster.cosmos.azure.com/?tls=true&authMechanism=SCRAM-SHA-256&retrywrites=false&maxIdleTimeMS=120000シェル内で次のコマンドを実行して、データベースの作成、コレクションの作成、スターター データのシード処理を行います。
use('cosmicworks'); db.products.drop(); db.products.insertMany([ { name: "Confira Watch", category: "watches", price: 105.00 }, { name: "Diannis Watch", category: "watches", price: 98.00, sale: true }, { name: "Sterse Gloves", category: "gloves", price: 42.00 }, { name: "Peache Sunglasses", category: "eyewear", price: 32.00, sale: false, sizes: [ "S", "M", "L" ] }, { name: "Icento Pack", category: "bags", price: 58.00 }, { name: "Iroowl Bracelet", category: "watches", price: 66.00 }, { name: "Glaark Bag", category: "bags", price: 56.00, sale: true }, { name: "Windry Mittens", category: "gloves", price: 35.00 }, { name: "Tuvila Hat", category: "hats", price: 120.00 }, { name: "Klinto Hat", category: "hats", subcategory: "hats-beanies", price: 65.00 } ]); db.products.find({});コマンドは、ローカル MongoDB コレクション内のドキュメントの一覧になります。 出力の一部を省略した例を以下に示します。
[ { "_id": { "$oid": "640a146e89286b79b6628eef" }, "name": "Confira Watch", "category": "watches", "price": 105 }, { "_id": { "$oid": "640a146e89286b79b6628ef0" }, "name": "Diannis Watch", "category": "watches", "price": 98, "sale": true }, ... ]注
オブジェクト識別子 (
_id) はランダムに生成され、この切り捨てられた出力例とは異なります。MongoDB シェルを終了します。
exitクライアント/ディレクトリで、新しい .env ファイルを作成します。
client/.env ファイルで、この値の環境変数を追加します。
環境変数 価値 CONNECTION_STRINGAzure DocumentDB クラスターへの接続文字列。 mongo シェルで使用したのと同じ接続文字列を使用します。 CONNECTION_STRING=<your-connection-string>ターミナルのコンテキストを サーバー/ フォルダーに変更し、Node Package Manager (npm) から依存関係をインストールしてから、アプリケーションを起動して、アプリケーションがデータベース サービスを使用していることを検証します。
cd server npm install npm startAPI によってブラウザー ウィンドウが自動的に開き、製品ドキュメントの配列が返されることを確認します。
追加のブラウザー タブ/ウィンドウを閉じます。 次に、ターミナルを閉じます。
MERN アプリケーションを Azure App Service にデプロイする
Azure App Service にサービスとクライアントをデプロイして、アプリケーションがエンドツーエンドで動作することを証明します。 Web アプリでシークレットを使用して、資格情報と API エンドポイントを含む環境変数を格納します。
統合開発環境 (IDE) 内で、新しいターミナルを開きます。
resourceGroupName という名前の既存のリソース グループの名前のシェル変数を作成します。
# Variable for resource group name resourceGroupName="<existing-resource-group>"serverAppName と clientAppName という名前の 2 つの Web アプリのシェル変数を作成します。
# Variable for randomnly generated suffix let suffix=$RANDOM*$RANDOM # Variable for web app names with a randomnly generated suffix serverAppName="server-app-$suffix" clientAppName="client-app-$suffix"まだサインインしていない場合は、
az login --use-device-codeコマンドを使用して Azure CLI にサインインします。現在の作業ディレクトリを サーバー/ パスに変更します。
cd serveraz webapp upを使用して、MERN アプリケーションのサーバー コンポーネント用の新しい Web アプリを作成します。az webapp up \ --resource-group $resourceGroupName \ --name $serverAppName \ --sku F1 \ --runtime "NODE|18-lts"CONNECTION_STRINGを使用して、az webapp config connection-string setという名前のサーバー Web アプリの新しい接続文字列設定を作成します。 このチュートリアルの前半で MongoDB シェルと .env ファイルで使用した接続文字列と同じ値を使用します。az webapp config connection-string set \ --resource-group $resourceGroupName \ --name $serverAppName \ --connection-string-type custom \ --settings "CONNECTION_STRING=<mongodb-connection-string>"az webapp showを使用してサーバー Web アプリの URI を取得し、シェル変数名 d serverUri に格納します。serverUri=$(az webapp show \ --resource-group $resourceGroupName \ --name $serverAppName \ --query hostNames[0] \ --output tsv)open-cliで NuGet のnpxパッケージとコマンドを使用して、サーバー Web アプリの URI を使用してブラウザー ウィンドウを開きます。 サーバー アプリがクラスターから JSON 配列データを返していることを検証します。npx open-cli "https://$serverUri/products" --yesヒント
場合によっては、デプロイが非同期的に完了することがあります。 予期した内容が表示されない場合は、もう 1 分待ってからブラウザー ウィンドウを更新します。
作業ディレクトリを クライアント/ パスに変更します。
cd ../clientaz webapp upを使用して、MERN アプリケーションのクライアント コンポーネント用の新しい Web アプリを作成します。az webapp up \ --resource-group $resourceGroupName \ --name $clientAppName \ --sku F1 \ --runtime "NODE|18-lts"REACT_APP_API_ENDPOINTを使用して、az webapp config appsettings setという名前のクライアント Web アプリの新しいアプリ設定を作成します。 serverUri シェル変数に格納されているサーバー API エンドポイントを使用します。az webapp config appsettings set \ --resource-group $resourceGroupName \ --name $clientAppName \ --settings "REACT_APP_API_ENDPOINT=https://$serverUri"az webapp showを使用してクライアント Web アプリの URI を取得し、シェル変数名 d clientUri に格納します。clientUri=$(az webapp show \ --resource-group $resourceGroupName \ --name $clientAppName \ --query hostNames[0] \ --output tsv)open-cliで NuGet のnpxパッケージとコマンドを使用して、クライアント Web アプリの URI を使用してブラウザー ウィンドウを開きます。 クライアント アプリがサーバー アプリの API からデータをレンダリングしていることを検証します。npx open-cli "https://$clientUri" --yesヒント
場合によっては、デプロイが非同期的に完了することがあります。 予期した内容が表示されない場合は、もう 1 分待ってからブラウザー ウィンドウを更新します。
ターミナルを閉じます。
リソースをクリーンアップする
所有するサブスクリプションを使用している場合は、プロジェクトの終了時に、不要になったリソースを削除することをお勧めします。 リソースを稼働させたままにすると、費用がかかる場合があります。 リソースを個別に削除することも、リソース グループを削除してリソースのセット全体を削除することもできます。
リソース グループ全体を削除するには、
az group deleteを使用します。az group delete \ --name $resourceGroupName \ --yesaz group listを使用してリソース グループが削除されていることを確認します。az group list
開発環境をクリーンアップする
開発環境をクリーンアップするか、通常の状態に戻すこともできます。
GitHub Codespaces 環境を削除すると、アカウントに対して取得するコア時間単位の無料エンタイトルメントの量を最大化できます。
GitHub Codespaces ダッシュボード (https://github.com/codespaces) にサインインします。
azure-samples/msdocs-azure-cosmos-db-mongodb-mern-web-appGitHub リポジトリから提供されている現在実行中の開発コンテナーを見つけます。
コードスペースのコンテキスト メニューを開き、[の削除]
選択します。