Azure OpenAI ServiceでAzure AD認証を使用してGPTモデルにアクセスする

Azure OpenAIにはOpenAI社の提供するAPIとの相違点として、Azure AD認証を使用してAPIを呼び出すことができるという大きな特徴があります。

本記事ではこれを用いて、セキュアな環境でAzure OpenAI Serviceにアクセスするまでの手順を解説します。

概要

Azure OpenAI Serviceを使用するためには認証が必要です。
認証にはAPIキーを使用する方法と、Azure Active Directoryを使用した方法の2種類が存在します。

learn.microsoft.com

キー認証の場合、アクセスキーが漏洩してしまうと誰でもAPIを使えてしまうといった課題があります。

前者の方法を使用する場合、Azure Key Vaultを使用することで、認証用のアクセスキーをコードに直接記述することなく与えることができます。
後者の方法を使用する場合はAzure OpenAI Serviceのロールを設定できるため、アクセスキーを全く使わずにアクセスを許可することができます。
本記事ではこれら2つの手順をもとに、AD認証でAzure Open Serviceをセキュアに使用する方法を解説します。

手順

認証用アプリケーションの作成

Azure OpenAI ServiceはAzure AD認証によって利用することができます。
アプリケーションからAD認証を行ってAzure OpenAI Serviceを使用する場合、以下の手順で作業を行います。

Azure Portalにサインインして、Azure Active Directoryを開きます。
「アプリの登録」から新規登録を選択します。
以下の図のように、任意の名前でアプリケーションを作成します。

クライアントシークレットを作成します。

以下の3つの値を控えます。

  • アプリケーション (クライアント) ID
    • 「概要」から確認する
  • ディレクトリ (テナント) ID
    • 「概要」から確認する
  • クライアントシークレット値
    • 「証明書とシークレット」から値を確認する

Azure OpenAIリソースに認証用のアプリを追加します。
アクセス制御(IAM)を開いて、ロールの割り当てタブから「新規追加」をクリックします。 単にモデルにリクエストを送信して推論を行うユーザーの場合、ロールは「Cognitive Services ユーザー」を設定します。

作成後、実行環境の環境変数に取得した値を設定します。

import os

os.environ['AZURE_CLIENT_ID']     = 'アプリケーション (クライアント) ID'
os.environ['AZURE_CLIENT_SECRET'] = 'クライアントシークレット値'
os.environ['AZURE_TENANT_ID']     = 'ディレクトリ (テナント) ID'

認証を行う

Azure Active Directory認証でリクエストを送信する

以下のコードを実行してAzure OpenAIを使用する設定を行います。

import openai
from azure.identity import DefaultAzureCredential

default_credential = DefaultAzureCredential()
token = default_credential.get_token("https://cognitiveservices.azure.com/.default")

openai.api_type = "azure_ad"
openai.api_key = token.token
openai.api_base = RESOURCE_ENDPOINT
openai.api_version = "2023-03-15-preview"

DefaultAzureCredential()によって環境変数の値を使用します。
openaiのapi_typeを「azure_ad」として、api_keyには認証用に発行したトークンを入力します。

認証に正しく通るとトークンが発行できるため、設定後は通常通りにメソッドを使用することができます。

Azure Key Vaultに格納したシークレットでリクエストを送信する

Azure Key Vaultリソースを作成します。
オブジェクト-シークレットの項目から、任意の名称でAPIキーをシークレットに登録します。

Key Vaultのアクセスポリシーを新規に作成します。
シークレットのアクセス許可を設定します。

アクセス許可の対象には、上記で作成したアプリケーションのIDを設定します。

この状態で以下のソースコードを実行します。 Azure Key Vaultへの認証が正しく行われるとclient.get_secret(secret_name).valueによってシークレットの生値が取得できるため、ソースコード上にAPIキーを記述することなくAzure OpenAIへの認証を行うことができます。

from azure.keyvault.secrets import SecretClient

kv_uri = ""
secret_name = "openaikey"

credential = DefaultAzureCredential()
client = SecretClient(vault_url=kv_uri, credential=credential)

openai.api_type = "azure"
openai.api_key = client.get_secret(secret_name).value
openai.api_base = RESOURCE_ENDPOINT
openai.api_version = "2023-03-15-preview"

終わりに

本記事ではAzure AD認証を使用してAzure OpenAI Serviceを使用する方法を解説しました。
アクセスキーの漏洩を防ぐことや、セキュアにAPIにアクセスすることはシステム構築の上で肝心な要素となるため、この点はぜひ押さえておきましょう。

執筆担当者プロフィール
西野 佑基

西野 佑基(日本ビジネスシステムズ株式会社)

機械学習系ソリューション開発、業務Webアプリ開発、開発環境自動化などを担当。

担当記事一覧