0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

がちもとさんAdvent Calendar 2024

Day 1

Azure FunctionsからプライベートエンドポイントのCosmos DBに接続すーる

Posted at

はじめに

Azure FunctionsからプライベートエンドポイントのCosmos DBに接続していきます

開発環境

  • Windows 10 PC
  • Azure

導入

仮想ネットワークの作成

1.仮想ネットワークの作成

Azure Functionsに合わせて、リージョンは East Asia にしています。
image.png

2.仮想ネットワークの暗号化にチェック
image.png

3.VNet用のサブネットを追加
image.png

4.Cosmos DB用のサブネットを追加
image.png

このような形になります
image.png

Cosmos DBの作成

1.コア(SQL)- 推奨 を作成
image.png

2.インスタンスの詳細を設定
Azure Functionsに合わせて、リージョンは East Asia にしています。
image.png

3.Itemsコンテナーの作成
image.png

4.データエクスプローラーで新しいアイテムを追加
image.png

5.パブリックアクセスを無効に
image.png

6.プライベートエンドポイントを作成
image.png

7.リソースを選択
image.png

8.仮想ネットワークで、Cosmos DB用のサブネットを選択
image.png

9.プライベートDNS統合
image.png

プライベートアクセスで承認済みになればOKです
image.png

関数アプリの作成

1.Flex 従量課金プランを選択
image.png

2.利用できるリージョン一覧はこちら
image.png

3.East Asia、Node.js(20 LTS)で作成
image.png

4.Cursorで Create Function Project -> s-fujimoto-241224 Functionsのソースコード用のフォルダを選択
image.png

5.TypeScript を選択
image.png

6.Model V4 を選択
image.png

7.HTTP Trigger を選択
image.png

8.ファイル名は httpTrigger1 とした
image.png

9.最初のプログラム(httpTrigger1.ts)

httpTrigger1.ts
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    context.log(`Http function processed request for url "${request.url}"`);

    const name = request.query.get('name') || await request.text() || 'world';

    return { body: `Hello, ${name}!` };
};

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    handler: httpTrigger1
});

image.png

10.Start debugging to update this list... をクリックしデバッグ開始
image.png

11.http://localhost:7071/api/httpTrigger1 にアクセスしてテスト

image.png

12.Deploy to Azure をクリックしデプロイ
image.png

13.ポータルに戻ると関数が見えるように
image.png

14.ポータルからテスト
image.png

関数アプリの仮想ネットワーク統合

1.ネットワーク -> 送信トラフィックの構成 -> 仮想ネットワーク統合 「未構成」をクリック
image.png

2.VNet用のサブネットを選択
image.png

このような形になります
image.png

CosmosDBからデータを取得するだけの関数アプリ

1.httpTrigger1.tsを編集

httpTrigger1.ts
import { app, HttpRequest, HttpResponseInit, InvocationContext } from "@azure/functions";
import { CosmosClient } from "@azure/cosmos";

const endpoint = process.env.COSMOS_ENDPOINT || "";
const key = process.env.COSMOS_KEY || "";
const databaseId = process.env.COSMOS_DATABASE_ID || "ToDoList";
const containerId = process.env.COSMOS_CONTAINER_ID || "Items";

const client = new CosmosClient({ endpoint, key });
const container = client.database(databaseId).container(containerId);

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    if (!endpoint || !key) {
        context.log(`[ERROR] CosmosDB connection information is not properly configured`);
        return {
            status: 500,
            body: "Server configuration error"
        };
    }

    try {
        const { resources: items } = await container.items.readAll().fetchAll();
        
        context.log(`Retrieved ${items.length} items from CosmosDB`);

        return {
            status: 200,
            jsonBody: items
        };
    } catch (error) {
        context.log(`[ERROR] Error fetching items from CosmosDB: ${error}`);
        return {
            status: 500,
            body: "Error fetching items from CosmosDB"
        };
    }
}

app.http('httpTrigger1', {
    methods: ['GET'],
    authLevel: 'anonymous',
    handler: httpTrigger1
});

2.ライブラリのインストール

npm install @azure/cosmos

package.jsonはこのような形になります

image.png

3.local.settings.json を編集し、キーとエンドポイントをコピペ

image.png

local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "COSMOS_ENDPOINT": "https://xxxx.documents.azure.com:443/",
    "COSMOS_KEY": "<INSERT-YOUR-COSMOS-KEY>",
    "COSMOS_DATABASE_ID": "ToDoList",
    "COSMOS_CONTAINER_ID": "Items"
  }
}

4.ローカルからはテストはできない
image.png

5.ポータルの関数アプリ -> 環境変数の設定
image.png

6.デプロイして、ポータル上でテスト
image.png

全体の構成図はこのようになります。
画像4.png

お疲れ様でした

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?