1
2

More than 1 year has passed since last update.

Azure Function(Nodejs)からマネージドIDでAzure OpenAIを呼び出す

Posted at

はじめに

Azure OpenAIを使うなら、マネージドIDでセキュアに利用したいですよね。キーとか持ちたくないです。関連情報は色々とあるもののNodejsのFunctionからという情報があまり見つからなかったので、こちらに記事として残します。

マネージドIDをつかうAzure FunctionのNodejsのコード

例外処理も何もいれないで素のChatGPTからの返り値をそのままメッセージとして返してるコードです。ポイントは、@azure/identityをつかって、new DefaultAzureCredential()をいれてクライアントを作ってるところくらいでしょうか
環境変数としては1.エンドポイントと2.モデル名を持っています。(キーはありません)

なお、利用したライブラリは@azure/openaiです。なんか色々あるんですが、ここにもある通り一番公式っぽいのでそれを使いました。
クイック スタート: Azure OpenAI Service で ChatGPT と GPT-4 の使用を開始する

マネージドIDについてはこちらに情報があります。
https://learn.microsoft.com/ja-jp/javascript/api/overview/azure/openai-readme?view=azure-node-preview#using-an-azure-active-directory-credential
ここではAzure AD認証として、テナントIDとかの環境変数が~とか書いてますが、マネージドIDでやるのでAADにまつわる環境変数は不要です。

module.exports = async function (context, req) {
  
      const { OpenAIClient } = require("@azure/openai");
      const { DefaultAzureCredential } = require("@azure/identity");
      const client = new OpenAIClient(
        process.env.OPENAI_API_ENDPOINT, //ここにエンドポイント
        new DefaultAzureCredential()
      );
  
      const messages = [
        { role: "system", content: "You are an AI assistant." },
        { role: "user", content: "Hello" },
      ];

      const result = await client.getChatCompletions(process.env.OPENAI_ENGINE, messages); //ここにモデル名
      let message;
      for (const choice of result.choices) {
        message = choice.message;
      }
    
      context.res = {
        status: 200,
        body: { message: message },
        headers: {
          "Content-Type": "application/json",
        },
      };
  };
  

Azure FunctionでマネージドIDを有効にする

ポータルからだと、「関数アプリ」の「ID」から状態を「オン」にして保存するだけです。

image.png

Azure OpenAI Servcieでロールを設定する

Azure OpenAI Service の「アクセス制御(IAM)」から「+追加」します。

image.png

割り当てるロールは、公式に書いてある通り「Cognitive Service ユーザ」を選びます。(OpenAI ユーザの方がよさそうですが、公式に書いてあるほうで)

その上で、マネージドIDとして先に割り当てたFunctionを指定します。

以上です。

まとめ

キーをつかわずにAzure Function(nodejs)からAzure OpenAIサービスが呼び出せます。

{
    "message": {
        "role": "assistant",
        "content": "Hello! I'm an AI assistant, ready to help you with any questions or tasks you may have. How can I assist you today?"
    }
}

これだけではありますが、javascriptの場合いくつもoepnaiのライブラリがあってちょっと混乱したので、整理のためにまとめてみました。Azure App Servcie とかでも基本同じ流れですし、pythonや.NETならまた違うライブラリ違う記述方法になりますね。

あとはFunctionにAAD認証をつけたりVNETにいれたり、Azure OpenAIはプライベートエンドポイントを使うなどすればガチガチの環境のできあがりですが、ひとまずマネージドIDを使うとキー漏洩からは安心ということで。

1
2
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
1
2