SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server 2025 と Foundry Local を組み合わせる

leave a comment

Build 2025 で Foundry Local がアナウンスされ、Public Preview として提供が行われました。

Foundry Local と SQL Server 2025 の新機能を組み合わせることができるのかが気になったので、簡単なもので試してみました。

今回は Foundry Local を使用していますが、Ollama を使用することも可能です。

SQL Server 2025 の外部 REST エンドポイントの呼び出しについて

SQL Server 2025 の 新機能 には Azure SQL Database で先行して実装されていた外部 REST エンドポイントにアクセスするための sp_invoke_external_rest_endpoint が含まれています。

SQL Database の場合は、Allowed endpoints にアクセスするための機能となっており、許可された API 以外を呼び出す場合には、許可されているエンドポイントでラップして呼び出す必要がありました。

SQL Server 2025 については、新機能に次のように記載されている通り、企業内のローカルの REST エンドポイントを直接呼び出せるようになっており、この動作が SQL Database との違いとなっています。

image

この機能改善が行われていることで、Foundry Local の REST API を SQL Server から呼び出すということが可能となっています。

 

SQL Server 2025 で外部のエンドポイントを呼び出す場合の制約

SQL Server 2025 の sp_invoke_external_rest_endpoint では、呼び出すことができる REST エンドポイントが SQL Database より緩和されているのですが 1 点制約があり「HTTPS」で呼び出す必要があります。

HTTP で REST API を呼び出すと次のエラーとなります。

メッセージ 31610、レベル 16、状態 1、プロシージャ sys.sp_invoke_external_rest_endpoint_internal、行 1 [バッチ開始行 0]
Accessing the external endpoint is only allowed via HTTPS.

Foundry Local に HTTPS 経由でアクセスするためには

現状、Foundry Local では HTTPS でアクセスする機能は提供されていないため、何らかの HTTPS のアクセス方法でラップする必要があります。(これは、Ollama を使用する場合も同一ですが)

Foundry Local をラップする方法として、ドキュメントでは、Open WebUI (旧 Ollama WebUI) を使用する方法が紹介されています。

Open WebUI 自身も HTTPS で保護する機能は持っていないようなのですが、Secure Your Open WebUI with HTTPS に HTTPS でアクセスするための方法が紹介されています。

これを参考にすることで、Foundry Local を HTTPS 経由でアクセスさせることができます。

今回は、Nginx を使用して Foundry Local に HTTPS 経由でアクセスを行います。

 

Nginx で使用する証明書の作成

今回の検証であれば、New-SelfSignedCertificate を使用して作成した自己署名証明書を、「Cert:\LocalMachine\Root」に保存して、信頼された証明書として認識させ、この証明書を PEM 形式にすることで Nginx でも利用することができます。

PFX 形式の証明書を PEM 形式に変換する方法ですが、openssl を使用せずに PowerShell のみで実施する場合には、Windows OpenSSL 無しで pem 形式のサーバー証明書と秘密鍵を IP アドレスベースで作成する (PowerShell版) が参考となります。

この方法を使用することで、crt / key ファイルを作成し、Nginx で使用することができます。

 

Nginx の設定

Nginx の設定ですが、今回は次のような定義 (nginx.conf) を使用しています。(前述の作業で作成した証明書は C:\work に保存しています)


#user  nobody;
worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream backend {
        server 127.0.0.1:5273; 
    }

    access_log CON ;
    error_log CON warn;

    sendfile        on;

    keepalive_timeout  60;

    server {
        listen 80;
	listen 443 ssl;

	ssl_certificate  C:\work\certificate.crt;
	ssl_certificate_key C:\work\private.key;

        ssl_protocols        TLSv1.2 TLSv1.3;
        ssl_ciphers          HIGH:!aNULL:!MD5;
        server_name  localhost;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # proxy_connect_timeout 60s;
            # proxy_send_timeout 70s;
            proxy_read_timeout 600s;

        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

 

Foundry Local で使用しているポートについては「foundry service status」で確認することができますが、今回は TCP 5273 が使用されていましたので、それを設定しています。

この設定で Nginx で HTTPS の要求を受け付け、Foundry Local へのリバースプロキシとして動作させています。

 

SQL Server 2025 から呼び出し

ここまでの設定ができれば SQL Server から呼び出すことができます。

今回は、SQL Server 2025 / Foundry Local / Nginx は同一の環境上で実行していますが、次のようなクエリで Foundry Local の REST API を呼び出すことができます。

DECLARE @ret AS INT, @response AS nvarchar (MAX);

DECLARE @headers AS nvarchar (4000) = N'{"Content-Type":  "application/json"}';
DECLARE @payload AS nvarchar (MAX) = N'
{
    "max_tokens": 500,
    "messages": [
        {
            "role": "system",
            "content": "回答は日本語にする"
        },
        {
            "role": "user",
            "content": "なぜ空は青いのか?"

        }
    ],
    "model": "Phi-3.5-mini-instruct-generic-cpu",
    "stream": false
}
'
DECLARE @url nvarchar(4000) = N'https://localhost/v1/chat/completions'

EXECUTE
    @ret = sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = @headers,
    @payload = @payload,
    @timeout = 120,
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode,CAST(@response AS json) AS Response;

 

次の結果のように、Foundry Local でロードしていたモデル (Phi-3.5-mini-instruct-generic-cpu) を使用して結果の取得ができています。

image

現在、Foundry Local でデフォルトで提供されているモデルが「chat-completion」用のモデルとなっており、Embedding 用のモデルは含まれていないようですが、POST /v1/embeddings が提供されており、Foudry Local は ONNX 形式のモデルをサポートし、Foundry Local で実行する Hugging Face モデルをコンパイルする で Hugging Face のモデルを使用する方法も公開されています。

Embedding 向けのモデルを Foundry Local にロードし、CREATE EXTERNAL MODEL で SQL Server で使用可能な Embedding のモデルとして登録し、Embedding を生成して Vector データ型 / 関数で利用するということもできるのではと思いますので、これは後々確認していきたいと思います。

Share

Written by Masayuki.Ozawa

5月 21st, 2025 at 10:56 pm

Leave a Reply