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?

Azure SQL DatabaseからAzure OpenAIを呼び出す設定手順書

0
Posted at

Azure SQL DatabaseからAzure OpenAIを呼び出す設定手順書

SQL Beginners Day T SQLからLLMを呼んでみる2
作成日 2026年10月7日 / 主手順 APIキー認証

本書は、Azure SQL Databaseのユーザーデータベースに資格情報と権限を設定し、T-SQLからAzure OpenAIのChat Completions APIへ短い質問を送る手順を示す。SQL Server 2025で異なる設定は、各手順の注意書きと末尾の比較表に記載する。

接続確認の完了条件は、HTTP 200、呼び出し戻り値0、空でない回答を取得できること。生成されたSQLの自動実行は本書の対象外。実際のAzure環境への接続検証は未実施。

1 事前に用意するもの

項目 用意する内容
Azure SQL Database 検証用ユーザーデータベース。例 LlmSqlDemo
設定担当者 対象DBのCONTROL権限を持つ管理者
実行担当者 対象DBに接続できる専用ユーザー
Azure OpenAI Chat Completions対応モデルのデプロイ
接続情報 リソースURL、デプロイ名、APIキー
クライアント SSMS または VS CodeのMSSQL拡張

データベースが未作成なら、AzureポータルでSQL Databaseを作成し、論理サーバー、認証、接続元からのネットワーク経路を設定する。APIキーを使う場合、Azure OpenAI側でキー認証が有効であることも確認する。

2 接続先とネットワークを確認する

Azure OpenAIのデプロイ画面で、リソースのエンドポイント、デプロイ名、APIキーを取得する。本書では次のURL形式を使う。デプロイ名はmodelに渡す。

リソースURL
https://YOUR-RESOURCE.openai.azure.com

呼び出しURL
https://YOUR-RESOURCE.openai.azure.com/openai/v1/chat/completions

v1 APIでは日付形式のapi-versionを付けない。modelにはAzureで付けたデプロイ名を指定する。Foundryの画面から取得したURLでも、実際のホスト名とAPIの種類を確認する。[2]

Azure SQL Databaseには外部REST接続先の許可リストがある。*.openai.azure.comは対象だが、api.openai.comは対象外。Foundryという製品名ではなく、呼び出し先ドメインで判断する。対象外のAPIは許可対象のAzure API Managementなどを経由させる設計が必要。[1]

SQL Server 2025との差分 公式の接続先許可リストはAzure SQL DatabaseとManaged Instanceに適用される。SQL Server 2025にはこのAzureサービスの許可リストは適用されない。HTTPS、認証、ネットワーク到達性の条件は必要。

SSMSからDBへの接続と、DBからAzure OpenAIへの接続は別の経路。PCからAzure OpenAIを呼べても、DBから呼べる証明にはならない。SQL側の接続元IP規則、OpenAI側のネットワーク制限をそれぞれ確認する。

本書の最小デモは到達可能なパブリックHTTPSエンドポイントを前提とする。既存のPrivate Endpoint構成や選択ネットワーク構成を変更せず、DBからの経路を別途検証する。制限された環境では、API Management等の中継構成を設計する。

3 対象データベースへ接続する

SSMSの接続プロパティでLlmSqlDemoを指定し、新しいクエリを開く。管理者として次を実行し、接続先を確認する。[4]

SELECT DB_NAME() AS DatabaseName,
       USER_NAME() AS DatabaseUser,
       @@VERSION AS EngineVersion;

期待結果はDatabaseNameがLlmSqlDemo。Azure SQL DatabaseではUSEで別DBへ切り替えず、対象DBへ接続し直す。

SQL Server 2025との差分 SQL Server 2025ではUSE LlmSqlDemoでDBを切り替えられる。Azure SQL Database用の手順にUSE masterやサーバー設定を混ぜない。

4 資格情報を作成する

Azure SQL Databaseでは外部REST機能は既定で有効。sp_configureによる有効化は不要。[1]

SQL Server 2025との差分 SQL Server 2025では既定で無効。管理者が次を実行する。Azure SQL Databaseでは実行しない。

EXEC sys.sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;

以降は対象ユーザーデータベースに接続した設定担当者が実行する。DBマスターキーは資格情報のSECRETを暗号化する。マスターキーの保護パスワードとAzure OpenAIのAPIキーは別物。[3]

-- マスターキーの有無を確認
SELECT name FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##';

-- 既存キーがなければ作成。パスワードは変更する。
IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys
    WHERE name = N'##MS_DatabaseMasterKey##')
BEGIN
    CREATE MASTER KEY ENCRYPTION BY PASSWORD =
        'REPLACE_WITH_STRONG_DMK_PASSWORD';
END;
GO

CREATE DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'HTTPEndpointHeaders',
     SECRET = '{"api-key":"YOUR_AZURE_OPENAI_KEY"}';
GO

Azure SQL Databaseは資格情報作成時にDMKを自動作成できる。本書は鍵の役割を明確にするため、存在確認と明示作成を採用する。既存キーを削除・再作成しない。[3]

資格情報名は任意の別名にしない

HTTPEndpointHeaders方式では、資格情報名を有効なURLにする。呼び出しURLとスキーム・ホスト名が一致し、パスは同じか上位にする。クエリ文字列は資格情報名へ含めない。Azure SQL Databaseではドメインも許可リスト対象であることが必要。[1]

例のYOUR-RESOURCEを、作成時・権限付与時・呼び出し時の全箇所で同じ値に置換する。SECRETはヘッダー名api-keyを含むフラットなJSON。実キーを資料、Git、画面共有用のSQLへ残さない。

5 実行ユーザーへ権限を付与する

資格情報の作成は管理者、API呼び出しは専用ユーザーという役割分担にする。対象DBに既存ユーザーがある場合、その名前を利用する。以下は検証用の包含ユーザーをSQL認証で作成する例。Entra認証のみの環境では既存のEntraユーザーを使う。

-- 管理者が対象DBで実行。未作成の場合のみ。
CREATE USER [LlmDemoUser]
WITH PASSWORD = 'REPLACE_WITH_STRONG_USER_PASSWORD';
GO

GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [LlmDemoUser];
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::
[https://YOUR-RESOURCE.openai.azure.com]
TO [LlmDemoUser];
GO

CREATE USERの再実行は不要。APIを呼ぶだけなら、業務テーブルのSELECT権限やdb_ownerは付与しない。REFERENCESはこの資格情報を利用する権限であり、APIキーを表示する権限ではない。[1]

実行ユーザーとして接続し直す

対象DBを指定し、LlmDemoUserで新しい接続を開く。管理者のクエリ画面では、実行ユーザーの権限確認にならない。

SELECT DB_NAME() AS DatabaseName,
       USER_NAME() AS DatabaseUser,
       HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE',
           'EXECUTE ANY EXTERNAL ENDPOINT') AS CanCallRest;

SELECT HAS_PERMS_BY_NAME(
    N'https://YOUR-RESOURCE.openai.azure.com',
    'DATABASE SCOPED CREDENTIAL', 'REFERENCES')
    AS CanUseCredential;

期待結果はDatabaseUserがLlmDemoUser、CanCallRestとCanUseCredentialがともに1。

SQL Server 2025との差分 外部RESTの実行権限と資格情報のREFERENCESは共通。SQL Server 2025では、ユーザーの接続にサーバーログインの作成やマッピングを使う構成もある。

既存の資格情報を更新する場合

-- キーをローテーションした場合。管理者が実行。
ALTER DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'HTTPEndpointHeaders',
     SECRET = '{"api-key":"NEW_AZURE_OPENAI_KEY"}';

同じ名前の資格情報が既にある場合は、CREATEを繰り返さず内容を確認してALTERを使う。

6 短い質問で疎通を確認する

実行ユーザーの接続で以下を実行する。YOUR-RESOURCEとYOUR_DEPLOYMENTを置換する。temperatureはモデル間の互換性のため指定しない。初回は再試行なしでエラーを観察する。

DECLARE @url nvarchar(4000) =
 N'https://YOUR-RESOURCE.openai.azure.com/openai/v1/chat/completions';
DECLARE @response nvarchar(max), @rc int;
DECLARE @payload nvarchar(max) = N'{
  "model": "YOUR_DEPLOYMENT",
  "messages": [
    {"role":"user", "content":"1+1を一言で答えて"}
  ],
  "stream": false
}';

EXEC @rc = sys.sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'POST',
    @credential = N'https://YOUR-RESOURCE.openai.azure.com',
    @payload = @payload,
    @timeout = 60,
    @retry_count = 0,
    @response = @response OUTPUT;

SELECT @rc AS ReturnCode, @response AS RawResponse;
IF @rc <> 0
    THROW 50001, N'HTTP error. Inspect RawResponse.', 1;

SELECT JSON_VALUE(@response,
    '$.response.status.http.code') AS HttpCode,
    JSON_VALUE(@response,
    '$.result.choices[0].finish_reason') AS FinishReason;

SELECT Answer
FROM OPENJSON(@response, '$.result.choices[0].message')
WITH (Answer nvarchar(max) '$.content');

正常時はReturnCodeが0、HttpCodeが200、Answerに回答がある。finish_reasonも確認する。lengthやcontent_filterなら、切れた/制限された回答として扱う。例外発生時はHTTP結果とは別にSQLエラーの全文を確認する。

応答本体は$.resultの下にある。長文を取り出すためOPENJSONのnvarchar(max)を使用する。通常のJSON_VALUEは4,000文字を超える値に適さない。[6]

7 エラーを切り分ける

症状 確認箇所
DBへ接続できない DB名、認証、接続元のSQLファイアウォール規則
資格情報に関するSQLエラー 対象DB、資格情報名のURL、REFERENCES権限
接続先が拒否される 許可ドメイン、HTTPS、呼び出し先ネットワーク設定
HTTP 401 APIキー、キー認証の有効性、資格情報のヘッダー
HTTP 403 ネットワーク制限、認可。マネージドIDならRBAC
HTTP 400 または404 v1 URL、デプロイ名、JSON、モデル対応API
HTTP 429 クォータ、同時呼び出し、再試行間隔
タイムアウトまたは5xx API遅延、サービス障害、タイムアウト設定

RawResponse、ReturnCode、SQLエラーを保存する。APIキーは出力しない。API側を別クライアントで確認する場合も、URLと要求JSONを揃える。

再試行を追加するなら@retry_countを少数から設定する。@timeoutは再試行を含めた累積時間。外部API呼び出しを更新トランザクションの中へ入れない。

8 マネージドID認証へ切り替える場合

補足手順。APIキー方式と混ぜず、最初の疎通完了後に切り替える。Azure SQL論理サーバーのIDを有効化し、使用されるIDへAzure OpenAIリソースのCognitive Services OpenAI Userロールを付与する。[1]

-- 管理者が既存のAPIキー資格情報を切り替える。
ALTER DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'Managed Identity',
SECRET = '{"resourceid":"https://cognitiveservices.azure.com"}';

呼び出し側の@credentialとURLは維持する。ユーザー割り当てIDがある場合は、論理サーバーのプライマリIDの設定を確認する。IDの権限反映後、同じ疎通SQLを再実行する。

SQL Server 2025との差分 SQL Server 2025では対応するAzure Arc等のID構成に加え、allow server scoped db credentialsの有効化が必要。Azure SQL Databaseにはこのsp_configure設定を持ち込まない。

9 SQL Server 2025との差分一覧

項目 Azure SQL Database SQL Server 2025
外部RESTの有効化 既定で有効 既定で無効。sp_configureで有効化
接続先許可リスト 適用される 同じAzureサービスのリストは適用外
DBの切り替え 対象DBへ接続し直す USEで切り替え可能
資格情報名 URL条件と許可ドメインを確認 URLの一致条件を確認
DBマスターキー 明示作成または自動作成 通常は資格情報作成前に明示作成
キー認証の権限 外部REST実行とREFERENCES 同じ
マネージドID 論理サーバーのIDとRBAC 対応するID構成と追加サーバー設定

10 完了確認

対象DBへの接続、資格情報名とURLの一致、専用ユーザーの権限、HTTP 200と回答取得を確認する。デモ資料から実キーとパスワードを除去する。本番運用の設計は、送信データの範囲、API費用、監査、同時実行、障害時の動作を別途決める。

参考資料

[1] 外部REST呼び出しの仕様 公式ページを開く

[2] Azure OpenAI v1 API 公式ページを開く

[3] データベーススコープ資格情報 公式ページを開く

[4] SSMSでAzure SQL Databaseに接続 公式ページを開く

[5] Azure SQL Databaseの送信ファイアウォール規則 公式ページを開く

[6] JSON_VALUEの文字数制限 公式ページを開く

仕様確認日 2026年10月7日。ネットワーク制限やサービス仕様は、実環境で登壇前に確認する。

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?