Overview
このチュートリアルでは、 MongoDB Node.jsドライバーを使用して、 MongoDB AtlasからのデータをクエリするHTTPトリガーのAzure Function を作成します。また、サーバーレス コンテキストでデータベース接続を管理し、関数をAzureクラウドに配置する方法も学習します。
前提条件
始める前に、以下の手順を完了してください。
MongoDB Atlasクラスターを配置し、ネットワークアクセスとデータベースユーザーを構成して、サンプルデータセットをロードします。方法については、 MongoDB の使用開始ガイドをご覧ください。
Node.jsバージョン 18以降をインストールします。
Tutorial
このチュートリアルでは、次の手順についてガイドします。
Azureクラウドリソースを作成します。
ローカルプロジェクトを初期化します。
MongoDB Node.jsドライバーをインストールします。
sample_mflixデータベースへのデータベース接続を構成します。sample_mflix.moviesコレクションをクエリし、映画を表すドキュメントを検索する関数を記述します。関数をローカルでテストします。
Azureにデプロイします。
Azureクラウドリソースを作成します。
次のコマンドを実行してリソースグループを作成し、<GROUP_NAME> をグループ名に、<AZURE_REGION> をサポートされているAzureリージョンに置き換えます。
az group create \ --name <GROUP_NAME> \ --location <AZURE_REGION>
オプションとして、 Azure を初めて使用している場合は、次のコマンドを実行して Functionsリソースプロバイダーを登録する必要があります。
az provider register --namespace Microsoft.Storage az provider register --namespace Microsoft.Web
次に、次のコマンドを実行してストレージアカウントを作成します。前のコードと同じリージョンとグループ名を使用し、ストレージアカウントに一意の名前を指定して、<STORAGE_NAME> プレースホルダーをこの一意の名前に置き換えます。
az storage account create \ --name <STORAGE_NAME> \ --location <AZURE_REGION> \ --resource-group <GROUP_NAME> \ --sku Standard_LRS
最後に、次のコマンドを実行して関数アプリを作成します。
az functionapp create \ --resource-group <GROUP_NAME> \ --consumption-plan-location <AZURE_REGION> \ --runtime node \ --functions-version 4 \ --name <APP_NAME> \ --storage-account <STORAGE_NAME>
ローカルプロジェクトを初期化します。
次のコマンドを実行して、ローカル 関数プロジェクト を初期化します。
func init MongoExample
プロンプトが表示されたら、ワーカー ランタイムとして node を選択し、言語として javascript を選択します。
次のコマンドを実行してプロジェクトディレクトリに移動し、新しいHTTPトリガー関数を作成します。
cd MongoExample func new --name GetMovies --template "HTTP trigger"
コマンドは src/functions/GetMovies.jsファイルを作成し、後の手順で編集します。
ローカルプロジェクトをAzure Functionアプリにリンクするには、プロジェクトディレクトリから次のコマンドを実行します。
func azure functionapp fetch-app-settings <APP_NAME>
このコマンドは、ストレージアカウントの構成を含むすべてのアプリケーション設定をAzureからダウンロードし、プロジェクトの local.settings.jsonファイルに入力します。
データベース接続を構成します。
src/functions/GetMovies.js を開き、その内容を次のコードで置き換えます。
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
Tip
呼び出し全体で既存の接続を再利用するには、ハンドラー関数の外部で mongoClient を定義します。ハンドラー内で新しい接続を作成すると、呼び出しごとに新しい接続が開かれ、データベースがサポートする同時接続の最大数が枯渇するリスクがあります。クライアントをモジュール レベルで定義すると、接続数はトラフィックに比例して維持されます。
Node.jsのバージョンによっては、 MongoDBに接続しようとすると DNS 解決に関連するエラーが発生する場合があります。この問題が発生した場合は、MongoClientインスタンスを作成する前に、次のコードを src/functions/GetMovies.jsファイルに追加してください。
const { app } = require("@azure/functions"); const { MongoClient } = require("mongodb"); // Forces DNS servers explicitly before connecting to MongoDB require("node:dns/promises").setServers(["1.1.1.1", "8.8.8.8"]); const mongoClient = new MongoClient( process.env.MONGODB_ATLAS_URI ); app.http("GetMovies", { methods: ["GET"], authLevel: "anonymous", handler: async (request, context) => { // Query logic added in the next step } });
local.settings.json を開き、Valuesオブジェクトに次のフィールドを追加し、各プレースホルダーを実際の値に置き換えます。
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "<storage-connection-string>", "FUNCTIONS_WORKER_RUNTIME": "node", "MONGODB_ATLAS_URI": "<atlas-connection-string>", "MONGODB_ATLAS_DATABASE": "sample_mflix", "MONGODB_ATLAS_COLLECTION": "movies" }, "ConnectionStrings": {} }
MongoDB Atlas接続文字列を取得するには、Atlas ダッシュボードに移動し、クラスターを選択して、Connect をクリックします。 Azureストレージ接続文字列を取得する方法については、 Azureドキュメントの「接続文字列の構成 」を参照してください。
MongoDB .をクエリする関数を記述します。
src/functions/GetMovies.js で、ハンドラー内の // Query logic added in the next step のコメントを次のコードで置き換えます。
try { const database = mongoClient.db( process.env.MONGODB_ATLAS_DATABASE ); const collection = database.collection( process.env.MONGODB_ATLAS_COLLECTION ); const results = await collection .find({}) .limit(10) .toArray(); return { jsonBody: results }; } catch (error) { return { status: 500, jsonBody: { message: "Internal server error." } }; }
関数はリクエストを受け取ると、環境変数で指定されたデータベースとコレクションに接続し、最大 10 ドキュメントを返します。エラーが発生した場合、関数はエラー メッセージを含む 500 レスポンスを返します。
関数をローカルでテストします。
プロジェクトのルート から、次のコマンドを実行して関数を開始します。
func start
サーバーを起動すると、CLI には関数のローカルURLが表示されます。ブラウザで http://localhost:7071/api/GetMovies に移動するか、cURL や Postman などのツールを使用してリクエストを送信します。
注意
サーバーが起動してもデータを取得できない場合は、ローカルIPアドレスが Atlas ネットワーク アクセス リストに含まれていることを確認してください。本番用に構成したAzureデータセンターのIPルールは、ローカルでテストする場合は適用されません。詳細については、 「 IPアクセス リスト エントリの設定 」を参照してください。
Azureにデプロイします。
Azureで次のコマンドを実行中して環境変数を設定し、各プレースホルダーを実際の値に置き換えます。
az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_URI=<atlas-connection-string> az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_DATABASE=sample_mflix az functionapp config appsettings set \ --name <APP_NAME> \ --resource-group <GROUP_NAME> \ --settings MONGODB_ATLAS_COLLECTION=movies
次のコマンドを実行中して関数を配置します。
func azure functionapp publish <APP_NAME>
Deployment successful. Remote build succeeded! Syncing triggers... Functions in <APP_NAME>: GetMovies - [httpTrigger] Invoke url: https://<APP_NAME>.azurewebsites.net/api/getmovies
配置が完了すると、CLI に関数の公開URLが表示されます。この関数は authLevel: "anonymous" を使用するため、キーなしでアクセスできます。
注意
本番環境では、 authLevel"function"を"admin" または に変更し、適切なキーを承認されたクライアントに配布することを検討してください。詳細については、 Azure Functions のドキュメント「 アクセス キーの操作 」を参照してください。
詳細
このチュートリアルで説明されている概念をさらに学ぶには、次のリソースを参照してください。
接続のベストプラクティスについては、Atlas ドキュメントの「 Azure Functions を使用した接続の管理 」を参照してください。
関数の詳細については、 Azure Functions のドキュメントを参照してください