برنامه نویسی

اتصال ایمن برنامه های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت شده توسط کاربر

Summarize this content to 400 words in Persian Lang
امروز، می‌خواهم دو نکته کلیدی را از ورودی «اتصال ایمن برنامه‌های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت‌شده توسط کاربر» به اشتراک بگذارم:

استقرار برنامه های جاوا در برنامه های کانتینر Azure بدون کانتینرسازی
اتصال ایمن از برنامه های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت شده توسط کاربر

کد منبع استفاده شده در اینجا را می توان در مخزن GitHub زیر یافت.GitHub: Secure-OpenAI-Java-App-on-Azure-Container-Apps

1. استقرار برنامه های جاوا در برنامه های کانتینر Azure بدون کانتینرسازی

در 11 سپتامبر 2024، اعلامیه “اعلام دسترسی عمومی تجربیات جاوا در برنامه های کانتینر Azure” منتشر شد.

همانطور که در مرور کلی برنامه های کانتینر جاوا در Azure توضیح داده شده است، پشتیبانی از جاوا در برنامه های کانتینر Azure افزایش یافته است. برای مثال، Azure Container Apps اکنون از اجزای Spring زیر به عنوان خدمات مدیریت شده پشتیبانی می کند:

سرور Eureka برای بهار
سرور پیکربندی برای Spring
ادمین برای بهار

علاوه بر این، همانطور که در Quickstart: Launch Your First Java Application in Azure Container Apps توضیح داده شد، Azure Container Apps اکنون ویژگی جدیدی به نام ارائه می کند. Cloud Build Service. این به شما امکان می دهد برنامه ها را مستقیماً از مصنوعات جاوا مانند فایل های JAR یا WAR به برنامه های کانتینر Azure مستقر کنید. این سرویس به طور خودکار تصاویر کانتینر را از مصنوعات جاوا مشخص شده ایجاد و مستقر می کند و نیازی به نوشتن دستی تعاریف کانتینر Dockerfile یا مدیریت ساخت و فشار کانتینر را از بین می برد.

برای رسیدن به این هدف با برنامه های کانتینر Azure، از az containerapp up دستور داده و آرتیفکت جاوا را به عنوان آرگومان مشخص کنید. مراحل مفصل بعداً در راهنما ارائه شده است (نگاه کنید به: 2.8 Creating an Azure Container Apps Instance).

این امر به طور قابل توجهی استقرار برنامه های جاوا را در برنامه های کانتینر Azure ساده می کند. Azure Container Apps همچنین می‌تواند تعداد نمونه‌ها را در صورت نیاز از صفر مقیاس‌بندی کند و آن را به یک سرویس بسیار راحت تبدیل کند. ما شما را تشویق می کنیم که آن را امتحان کنید.

2. اتصال ایمن برنامه های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت شده توسط کاربر

در زمان‌های اخیر، اقدامات امنیتی اهمیت فزاینده‌ای پیدا کرده‌اند و برای کسب‌وکارها ضروری است که سیستم‌های امن‌تری بسازند. مایکروسافت توصیه می‌کند هنگام ایجاد محیط‌های امن، مانند محیط‌های تولید، به جای دسترسی مبتنی بر رمز عبور، از Managed Identity برای اتصالات استفاده کنید. این رویکرد از احراز هویت مایکروسافت Entra ID استفاده می کند.

این روش به شما امکان می دهد مجوزهای خاصی را برای منابع در یک محدوده تعریف شده اعطا کنید و مدیریت امنیت را انعطاف پذیرتر می کند. برای جزئیات بیشتر در مورد هویت مدیریت شده، به مقاله “هویت های مدیریت شده برای منابع Azure چیست؟” مراجعه کنید. در این مدخل، من به وضوح نحوه راه اندازی یک شناسه مدیریت شده توسط کاربر را به صورت گام به گام توضیح خواهم داد.

دنبال کردن این مراحل به شما در درک نحوه پیکربندی آن کمک می کند، و همچنین می توانند به عنوان مرجعی برای تنظیم منابع دیگر عمل کنند.

مراحل تنظیم هویت مدیریت شده توسط کاربر

برای اتصال برنامه‌های کانتینر Azure به Azure OpenAI با استفاده از یک شناسه مدیریت‌شده کاربر، این مراحل را برای تنظیم محیط دنبال کنید:

تنظیم متغیرهای محیطی
یک گروه منابع ایجاد کنید
یک نمونه Azure OpenAI ایجاد کنید
یک هویت مدیریت شده توسط کاربر ایجاد کنید
نقش ها را به هویت مدیریت شده توسط کاربر برای Azure OpenAI اختصاص دهید
یک محیط برنامه های کانتینر Azure ایجاد کنید
یک برنامه وب Spring Boot توسعه دهید
یک نمونه برنامه Azure Container ایجاد کنید
شناسه مدیریت شده توسط کاربر را به برنامه های کانتینر Azure اختصاص دهید
Setup را تأیید کنید

2.1. تنظیم متغیرهای محیطی

هنگام تنظیم محیط، متغیرهای محیط را برای جلوگیری از ورودی های تکراری پیکربندی کنید.

export RESOURCE_GROUP=yoshio-OpenAI-rg
export LOCATION=eastus2
export AZURE_OPENAI_NAME=yt-secure-openai
export OPENAI_DEPLOY_MODEL_NAME=gpt-4o
export USER_MANAGED_IDENTITY_NAME=yoshio-user-managed-id
export SUBSCRIPTION=$(az account show –query id –output tsv)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر نام متغیرهای محیطی و توضیحات آنها آمده است. اگر می‌خواهید نام‌ها را متناسب با محیط خود تغییر دهید، لطفاً به توضیحات زیر مراجعه کنید تا نام هر منبع را متناسب با آن تغییر دهید.

نام متغیر محیطی
توضیحات

RESOURCE_GROUP
نام گروه منبع برای ایجاد

مکان
مکانی که محیط در آن راه اندازی خواهد شد

USER_MANAGED_IDENTITY_NAME
نام هویت مدیریت شده توسط کاربر

AZURE_OPENAI_NAME
نام Azure OpenAI

OPENAI_DEPLOY_MODEL_NAME
نام مدل هوش مصنوعی که قرار است به کار گرفته شود

اشتراک
شناسه اشتراک مورد استفاده

2.2. یک گروه منابع ایجاد کنید

ابتدا یک گروه منبع در محیط Azure ایجاد کنید. استفاده کنید –location آرگومان برای مشخص کردن منطقه Azure که در آن ایجاد خواهد شد.

az group create –name $RESOURCE_GROUP –location $LOCATION

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.3. یک نمونه Azure OpenAI ایجاد کنید

در مرحله بعد، یک نمونه Azure OpenAI با اجرای آن ایجاد کنید az cognitiveservices account create فرمان در این مرحله مشخص کنید –kind OpenAI و –custom-domain به عنوان مثال

az cognitiveservices account create \
–name $AZURE_OPENAI_NAME \
–resource-group $RESOURCE_GROUP \
–kind OpenAI \
–custom-domain $AZURE_OPENAI_NAME \
–sku S0 \
–location $LOCATION

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:تعیین آن بسیار مهم است –custom-domain هنگام ایجاد یک نمونه Azure OpenAI.در صورت حذف، الف region endpoint مانند https://eastus2.api.cognitive.microsoft.com/ به صورت خودکار تولید خواهد شد. همانطور که در “Authenticate with Microsoft Entra ID” ذکر شد، شما نمی توانید با استفاده از Microsoft Entra ID، در این مورد Managed Identity، بدون تعیین این گزینه، احراز هویت را انجام دهید. برای فعال کردن احراز هویت مدیریت شده، باید آن را مشخص کنید. –custom-domain.

در مرحله بعد، مدل OpenAI را در نمونه تازه ایجاد شده Azure OpenAI خود با استفاده از az cognitiveservices account deployment create فرمان در اینجا نام مدل را با مشخص کنید –model-name و نسخه مدل با –model-version. همچنین باید ظرفیت سرویس را با استفاده از آن تعریف کنید –sku-capacity و طرح خدمات را با انتخاب کنید –sku-name.

az cognitiveservices account deployment create \
–name $AZURE_OPENAI_NAME \
–resource-group $RESOURCE_GROUP \
–deployment-name $OPENAI_DEPLOY_MODEL_NAME \
–model-name $OPENAI_DEPLOY_MODEL_NAME \
–model-version “2024-08-06” \
–model-format OpenAI \
–sku-capacity “20” \
–sku-name “GlobalStandard”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار، ایجاد نمونه Azure OpenAI کامل شد. پس از ایجاد نمونه، اطلاعات لازم برای اجرای برنامه جاوا و سایر عملیات خود را در متغیرهای محیط ذخیره کنید.

export OPEN_AI_RESOURCE_ID=$(az cognitiveservices account list \
-g $RESOURCE_GROUP \
–query “[0].id” \
–output tsv)
export OPEN_AI_ENDPOINT=$(az cognitiveservices account show \
–resource-group $RESOURCE_GROUP \
–name $AZURE_OPENAI_NAME \
–query “properties.endpoint” \
–output tsv)
export OPEN_AI_ACCESS_KEY=$(az cognitiveservices account keys list \
–resource-group $RESOURCE_GROUP \
–name $AZURE_OPENAI_NAME \
–query key1 –output tsv)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما متغیرهای محیطی زیر را تنظیم می کنیم:

نام متغیر محیطی
توضیحات

OPEN_AI_RESOURCE_ID
شناسه منبع OpenAI(برای محدوده تعیین نقش مورد نیاز است)

OPEN_AI_ENDPOINT
نقطه پایانی OpenAI(برای اتصال برنامه جاوا لازم است)

OPEN_AI_ACCESS_KEY
کلید دسترسی برای OpenAI(برای توسعه برنامه جاوا به صورت محلی مورد نیاز است)

2.4. یک هویت مدیریت شده توسط کاربر ایجاد کنید

اکنون که نمونه Azure OpenAI راه اندازی شده است، گام بعدی ایجاد یک شناسه مدیریت شده توسط کاربر است. استفاده کنید az identity create فرمان

az identity create -g $RESOURCE_GROUP -n $USER_MANAGED_IDENTITY_NAME

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که User Managed Identity ایجاد شد، اطلاعات لازم برای اجرای دستورات بعدی و استفاده از برنامه جاوا را بازیابی کنید و آن را به متغیرهای محیطی اختصاص دهید.

export USER_MANAGED_ID_CLIENT_ID=$(az identity list \
-g $RESOURCE_GROUP \
–query “[0].clientId” \
-o tsv)
export USER_MANAGED_ID_PRINCIPAL_ID=$(az identity list \
-g $RESOURCE_GROUP \
–query “[0].principalId” \
-o tsv)
export USER_MANAGED_ID_RESOURCE_ID=$(az identity list \
-g $RESOURCE_GROUP \
–query “[0].id” \
-o tsv)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر توضیحی در مورد مقدار هر متغیر محیطی و استفاده از آن آورده شده است:

نام متغیر محیطی
توضیحات

USER_MANAGED_ID_CLIENT_ID
شناسه مشتری هویت مدیریت شده توسط کاربر(برای اجرای برنامه جاوا لازم است)

USER_MANAGED_ID_PRINCIPAL_ID
شناسه اصلی هویت مدیریت شده توسط کاربر(الزامی برای تعیین نقش)

USER_MANAGED_ID_RESOURCE_ID
شناسه منبع هویت مدیریت شده توسط کاربر(برای اختصاص شناسه به برنامه های کانتینر لازم است)

2.5. نقش ها را به هویت مدیریت شده توسط کاربر برای Azure OpenAI اختصاص دهید

استفاده کنید az role assignment create دستور اختصاص یک نقش به هویت مدیریت شده توسط کاربر، به آن اجازه می دهد تا با منبع OpenAI با استفاده از Cognitive Services OpenAI User اجازه

این $OPEN_AI_RESOURCE_ID شناسه منبع OpenAI را نشان می دهد و نقش به طور خاص به آن منبع اختصاص داده می شود. این روش تنها مجوزهای لازم را برای اجرای برنامه اعطا می کند و با اجتناب از مجوزهای غیر ضروری، امنیت را افزایش می دهد.

az role assignment create –assignee $USER_MANAGED_ID_PRINCIPAL_ID \
–scope $OPEN_AI_RESOURCE_ID \
–role “Cognitive Services OpenAI User”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر نقش های ذکر شده، می توانید نقش های زیر را نیز اختصاص دهید.

خدمات شناختی کاربر OpenAI
مشارکت کننده خدمات شناختی OpenAI
مشارکت کننده خدمات شناختی
خواننده استفاده از خدمات شناختی

برای اطلاعات دقیق در مورد قابلیت‌های هر نقش، لطفاً به کنترل دسترسی مبتنی بر نقش برای سرویس Azure OpenAI مراجعه کنید.

2.6. یک محیط برنامه های کانتینر Azure ایجاد کنید

در مرحله بعد، یک محیط برنامه های کانتینر Azure ایجاد کنید. برای انجام این کار با استفاده از Azure CLI، باید افزونه ها و ارائه دهندگان اضافی را ثبت کنید. اگر قبلاً دستورات زیر را اجرا نکرده اید، لطفاً همین الان آنها را اجرا کنید.

az upgrade
az extension add –name containerapp –upgrade -y
az provider register –namespace Microsoft.Web
az provider register –namespace Microsoft.App
az provider register –namespace Microsoft.OperationalInsights

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس، نام Azure Container Apps Environment را به عنوان یک متغیر محیطی تعریف کنید. نامی را انتخاب کنید که مناسب محیط شما باشد.

export CONTAINER_ENVIRONMENT=YTContainerEnv3

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت، را اجرا کنید az containerapp env create دستور تنظیم محیط

az containerapp env create –name $CONTAINER_ENVIRONMENT \
–enable-workload-profiles \
-g $RESOURCE_GROUP \
–location $LOCATION

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7. ایجاد یک وب اپلیکیشن Spring Boot

با راه اندازی Azure OpenAI و Azure Container Apps Environment، اکنون یک پروژه جاوا برای پیاده سازی یک برنامه ساده ایجاد می کنیم که یک مدل OpenAI را از یک برنامه جاوا فراخوانی می کند. ما از Spring Boot برای این پیاده سازی استفاده خواهیم کرد.

2.7.1 ایجاد پروژه Spring Boot

برای ایجاد پروژه Spring Boot دستور زیر را اجرا کنید. پس از ایجاد و دانلود پروژه، آرشیو را از حالت فشرده خارج کنید تا محتویات آن استخراج شود.

curl https://start.spring.io/starter.zip \
-d dependencies=web \
-d type=maven-project \
-d language=java \
-d bootVersion=3.3.3 \
-d baseDir=Yoshio-AI-App-Spring-Boot \
-d groupId=com.yoshio3 \
-d artifactId=Yoshio-AI-App \
-d name=myproject \
-d packageName=com.yoshio3 \
-o YoshioAIProject.zip

unzip YoshioAIProject.zip

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دستور بالا پروژه ای با ساختار دایرکتوری زیر ایجاد می کند.

├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── yoshio3
│ │ └── MyprojectApplication.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── java
└── com
└── yoshio3
└── MyprojectApplicationTests.java

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7.2 ویرایش فایل پروژه pom.xml

وابستگی های زیر را به pom.xml فایلی که در دایرکتوری ریشه قرار دارد. این شامل کتابخانه های لازم برای اتصال و احراز هویت با OpenAI می شود.

……

com.azure
azure-ai-openai
1.0.0-beta.11

com.azure
azure-identity
1.13.2

org.slf4j
slf4j-api
2.0.16

ch.qos.logback
logback-core
1.5.8

ch.qos.logback
logback-classic
1.5.8

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7.3 پیاده سازی نقطه پایانی RESTful (بخش اصلی)

بعد، یک را ایجاد کنید AIChatController.java فایل در src/main/java/com/yoshio3 دایرکتوری کد زیر را برای تعریف یک نقطه پایانی RESTful که پس از دریافت درخواست، OpenAI را درخواست می کند، پیاده سازی کنید.

package com.yoshio3;

import org.springframework.web.bind.annotation.RestController;
import com.azure.ai.openai.OpenAIClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.azure.ai.openai.models.ChatCompletions;
import com.azure.ai.openai.models.ChatCompletionsOptions;
import com.azure.ai.openai.models.ChatRequestAssistantMessage;
import com.azure.ai.openai.models.ChatRequestMessage;
import com.azure.ai.openai.models.ChatRequestSystemMessage;
import com.azure.ai.openai.models.ChatRequestUserMessage;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@RestController
public class AIChatController {

private static final Logger LOGGER = LoggerFactory.getLogger(AIChatController.class);

@Value(“${USER_MANAGED_ID_CLIENT_ID}”)
private String userManagedIDClientId;

@Value(“${OPENAI_ENDPOINT}”)
private String openAIEndpoint;

@Value(“${OPENAI_KEY}”)
private String openAIKey;

private static final String OPEN_AI_CHAT_MODEL = “gpt-4o”;

/**
* This API is used to chat with OpenAI’s GPT-4 model. And if user ask somethings, it will
* return the message with Pirate language.
*
* Ex. You can invoke the API by using the following command: curl -X POST
* http://localhost:8080/askAI -H “Content-Type: application/json” -d ‘{“message”:”Please tell
* me about the appeal of Spring Boot in Japanese.”}’
*
* @param message RequestMessage
* @return String Response from OpenAI
*/

@PostMapping(“/askAI”)
public String chat(@RequestBody RequestMessage message) {
return getResponseFromOpenAI(message.getMessage());
}

/**
* This method is used to get the response from OpenAI.
*
* For production environment, you can use Managed Identity to authenticate with OpenAI. If you
* want to use Managed Identity, please use the ManagedIdentityCredentialBuilder.
*
* For local development, you can use AzureKeyCredential to authenticate with OpenAI.
*
* @param message RequestMessage
* @return String Response from OpenAI
*/

private String getResponseFromOpenAI(String message) {
try {
// Create OpenAI client with User Managed Identity
ManagedIdentityCredential credential =
new ManagedIdentityCredentialBuilder().clientId(userManagedIDClientId).build();
OpenAIClient openAIClient = new OpenAIClientBuilder().credential(credential)
.endpoint(openAIEndpoint).buildClient();

// Create OpenAI client without Managed Identity (For local development)
// OpenAIClient openAIClient = new OpenAIClientBuilder().endpoint(openAIEndpoint)
// .credential(new AzureKeyCredential(openAIKey)).buildClient();

// Create Chat Request Messages
ListChatRequestMessage> chatMessages = new ArrayList();
chatMessages.add(new ChatRequestSystemMessage(“You are a helpful assistant. You will talk like a pirate.”));
chatMessages.add(new ChatRequestUserMessage(“Can you help me?”));
chatMessages.add(new ChatRequestAssistantMessage(“Of course, me hearty! What can I do for ye?”));
chatMessages.add(new ChatRequestUserMessage(message));
ChatCompletionsOptions chatCompletionsOptions = new ChatCompletionsOptions(chatMessages);

// Invoke OpenAI Chat API
ChatCompletions chatCompletions = openAIClient.getChatCompletions(OPEN_AI_CHAT_MODEL, chatCompletionsOptions);
StringBuilder response = new StringBuilder();
chatCompletions.getChoices()
.forEach(choice -> response.append(choice.getMessage().getContent()));

return response.toString();
} catch (Exception e) {
StackTraceElement[] stackTrace = e.getStackTrace();
LOGGER.error(e.getMessage());
LOGGER.error(e.getLocalizedMessage());
Throwable cause = e.getCause();
if (cause != null) {
LOGGER.error(e.getCause().toString());
}
for (StackTraceElement element : stackTrace) {
LOGGER.error(element.toString());
}
return e.getMessage();
}
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که OpenAIClient نمونه به دو صورت مختلف توصیف می شود. کد فعلی استفاده می کند ManagedIdentityCredential برای اتصال به Azure OpenAI با یک هویت مدیریت شده توسط کاربر. این کد فقط زمانی که در محیط Azure اجرا می شود کار می کند و در محیط محلی یا غیر Azure کار نخواهد کرد.

در طول توسعه، باید عملکرد را به صورت محلی آزمایش و تأیید کنید. در چنین مواردی نمی توان از یک شناسه مدیریت شده توسط کاربر استفاده کرد. در عوض، با استفاده از کلید دسترسی OpenAI با حذف نظر خط با، وصل شوید AzureKeyCredential(openAIKey) برای ایجاد نمونه OpenAIClient.

علاوه بر این، SLF4J و Logback برای ورود به سیستم در پیاده سازی استفاده می شود. آنها را با ایجاد a پیکربندی کنید logback-spring.xml فایل در /src/main/resources دایرکتوری در حالی که پیکربندی جزئیات گزارش در اینجا پوشش داده نشده است، کد اصلی برای مرجع در صورت نیاز در GitHub موجود است.

در نهایت، در اینجا یک نمای کلی از کد آورده شده است: هنگامی که یک سوال یا پیام از یک کاربر دریافت می شود، با لحن دزدان دریایی همانطور که توسط SYSTEM. از پاسخ های به سبک دزدان دریایی لذت ببرید!

2.7.4 تعریف فرمت JSON برای دریافت نقطه پایانی

سپس فرمت داده JSON را برای ارسال به این سرویس RESTful تعریف کنید. برای پردازش پیام هایی مانند {“message”:”What is the benefit of Spring Boot”} در BODY درخواست HTTP، کلاس زیر را تعریف کنید.

package com.yoshio3;

public class RequestMessage {
private String message;

public void setMessage(String message) {
this.message = message;
}

public String getMessage() {
return message;
}
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار، حداقل کد لازم برای تأیید عملیات را تکمیل کرده ایم.

2.7.5 پیکربندی برنامه

سپس تنظیمات را برای اتصال به Azure OpenAI پیکربندی کنید. در طول راه اندازی سیستم ها از بخش های 2.1 تا 2.6، تمام اطلاعات مورد نیاز در متغیرهای محیط ذخیره شد. دستور زیر را برای بازیابی اطلاعات لازم در برنامه جاوا اجرا کنید.

echo “USER_MANAGED_ID_CLIENT_ID” : $USER_MANAGED_ID_CLIENT_ID
echo “OPEN_AI_ENDPOINT” : $OPEN_AI_ENDPOINT
echo “OPEN_AI_ACCESS_KEY” : $OPEN_AI_ACCESS_KEY

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتایج اجرا را در بالا بنویسید application.properties فایل واقع در /src/main/resources/ دایرکتوری

spring.application.name=AI-Chatbot
logging.level.root=INFO
logging.level.org.springframework.web=INFO

USER_MANAGED_ID_CLIENT_ID=********-****-****-****-************
OPENAI_ENDPOINT=https://********.openai.azure.com/
OPENAI_KEY=********************************

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:OPENAI_KEY کلید دسترسی برای OpenAI است. از آن فقط در حین توسعه در محیط توسعه استفاده کنید و از استفاده در محیط تولید خودداری کنید.

2.7.6 (اختیاری): تأیید عملیات در یک محیط محلی

برای بررسی اینکه آیا برنامه جاوا به صورت محلی کار می کند یا خیر، نظرات را در قسمت تغییر دهید OpenAIClient ایجاد نمونه بخشی از AIChatController کد کلاس را اجرا کرده و اجرا کنید.

// ManagedIdentityCredential credential = new ManagedIdentityCredentialBuilder().clientId(userManagedIDClientId).build();
// OpenAIClient openAIClient = new OpenAIClientBuilder().credential(credential)
// .endpoint(openAIEndpoint).buildClient();

OpenAIClient openAIClient = new OpenAIClientBuilder().endpoint(openAIEndpoint)
.credential(new AzureKeyCredential(openAIKey)).buildClient();

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از انجام تغییرات، دستور زیر را اجرا کنید.

mvn spring-boot:run

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر برنامه Spring Boot با موفقیت راه اندازی شود، در پورت 8080 گوش می دهد. از موارد زیر استفاده کنید curl فرمان برای بررسی اینکه آیا می توانید از Azure OpenAI پرس و جو کنید.

curl -X POST http://localhost:8080/askAI \
-H “Content-Type: application/json” \
-d ‘{“message”:”What is the benefit of the Spring Boot?”}’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر بار که دستور را اجرا می کنید، پاسخ متفاوت خواهد بود، اما برای مثال، با یک لحن دزدان دریایی پاسخ می دهد.

Aye, Captain! Let me explain the benefits of Spring Boot.
Spring Boot is a framework that aids rapid application development.
It allows you to create standalone applications with minimal configuration.

It also comes with auto-configuration, reducing manual setup. Managing dependencies is easy, and it includes commonly used libraries.
It’s fast to start up, easy to deploy, and suitable for cloud operations.

It’s a powerful tool for boosting developer productivity.
Anything else I can assist with?

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از تکمیل تأیید محلی، تغییرات را برگردانید تا ایجاد شود OpenAIClient نمونه با استفاده از ManagedIdentityCredential.

2.7.7 ساخت برنامه و ایجاد مصنوعات

پس از تکمیل این مراحل، برنامه را بسازید و مصنوعات را ایجاد کنید.

mvn clean package

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از ساخت این پروژه، آثار باستانی در آن ایجاد خواهند شد target دایرکتوری در اینجا، برنامه Spring Boot به عنوان ایجاد می شود Yoshio-AI-App-0.0.1-SNAPSHOT.jar.

> ls -l target
total 40876
-rw-r–r– 1 teradayoshio wheel 41847613 9 14 14:52 Yoshio-AI-App-0.0.1-SNAPSHOT.jar
-rw-r–r– 1 teradayoshio wheel 7003 9 14 14:52 Yoshio-AI-App-0.0.1-SNAPSHOT.jar.original
drwxr-xr-x 5 teradayoshio wheel 160 9 14 20:34 classes
drwxr-xr-x 3 teradayoshio wheel 96 9 14 14:52 generated-sources
drwxr-xr-x 3 teradayoshio wheel 96 9 14 14:52 generated-test-sources
drwxr-xr-x 3 teradayoshio wheel 96 9 14 14:52 maven-archiver
drwxr-xr-x 3 teradayoshio wheel 96 9 14 14:52 maven-status
drwxr-xr-x 4 teradayoshio wheel 128 9 14 14:52 surefire-reports
drwxr-xr-x 3 teradayoshio wheel 96 9 14 20:34 test-classes

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.8. ایجاد نمونه برنامه های کانتینر Azure

اکنون که اجرای برنامه جاوا کامل شده است، اجازه دهید این برنامه جاوا را در برنامه های کانتینر Azure مستقر کنیم.

نام برنامه کانتینر را با استفاده از متغیر محیطی مشخص کنید CONTAINER_APP_NAME. مسیر و نام فایل آرتیفکت Spring Boot را با آن تعریف کنید JAR_FILE_PATH_AND_NAME.

export CONTAINER_APP_NAME=yoshio-ai-app
export JAR_FILE_PATH_AND_NAME=./target/Yoshio-AI-App-0.0.1-SNAPSHOT.jar

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در “1. استقرار برنامه های کاربردی جاوا در برنامه های کانتینر Azure بدون کانتینرسازی” توضیح داده شد، دیگر نیازی به ایجاد و استقرار تصویر کانتینر خود در هنگام استقرار در برنامه های کانتینر Azure ندارید. ما فقط مصنوع جاوا را داریم Yoshio-AI-App-0.0.1-SNAPSHOT.jar، و بر این اساس مستقر خواهیم کرد.

برای انجام این کار، از az containerapp up فرمان همانطور که از آرگومان ها می بینید، فقط باید مشخص کنید –artifact $JAR_FILE_PATH_AND_NAME، بدون هیچ آرگومان تصویر ظرف. این دستور به طور خودکار محیط ساخت را تنظیم می کند، کانتینر را می سازد و آن را مستقر می کند.

لطفا دستور زیر را اجرا کنید.

az containerapp up \
–name $CONTAINER_APP_NAME \
–resource-group $RESOURCE_GROUP \
–subscription $SUBSCRIPTION \
–location $LOCATION \
–environment $CONTAINER_ENVIRONMENT \
–artifact $JAR_FILE_PATH_AND_NAME \
–ingress external \
–target-port 8080 \
–env-vars AZURE_LOG_LEVEL=2 \
–query properties.configuration.ingress.fqdn

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:می توانید کمی ایجاد ظرف را سفارشی کنید. در صورت نیاز از متغیرهای محیطی ارائه شده در زیر استفاده کنید:ایجاد متغیرهای محیطی برای جاوا در برنامه های کانتینر Azure.

2.9. اختصاص هویت مدیریت شده توسط کاربر به برنامه های کانتینر Azure

پس از استقرار برنامه در برنامه‌های کانتینر Azure، مرحله آخر اعمال یک شناسه مدیریت‌شده توسط کاربر در ظرفی است که ایجاد کردیم. را اجرا کنید az containerapp identity assign فرمان

az containerapp identity assign –name $CONTAINER_APP_NAME \
–resource-group $RESOURCE_GROUP \
–user-assigned $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با آن، پیکربندی User Managed Identity کامل شده است.

2.10. تایید عملیات

حالا که تمام تنظیمات کامل شد، اجازه دهید عملیات را تأیید کنیم. ابتدا نام میزبان FQDN را که به Ingress کانتینر اختصاص داده شده است، بدست آورید.

export REST_ENDPOINT=$(az containerapp show -n $CONTAINER_APP_NAME \
-g $RESOURCE_GROUP \
–query properties.configuration.ingress.fqdn –output tsv)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس URL نقطه پایانی RESTful را به نام میزبان به دست آمده اضافه کنید و به آن متصل شوید.

curl -X POST https://$REST_ENDPOINT/askAI \
-H “Content-Type: application/json” \
-d ‘{“message”:”What is Spring Boot? please explain around 200 words?”}’

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر بار که اجرا می شود، پاسخ ممکن است متفاوت باشد، اما می توانید انتظار نتایجی مانند موارد زیر را داشته باشید.

Arrr, Spring Boot be a powerful framework fer buildin’ Java applications with minimal fuss, savvy?
It sails under the banner of the larger Spring ecosystem, providin’ a swift and easy approach fer creatin’ scalable and stand-alone web apps.

Ye see, it comes with embedded servers like Tomcat or Jetty, meanin’ ye don’t have the hassle of deployin’ to external servers.
Spring Boot simplifies the setup by makin’ configurations automatic, allowin’ developers to focus on writin’ their code without worryin’ about the boilerplate.

It also hoists the flag of convention over configuration, offerin’ defaults that make gettin’ started as smooth as a voyage with favorable winds.
Should ye need to adjust yer sails, customization be available through its easy-to-use properties.

And if ye treasure quick development, Spring Boot supports ye well with its rich assortment of pre-configured starters, integratin’ smoothly with other technologies like databases and messaging systems.

In essence, Spring Boot be a trusty vessel fer any sea-farin’ coder seekin’ speed, efficiency, and a treasure chest of features in their Java web applications.
Aye, it be a boon to all developers, whether seasoned or green as a fresh landlubber!

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.11. استفاده مجدد از همان هویت مدیریت شده کاربر برای دسترسی به Azure OpenAI از سایر منابع Azure

قبلاً در مورد نحوه اعمال a User Managed Identity به Azure Container Apps برای اتصال به Azure OpenAI. با این حال، این شناسه مدیریت شده توسط کاربر می تواند توسط سایر سرویس ها نیز مورد استفاده مجدد قرار گیرد.

به عبارت دیگر، برنامه‌های مستقر در دیگر منابع Azure می‌توانند از همان User Managed Identity برای اتصال به Azure OpenAI استفاده کنند.

برخی از منابع به شما امکان می دهند این هویت را در حین ایجاد مشخص کنید، در حالی که برای برخی دیگر، می توانید بعداً آن را اختصاص دهید.

در زیر، نحوه اختصاص یک شناسه مدیریت شده توسط کاربر به منابع موجود Azure، به جز نمونه‌های کانتینر Azure را نشان می‌دهیم.

برای Azure VM

برای اختصاص یک شناسه مدیریت شده توسط کاربر به ماشین مجازی Azure، دستور زیر را اجرا کنید:

az vm identity assign -g $RESOURCE_GROUP \
-n $VM_NAME \
–identities $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای سرویس برنامه Azure

برای اختصاص یک شناسه مدیریت شده توسط کاربر به یک سرویس برنامه Azure، دستور زیر را اجرا کنید:

az webapp identity assign -g $RESOURCE_GROUP \
–name $APP_SERVICE_NAME \
–identities $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای توابع Azure

برای اختصاص یک شناسه مدیریت شده توسط کاربر به توابع Azure، دستور زیر را اجرا کنید:

az functionapp identity assign -g $RESOURCE_GROUP \
-n $AZURE_FUNCTION_NAME \
–identities $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای نمونه های کانتینر Azure

برای نمونه‌های کانتینر Azure، می‌توانید در طول ایجاد نمونه، یک شناسه مدیریت‌شده توسط کاربر اختصاص دهید:

az container create \
–resource-group $RESOURCE_GROUP \
–name $CONTAINER_INSTANCE_NAME \
–image $CONTAINER_IMAGE \
–assign-identity $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای سرویس Azure Kubernetes

برای اختصاص یک شناسه مدیریت شده توسط کاربر به سرویس Azure Kubernetes، دستور زیر را اجرا کنید:

az aks update \
-g $RESOURCE_GROUP \
–name $AKS_CLUSTER_NAME \
–enable-managed-identity \
–assign-identity $USER_MANAGED_ID_RESOURCE_ID

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مانند این، با استفاده از یک شناسه مدیریت شده توسط کاربر، می توانید با استفاده مجدد از نقش های دسترسی به درستی پیکربندی شده، به طور ایمن به منابع هدف در سرویس های مختلف Azure متصل شوید.

2.12. مقایسه کلیدهای دسترسی و هویت های مدیریت شده توسط کاربر از دیدگاه امنیتی

این بخش تفاوت های امنیتی بین استفاده از کلیدهای دسترسی و هویت های مدیریت شده توسط کاربر برای Azure OpenAI را توضیح می دهد.

هنگام استفاده از یک شناسه مدیریت شده توسط کاربر، شما آن را مشخص می کنید client ID از شناسه مدیریت شده کاربر هنگام ایجاد نمونه ای از ManagedIdentityCredential کلاس در برنامه جاوا شما این client ID مقدار به عنوان یک متغیر محیطی تنظیم می شود $USER_MANAGED_ID_CLIENT_ID هنگامی که شناسه مدیریت شده توسط کاربر ایجاد می شود.

در نگاه اول، ممکن است به نظر برسد که این تنها بخش مهمی از اطلاعات مورد نیاز برای اتصال است، به غیر از URL نقطه پایانی.

ManagedIdentityCredential credential =
new ManagedIdentityCredentialBuilder()
.clientId(userManagedIDClientId)
.build();
OpenAIClient openAIClient = new OpenAIClientBuilder()
.credential(credential)
.endpoint(openAIEndpoint)
.buildClient();

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید تأثیر یک فاش شده را در نظر بگیریم client ID در مقابل لو رفته Access Key.

یک Access Key شبیه یک رمز عبور معمولی است. اگر فاش شود، هر کسی که رمز عبور را بداند می تواند به منبع دسترسی پیدا کند. در مورد Azure OpenAI، این بدان معناست که هر کسی می‌تواند از مدل‌های هوش مصنوعی مانند GPT-4 استفاده کند. اگر شبکه در دسترس عموم باشد، تأثیر آن می تواند حتی بیشتر باشد.

از سوی دیگر، اگر client ID لو رفته است، تاثیر محدود است. این به این دلیل است که client ID به تنهایی نمی تواند به Azure OpenAI متصل شود. برای استفاده از یک شناسه مدیریت شده توسط کاربر، این سرویس باید روی Azure اجرا شود. حتی اگر Azure OpenAI برای عموم قابل دسترسی باشد، نمی توانید از یک محیط محلی یا از طریق یک شبکه با استفاده از یک برنامه جاوا متصل شوید.

علاوه بر این، انتساب نقش زیر برای شناسه مدیریت شده کاربر پیکربندی شده است:

az role assignment create –assignee $USER_MANAGED_ID_PRINCIPAL_ID \
–scope $OPEN_AI_RESOURCE_ID \
–role “Cognitive Services OpenAI User”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تنظیم می کند که چه اقداماتی را می توان با استفاده از این شناسه کاربری انجام داد. اینجا، Cognitive Services OpenAI User این نقش برای خدمات Azure OpenAI اعطا می شود و مجوزها را به عملیات در Azure OpenAI محدود می کند.

این بدان معناست که حتی با این شناسه، نمی‌توانید اقدامات مدیریتی مانند اضافه کردن مدل‌ها را نه فقط در سراسر Azure بلکه حتی در Azure OpenAI انجام دهید.

علاوه بر این، برای استفاده از این شناسه کاربری، باید به عنوان یک سرپرست به Azure وارد شوید و تنها منابعی که توسط سرپرست مشخص شده است در محدوده مجوزهای این شناسه قابل دسترسی هستند.

به طور خلاصه، در مقایسه با تأثیر یک کلید دسترسی لو رفته، یک شناسه کلاینت فاش شده به چندین مرحله برای بهره برداری نیاز دارد و آن را ایمن تر می کند.

به این دلایل، شناسه‌های مدیریت‌شده توسط کاربر روشی امن‌تر برای مدیریت عملیات نسبت به کلیدهای دسترسی ارائه می‌کنند. ما شما را تشویق می کنیم که از هویت های مدیریت شده برای ایجاد یک محیط امن استفاده کنید.

3 خلاصه

در این راهنما، ما از طریق یک فرآیند دقیق و گام به گام برای اتصال ایمن برنامه های کانتینر Azure به Azure OpenAI با استفاده از یک شناسه مدیریت شده توسط کاربر، قدم برداشتیم. در حالی که راه اندازی یک شناسه مدیریت شده توسط کاربر ممکن است در ابتدا دشوار به نظر برسد، اما مزیت قابل توجه قابلیت استفاده مجدد را ارائه می دهد. اگر سیستم‌های شما کم هستند یا انعطاف‌پذیری یک نگرانی عمده نیست، ممکن است یک سیستم مدیریت شده هویت ترجیح داده شود.

با این حال، با افزایش تعداد سیستم ها، شناسه های مدیریت شده توسط کاربر بسیار مفید می شوند. پس از ایجاد یک شناسه مدیریت شده توسط کاربر و تخصیص نقش‌ها، می‌توانید از همان شناسه در سرویس‌های مختلفی مانند Azure App Service، Azure Functions، و Azure Kubernetes Services استفاده کنید. هرچه سیستم ها یا خدمات بیشتری را مدیریت کنید، این کار سودمندتر می شود.

لطفاً سعی کنید از هویت های مدیریت شده برای ایجاد محیط های امن استفاده کنید.

امروز، می‌خواهم دو نکته کلیدی را از ورودی «اتصال ایمن برنامه‌های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت‌شده توسط کاربر» به اشتراک بگذارم:

  1. استقرار برنامه های جاوا در برنامه های کانتینر Azure بدون کانتینرسازی
  2. اتصال ایمن از برنامه های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت شده توسط کاربر

کد منبع استفاده شده در اینجا را می توان در مخزن GitHub زیر یافت.
GitHub: Secure-OpenAI-Java-App-on-Azure-Container-Apps

فهرست مطالب

1. استقرار برنامه های جاوا در برنامه های کانتینر Azure بدون کانتینرسازی

در 11 سپتامبر 2024، اعلامیه “اعلام دسترسی عمومی تجربیات جاوا در برنامه های کانتینر Azure” منتشر شد.

همانطور که در مرور کلی برنامه های کانتینر جاوا در Azure توضیح داده شده است، پشتیبانی از جاوا در برنامه های کانتینر Azure افزایش یافته است. برای مثال، Azure Container Apps اکنون از اجزای Spring زیر به عنوان خدمات مدیریت شده پشتیبانی می کند:

  • سرور Eureka برای بهار
  • سرور پیکربندی برای Spring
  • ادمین برای بهار

علاوه بر این، همانطور که در Quickstart: Launch Your First Java Application in Azure Container Apps توضیح داده شد، Azure Container Apps اکنون ویژگی جدیدی به نام ارائه می کند. Cloud Build Service. این به شما امکان می دهد برنامه ها را مستقیماً از مصنوعات جاوا مانند فایل های JAR یا WAR به برنامه های کانتینر Azure مستقر کنید. این سرویس به طور خودکار تصاویر کانتینر را از مصنوعات جاوا مشخص شده ایجاد و مستقر می کند و نیازی به نوشتن دستی تعاریف کانتینر Dockerfile یا مدیریت ساخت و فشار کانتینر را از بین می برد.

برای رسیدن به این هدف با برنامه های کانتینر Azure، از az containerapp up دستور داده و آرتیفکت جاوا را به عنوان آرگومان مشخص کنید. مراحل مفصل بعداً در راهنما ارائه شده است (نگاه کنید به: 2.8 Creating an Azure Container Apps Instance).

این امر به طور قابل توجهی استقرار برنامه های جاوا را در برنامه های کانتینر Azure ساده می کند. Azure Container Apps همچنین می‌تواند تعداد نمونه‌ها را در صورت نیاز از صفر مقیاس‌بندی کند و آن را به یک سرویس بسیار راحت تبدیل کند. ما شما را تشویق می کنیم که آن را امتحان کنید.

2. اتصال ایمن برنامه های کانتینر Azure به Azure OpenAI با استفاده از هویت مدیریت شده توسط کاربر

در زمان‌های اخیر، اقدامات امنیتی اهمیت فزاینده‌ای پیدا کرده‌اند و برای کسب‌وکارها ضروری است که سیستم‌های امن‌تری بسازند. مایکروسافت توصیه می‌کند هنگام ایجاد محیط‌های امن، مانند محیط‌های تولید، به جای دسترسی مبتنی بر رمز عبور، از Managed Identity برای اتصالات استفاده کنید. این رویکرد از احراز هویت مایکروسافت Entra ID استفاده می کند.

این روش به شما امکان می دهد مجوزهای خاصی را برای منابع در یک محدوده تعریف شده اعطا کنید و مدیریت امنیت را انعطاف پذیرتر می کند. برای جزئیات بیشتر در مورد هویت مدیریت شده، به مقاله “هویت های مدیریت شده برای منابع Azure چیست؟” مراجعه کنید. در این مدخل، من به وضوح نحوه راه اندازی یک شناسه مدیریت شده توسط کاربر را به صورت گام به گام توضیح خواهم داد.

دنبال کردن این مراحل به شما در درک نحوه پیکربندی آن کمک می کند، و همچنین می توانند به عنوان مرجعی برای تنظیم منابع دیگر عمل کنند.

مراحل تنظیم هویت مدیریت شده توسط کاربر

برای اتصال برنامه‌های کانتینر Azure به Azure OpenAI با استفاده از یک شناسه مدیریت‌شده کاربر، این مراحل را برای تنظیم محیط دنبال کنید:

  1. تنظیم متغیرهای محیطی
  2. یک گروه منابع ایجاد کنید
  3. یک نمونه Azure OpenAI ایجاد کنید
  4. یک هویت مدیریت شده توسط کاربر ایجاد کنید
  5. نقش ها را به هویت مدیریت شده توسط کاربر برای Azure OpenAI اختصاص دهید
  6. یک محیط برنامه های کانتینر Azure ایجاد کنید
  7. یک برنامه وب Spring Boot توسعه دهید
  8. یک نمونه برنامه Azure Container ایجاد کنید
  9. شناسه مدیریت شده توسط کاربر را به برنامه های کانتینر Azure اختصاص دهید
  10. Setup را تأیید کنید

2.1. تنظیم متغیرهای محیطی

هنگام تنظیم محیط، متغیرهای محیط را برای جلوگیری از ورودی های تکراری پیکربندی کنید.

export RESOURCE_GROUP=yoshio-OpenAI-rg
export LOCATION=eastus2
export AZURE_OPENAI_NAME=yt-secure-openai
export OPENAI_DEPLOY_MODEL_NAME=gpt-4o
export USER_MANAGED_IDENTITY_NAME=yoshio-user-managed-id
export SUBSCRIPTION=$(az account show --query id --output tsv)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر نام متغیرهای محیطی و توضیحات آنها آمده است. اگر می‌خواهید نام‌ها را متناسب با محیط خود تغییر دهید، لطفاً به توضیحات زیر مراجعه کنید تا نام هر منبع را متناسب با آن تغییر دهید.

نام متغیر محیطی توضیحات
RESOURCE_GROUP نام گروه منبع برای ایجاد
مکان مکانی که محیط در آن راه اندازی خواهد شد
USER_MANAGED_IDENTITY_NAME نام هویت مدیریت شده توسط کاربر
AZURE_OPENAI_NAME نام Azure OpenAI
OPENAI_DEPLOY_MODEL_NAME نام مدل هوش مصنوعی که قرار است به کار گرفته شود
اشتراک شناسه اشتراک مورد استفاده

2.2. یک گروه منابع ایجاد کنید

ابتدا یک گروه منبع در محیط Azure ایجاد کنید. استفاده کنید --location آرگومان برای مشخص کردن منطقه Azure که در آن ایجاد خواهد شد.

az group create --name $RESOURCE_GROUP --location $LOCATION
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.3. یک نمونه Azure OpenAI ایجاد کنید

در مرحله بعد، یک نمونه Azure OpenAI با اجرای آن ایجاد کنید az cognitiveservices account create فرمان در این مرحله مشخص کنید --kind OpenAI و --custom-domain به عنوان مثال

az cognitiveservices account create \
  --name $AZURE_OPENAI_NAME \
  --resource-group $RESOURCE_GROUP \
  --kind OpenAI \
  --custom-domain $AZURE_OPENAI_NAME \
  --sku S0 \
  --location $LOCATION
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:

تعیین آن بسیار مهم است --custom-domain هنگام ایجاد یک نمونه Azure OpenAI.
در صورت حذف، الف region endpoint مانند https://eastus2.api.cognitive.microsoft.com/ به صورت خودکار تولید خواهد شد. همانطور که در “Authenticate with Microsoft Entra ID” ذکر شد، شما نمی توانید با استفاده از Microsoft Entra ID، در این مورد Managed Identity، بدون تعیین این گزینه، احراز هویت را انجام دهید. برای فعال کردن احراز هویت مدیریت شده، باید آن را مشخص کنید. --custom-domain.

در مرحله بعد، مدل OpenAI را در نمونه تازه ایجاد شده Azure OpenAI خود با استفاده از az cognitiveservices account deployment create فرمان در اینجا نام مدل را با مشخص کنید --model-name و نسخه مدل با --model-version. همچنین باید ظرفیت سرویس را با استفاده از آن تعریف کنید --sku-capacity و طرح خدمات را با انتخاب کنید --sku-name.

az cognitiveservices account deployment create \
  --name $AZURE_OPENAI_NAME \
  --resource-group  $RESOURCE_GROUP \
  --deployment-name $OPENAI_DEPLOY_MODEL_NAME \
  --model-name $OPENAI_DEPLOY_MODEL_NAME \
  --model-version "2024-08-06"  \
  --model-format OpenAI \
  --sku-capacity "20" \
  --sku-name "GlobalStandard"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار، ایجاد نمونه Azure OpenAI کامل شد. پس از ایجاد نمونه، اطلاعات لازم برای اجرای برنامه جاوا و سایر عملیات خود را در متغیرهای محیط ذخیره کنید.

export OPEN_AI_RESOURCE_ID=$(az cognitiveservices account list \
                                -g $RESOURCE_GROUP \
                                --query "[0].id" \
                                --output tsv)
export OPEN_AI_ENDPOINT=$(az cognitiveservices account show \
                                --resource-group $RESOURCE_GROUP \
                                --name $AZURE_OPENAI_NAME \
                                --query "properties.endpoint" \
                                --output tsv)
export OPEN_AI_ACCESS_KEY=$(az cognitiveservices account keys list \
                                --resource-group $RESOURCE_GROUP \
                                --name $AZURE_OPENAI_NAME \
                                --query key1 --output tsv)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا، ما متغیرهای محیطی زیر را تنظیم می کنیم:

نام متغیر محیطی توضیحات
OPEN_AI_RESOURCE_ID شناسه منبع OpenAI
(برای محدوده تعیین نقش مورد نیاز است)
OPEN_AI_ENDPOINT نقطه پایانی OpenAI
(برای اتصال برنامه جاوا لازم است)
OPEN_AI_ACCESS_KEY کلید دسترسی برای OpenAI
(برای توسعه برنامه جاوا به صورت محلی مورد نیاز است)

2.4. یک هویت مدیریت شده توسط کاربر ایجاد کنید

اکنون که نمونه Azure OpenAI راه اندازی شده است، گام بعدی ایجاد یک شناسه مدیریت شده توسط کاربر است. استفاده کنید az identity create فرمان

az identity create -g $RESOURCE_GROUP -n $USER_MANAGED_IDENTITY_NAME
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هنگامی که User Managed Identity ایجاد شد، اطلاعات لازم برای اجرای دستورات بعدی و استفاده از برنامه جاوا را بازیابی کنید و آن را به متغیرهای محیطی اختصاص دهید.

export USER_MANAGED_ID_CLIENT_ID=$(az identity list \
                                        -g $RESOURCE_GROUP \
                                        --query "[0].clientId" \
                                        -o tsv)
export USER_MANAGED_ID_PRINCIPAL_ID=$(az identity list \
                                        -g $RESOURCE_GROUP \
                                        --query "[0].principalId" \
                                        -o tsv)
export USER_MANAGED_ID_RESOURCE_ID=$(az identity list \
                                        -g $RESOURCE_GROUP \
                                        --query "[0].id" \
                                        -o tsv)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در زیر توضیحی در مورد مقدار هر متغیر محیطی و استفاده از آن آورده شده است:

نام متغیر محیطی توضیحات
USER_MANAGED_ID_CLIENT_ID شناسه مشتری هویت مدیریت شده توسط کاربر
(برای اجرای برنامه جاوا لازم است)
USER_MANAGED_ID_PRINCIPAL_ID شناسه اصلی هویت مدیریت شده توسط کاربر
(الزامی برای تعیین نقش)
USER_MANAGED_ID_RESOURCE_ID شناسه منبع هویت مدیریت شده توسط کاربر
(برای اختصاص شناسه به برنامه های کانتینر لازم است)

2.5. نقش ها را به هویت مدیریت شده توسط کاربر برای Azure OpenAI اختصاص دهید

استفاده کنید az role assignment create دستور اختصاص یک نقش به هویت مدیریت شده توسط کاربر، به آن اجازه می دهد تا با منبع OpenAI با استفاده از Cognitive Services OpenAI User اجازه

این $OPEN_AI_RESOURCE_ID شناسه منبع OpenAI را نشان می دهد و نقش به طور خاص به آن منبع اختصاص داده می شود. این روش تنها مجوزهای لازم را برای اجرای برنامه اعطا می کند و با اجتناب از مجوزهای غیر ضروری، امنیت را افزایش می دهد.

az role assignment create --assignee $USER_MANAGED_ID_PRINCIPAL_ID \
                          --scope $OPEN_AI_RESOURCE_ID \
                          --role "Cognitive Services OpenAI User" 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

علاوه بر نقش های ذکر شده، می توانید نقش های زیر را نیز اختصاص دهید.

  • خدمات شناختی کاربر OpenAI
  • مشارکت کننده خدمات شناختی OpenAI
  • مشارکت کننده خدمات شناختی
  • خواننده استفاده از خدمات شناختی

برای اطلاعات دقیق در مورد قابلیت‌های هر نقش، لطفاً به کنترل دسترسی مبتنی بر نقش برای سرویس Azure OpenAI مراجعه کنید.

2.6. یک محیط برنامه های کانتینر Azure ایجاد کنید

در مرحله بعد، یک محیط برنامه های کانتینر Azure ایجاد کنید. برای انجام این کار با استفاده از Azure CLI، باید افزونه ها و ارائه دهندگان اضافی را ثبت کنید. اگر قبلاً دستورات زیر را اجرا نکرده اید، لطفاً همین الان آنها را اجرا کنید.

az upgrade
az extension add --name containerapp --upgrade -y
az provider register --namespace Microsoft.Web
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس، نام Azure Container Apps Environment را به عنوان یک متغیر محیطی تعریف کنید. نامی را انتخاب کنید که مناسب محیط شما باشد.

export CONTAINER_ENVIRONMENT=YTContainerEnv3
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در نهایت، را اجرا کنید az containerapp env create دستور تنظیم محیط

az containerapp env create --name $CONTAINER_ENVIRONMENT \
                           --enable-workload-profiles \
                           -g $RESOURCE_GROUP \
                           --location $LOCATION
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7. ایجاد یک وب اپلیکیشن Spring Boot

با راه اندازی Azure OpenAI و Azure Container Apps Environment، اکنون یک پروژه جاوا برای پیاده سازی یک برنامه ساده ایجاد می کنیم که یک مدل OpenAI را از یک برنامه جاوا فراخوانی می کند. ما از Spring Boot برای این پیاده سازی استفاده خواهیم کرد.

2.7.1 ایجاد پروژه Spring Boot

برای ایجاد پروژه Spring Boot دستور زیر را اجرا کنید. پس از ایجاد و دانلود پروژه، آرشیو را از حالت فشرده خارج کنید تا محتویات آن استخراج شود.

curl https://start.spring.io/starter.zip \
  -d dependencies=web \
  -d type=maven-project \
  -d language=java \
  -d bootVersion=3.3.3 \
  -d baseDir=Yoshio-AI-App-Spring-Boot \
  -d groupId=com.yoshio3 \
  -d artifactId=Yoshio-AI-App \
  -d name=myproject \
  -d packageName=com.yoshio3 \
  -o YoshioAIProject.zip

unzip YoshioAIProject.zip
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دستور بالا پروژه ای با ساختار دایرکتوری زیر ایجاد می کند.

├── HELP.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── yoshio3
    │   │           └── MyprojectApplication.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── yoshio3
                    └── MyprojectApplicationTests.java
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7.2 ویرایش فایل پروژه pom.xml

وابستگی های زیر را به pom.xml فایلی که در دایرکتوری ریشه قرار دارد. این شامل کتابخانه های لازم برای اتصال و احراز هویت با OpenAI می شود.

    
       ......
        
            com.azure
            azure-ai-openai
            1.0.0-beta.11
        
       
            com.azure
            azure-identity
            1.13.2
        
        
            org.slf4j
            slf4j-api
            2.0.16
        
        
            ch.qos.logback
            logback-core
            1.5.8
        
        
            ch.qos.logback
            logback-classic
            1.5.8
        
    
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.7.3 پیاده سازی نقطه پایانی RESTful (بخش اصلی)

بعد، یک را ایجاد کنید AIChatController.java فایل در src/main/java/com/yoshio3 دایرکتوری کد زیر را برای تعریف یک نقطه پایانی RESTful که پس از دریافت درخواست، OpenAI را درخواست می کند، پیاده سازی کنید.

package com.yoshio3;

import org.springframework.web.bind.annotation.RestController;
import com.azure.ai.openai.OpenAIClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.azure.ai.openai.models.ChatCompletions;
import com.azure.ai.openai.models.ChatCompletionsOptions;
import com.azure.ai.openai.models.ChatRequestAssistantMessage;
import com.azure.ai.openai.models.ChatRequestMessage;
import com.azure.ai.openai.models.ChatRequestSystemMessage;
import com.azure.ai.openai.models.ChatRequestUserMessage;
import com.azure.core.credential.AzureKeyCredential;
import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;


@RestController
public class AIChatController {

    private static final Logger LOGGER = LoggerFactory.getLogger(AIChatController.class);

    @Value("${USER_MANAGED_ID_CLIENT_ID}")
    private String userManagedIDClientId;

    @Value("${OPENAI_ENDPOINT}")
    private String openAIEndpoint;

    @Value("${OPENAI_KEY}")
    private String openAIKey;

    private static final String OPEN_AI_CHAT_MODEL = "gpt-4o";

    /**
     * This API is used to chat with OpenAI's GPT-4 model. And if user ask somethings, it will
     * return the message with Pirate language.
     * 
     * Ex. You can invoke the API by using the following command: curl -X POST
     * http://localhost:8080/askAI -H "Content-Type: application/json" -d '{"message":"Please tell
     * me about the appeal of Spring Boot in Japanese."}'
     * 
     * @param message RequestMessage
     * @return String Response from OpenAI
     */

    @PostMapping("/askAI")
    public String chat(@RequestBody RequestMessage message) {
        return getResponseFromOpenAI(message.getMessage());
    }

    /**
     * This method is used to get the response from OpenAI.
     * 
     * For production environment, you can use Managed Identity to authenticate with OpenAI. If you
     * want to use Managed Identity, please use the ManagedIdentityCredentialBuilder.
     * 
     * For local development, you can use AzureKeyCredential to authenticate with OpenAI.
     * 
     * @param message RequestMessage
     * @return String Response from OpenAI
     */

    private String getResponseFromOpenAI(String message) {
        try {
            // Create OpenAI client with User Managed Identity
            ManagedIdentityCredential credential =
                    new ManagedIdentityCredentialBuilder().clientId(userManagedIDClientId).build();
            OpenAIClient openAIClient = new OpenAIClientBuilder().credential(credential)
                    .endpoint(openAIEndpoint).buildClient();

            // Create OpenAI client without Managed Identity (For local development)
            // OpenAIClient openAIClient = new OpenAIClientBuilder().endpoint(openAIEndpoint)
            // .credential(new AzureKeyCredential(openAIKey)).buildClient();

            // Create Chat Request Messages
            ListChatRequestMessage> chatMessages = new ArrayList();
            chatMessages.add(new ChatRequestSystemMessage("You are a helpful assistant. You will talk like a pirate."));
            chatMessages.add(new ChatRequestUserMessage("Can you help me?"));
            chatMessages.add(new ChatRequestAssistantMessage("Of course, me hearty! What can I do for ye?"));
            chatMessages.add(new ChatRequestUserMessage(message));
            ChatCompletionsOptions chatCompletionsOptions = new ChatCompletionsOptions(chatMessages);

            // Invoke OpenAI Chat API
            ChatCompletions chatCompletions = openAIClient.getChatCompletions(OPEN_AI_CHAT_MODEL, chatCompletionsOptions);
            StringBuilder response = new StringBuilder();
            chatCompletions.getChoices()
                    .forEach(choice -> response.append(choice.getMessage().getContent()));

            return response.toString();
        } catch (Exception e) {
            StackTraceElement[] stackTrace = e.getStackTrace();
            LOGGER.error(e.getMessage());
            LOGGER.error(e.getLocalizedMessage());
            Throwable cause = e.getCause();
            if (cause != null) {
                LOGGER.error(e.getCause().toString());
            }
            for (StackTraceElement element : stackTrace) {
                LOGGER.error(element.toString());
            }
            return e.getMessage();
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که OpenAIClient نمونه به دو صورت مختلف توصیف می شود. کد فعلی استفاده می کند ManagedIdentityCredential برای اتصال به Azure OpenAI با یک هویت مدیریت شده توسط کاربر. این کد فقط زمانی که در محیط Azure اجرا می شود کار می کند و در محیط محلی یا غیر Azure کار نخواهد کرد.

در طول توسعه، باید عملکرد را به صورت محلی آزمایش و تأیید کنید. در چنین مواردی نمی توان از یک شناسه مدیریت شده توسط کاربر استفاده کرد. در عوض، با استفاده از کلید دسترسی OpenAI با حذف نظر خط با، وصل شوید AzureKeyCredential(openAIKey) برای ایجاد نمونه OpenAIClient.

علاوه بر این، SLF4J و Logback برای ورود به سیستم در پیاده سازی استفاده می شود. آنها را با ایجاد a پیکربندی کنید logback-spring.xml فایل در /src/main/resources دایرکتوری در حالی که پیکربندی جزئیات گزارش در اینجا پوشش داده نشده است، کد اصلی برای مرجع در صورت نیاز در GitHub موجود است.

در نهایت، در اینجا یک نمای کلی از کد آورده شده است: هنگامی که یک سوال یا پیام از یک کاربر دریافت می شود، با لحن دزدان دریایی همانطور که توسط SYSTEM. از پاسخ های به سبک دزدان دریایی لذت ببرید!

2.7.4 تعریف فرمت JSON برای دریافت نقطه پایانی

سپس فرمت داده JSON را برای ارسال به این سرویس RESTful تعریف کنید. برای پردازش پیام هایی مانند {"message":"What is the benefit of Spring Boot"} در BODY درخواست HTTP، کلاس زیر را تعریف کنید.

package com.yoshio3;

public class RequestMessage {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار، حداقل کد لازم برای تأیید عملیات را تکمیل کرده ایم.

2.7.5 پیکربندی برنامه

سپس تنظیمات را برای اتصال به Azure OpenAI پیکربندی کنید. در طول راه اندازی سیستم ها از بخش های 2.1 تا 2.6، تمام اطلاعات مورد نیاز در متغیرهای محیط ذخیره شد. دستور زیر را برای بازیابی اطلاعات لازم در برنامه جاوا اجرا کنید.

echo "USER_MANAGED_ID_CLIENT_ID" : $USER_MANAGED_ID_CLIENT_ID
echo "OPEN_AI_ENDPOINT" : $OPEN_AI_ENDPOINT
echo "OPEN_AI_ACCESS_KEY" : $OPEN_AI_ACCESS_KEY
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتایج اجرا را در بالا بنویسید application.properties فایل واقع در /src/main/resources/ دایرکتوری

spring.application.name=AI-Chatbot
logging.level.root=INFO
logging.level.org.springframework.web=INFO

USER_MANAGED_ID_CLIENT_ID=********-****-****-****-************
OPENAI_ENDPOINT=https://********.openai.azure.com/
OPENAI_KEY=********************************
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:

OPENAI_KEY کلید دسترسی برای OpenAI است. از آن فقط در حین توسعه در محیط توسعه استفاده کنید و از استفاده در محیط تولید خودداری کنید.

2.7.6 (اختیاری): تأیید عملیات در یک محیط محلی

برای بررسی اینکه آیا برنامه جاوا به صورت محلی کار می کند یا خیر، نظرات را در قسمت تغییر دهید OpenAIClient ایجاد نمونه بخشی از AIChatController کد کلاس را اجرا کرده و اجرا کنید.

// ManagedIdentityCredential credential = new ManagedIdentityCredentialBuilder().clientId(userManagedIDClientId).build();
// OpenAIClient openAIClient = new OpenAIClientBuilder().credential(credential)
//                    .endpoint(openAIEndpoint).buildClient();

 OpenAIClient openAIClient = new OpenAIClientBuilder().endpoint(openAIEndpoint)
                   .credential(new AzureKeyCredential(openAIKey)).buildClient();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از انجام تغییرات، دستور زیر را اجرا کنید.

mvn spring-boot:run
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر برنامه Spring Boot با موفقیت راه اندازی شود، در پورت 8080 گوش می دهد. از موارد زیر استفاده کنید curl فرمان برای بررسی اینکه آیا می توانید از Azure OpenAI پرس و جو کنید.

curl -X POST http://localhost:8080/askAI \
     -H "Content-Type: application/json" \
     -d '{"message":"What is the benefit of the Spring Boot?"}'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر بار که دستور را اجرا می کنید، پاسخ متفاوت خواهد بود، اما برای مثال، با یک لحن دزدان دریایی پاسخ می دهد.

Aye, Captain! Let me explain the benefits of Spring Boot.
Spring Boot is a framework that aids rapid application development. 
It allows you to create standalone applications with minimal configuration.

It also comes with auto-configuration, reducing manual setup. Managing dependencies is easy, and it includes commonly used libraries.
It's fast to start up, easy to deploy, and suitable for cloud operations. 

It's a powerful tool for boosting developer productivity.
Anything else I can assist with?
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از تکمیل تأیید محلی، تغییرات را برگردانید تا ایجاد شود OpenAIClient نمونه با استفاده از ManagedIdentityCredential.

2.7.7 ساخت برنامه و ایجاد مصنوعات

پس از تکمیل این مراحل، برنامه را بسازید و مصنوعات را ایجاد کنید.

mvn clean package
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

پس از ساخت این پروژه، آثار باستانی در آن ایجاد خواهند شد target دایرکتوری در اینجا، برنامه Spring Boot به عنوان ایجاد می شود Yoshio-AI-App-0.0.1-SNAPSHOT.jar.

> ls -l target 
total 40876
-rw-r--r-- 1 teradayoshio wheel 41847613  9 14 14:52 Yoshio-AI-App-0.0.1-SNAPSHOT.jar
-rw-r--r-- 1 teradayoshio wheel     7003  9 14 14:52 Yoshio-AI-App-0.0.1-SNAPSHOT.jar.original
drwxr-xr-x 5 teradayoshio wheel      160  9 14 20:34 classes
drwxr-xr-x 3 teradayoshio wheel       96  9 14 14:52 generated-sources
drwxr-xr-x 3 teradayoshio wheel       96  9 14 14:52 generated-test-sources
drwxr-xr-x 3 teradayoshio wheel       96  9 14 14:52 maven-archiver
drwxr-xr-x 3 teradayoshio wheel       96  9 14 14:52 maven-status
drwxr-xr-x 4 teradayoshio wheel      128  9 14 14:52 surefire-reports
drwxr-xr-x 3 teradayoshio wheel       96  9 14 20:34 test-classes
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.8. ایجاد نمونه برنامه های کانتینر Azure

اکنون که اجرای برنامه جاوا کامل شده است، اجازه دهید این برنامه جاوا را در برنامه های کانتینر Azure مستقر کنیم.

نام برنامه کانتینر را با استفاده از متغیر محیطی مشخص کنید CONTAINER_APP_NAME. مسیر و نام فایل آرتیفکت Spring Boot را با آن تعریف کنید JAR_FILE_PATH_AND_NAME.

export CONTAINER_APP_NAME=yoshio-ai-app
export JAR_FILE_PATH_AND_NAME=./target/Yoshio-AI-App-0.0.1-SNAPSHOT.jar
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

همانطور که در “1. استقرار برنامه های کاربردی جاوا در برنامه های کانتینر Azure بدون کانتینرسازی” توضیح داده شد، دیگر نیازی به ایجاد و استقرار تصویر کانتینر خود در هنگام استقرار در برنامه های کانتینر Azure ندارید. ما فقط مصنوع جاوا را داریم Yoshio-AI-App-0.0.1-SNAPSHOT.jar، و بر این اساس مستقر خواهیم کرد.

برای انجام این کار، از az containerapp up فرمان همانطور که از آرگومان ها می بینید، فقط باید مشخص کنید --artifact $JAR_FILE_PATH_AND_NAME، بدون هیچ آرگومان تصویر ظرف. این دستور به طور خودکار محیط ساخت را تنظیم می کند، کانتینر را می سازد و آن را مستقر می کند.

لطفا دستور زیر را اجرا کنید.

az containerapp up \
  --name $CONTAINER_APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --subscription $SUBSCRIPTION \
  --location $LOCATION \
  --environment $CONTAINER_ENVIRONMENT \
  --artifact $JAR_FILE_PATH_AND_NAME \
  --ingress external \
  --target-port 8080 \
  --env-vars AZURE_LOG_LEVEL=2 \
  --query properties.configuration.ingress.fqdn
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه:

می توانید کمی ایجاد ظرف را سفارشی کنید. در صورت نیاز از متغیرهای محیطی ارائه شده در زیر استفاده کنید:
ایجاد متغیرهای محیطی برای جاوا در برنامه های کانتینر Azure.

2.9. اختصاص هویت مدیریت شده توسط کاربر به برنامه های کانتینر Azure

پس از استقرار برنامه در برنامه‌های کانتینر Azure، مرحله آخر اعمال یک شناسه مدیریت‌شده توسط کاربر در ظرفی است که ایجاد کردیم. را اجرا کنید az containerapp identity assign فرمان

az containerapp identity assign --name $CONTAINER_APP_NAME \
                                --resource-group $RESOURCE_GROUP \
                                --user-assigned $USER_MANAGED_ID_RESOURCE_ID
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با آن، پیکربندی User Managed Identity کامل شده است.

2.10. تایید عملیات

حالا که تمام تنظیمات کامل شد، اجازه دهید عملیات را تأیید کنیم. ابتدا نام میزبان FQDN را که به Ingress کانتینر اختصاص داده شده است، بدست آورید.

export REST_ENDPOINT=$(az containerapp show -n $CONTAINER_APP_NAME \
          -g $RESOURCE_GROUP \
          --query properties.configuration.ingress.fqdn --output tsv)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس URL نقطه پایانی RESTful را به نام میزبان به دست آمده اضافه کنید و به آن متصل شوید.

curl -X POST https://$REST_ENDPOINT/askAI \
     -H "Content-Type: application/json" \
     -d '{"message":"What is Spring Boot? please explain around 200 words?"}'
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر بار که اجرا می شود، پاسخ ممکن است متفاوت باشد، اما می توانید انتظار نتایجی مانند موارد زیر را داشته باشید.

Arrr, Spring Boot be a powerful framework fer buildin' Java applications with minimal fuss, savvy? 
It sails under the banner of the larger Spring ecosystem, providin' a swift and easy approach fer creatin' scalable and stand-alone web apps.

Ye see, it comes with embedded servers like Tomcat or Jetty, meanin' ye don't have the hassle of deployin' to external servers. 
Spring Boot simplifies the setup by makin' configurations automatic, allowin' developers to focus on writin' their code without worryin' about the boilerplate.

It also hoists the flag of convention over configuration, offerin' defaults that make gettin’ started as smooth as a voyage with favorable winds. 
Should ye need to adjust yer sails, customization be available through its easy-to-use properties.

And if ye treasure quick development, Spring Boot supports ye well with its rich assortment of pre-configured starters, integratin' smoothly with other technologies like databases and messaging systems.

In essence, Spring Boot be a trusty vessel fer any sea-farin' coder seekin' speed, efficiency, and a treasure chest of features in their Java web applications. 
Aye, it be a boon to all developers, whether seasoned or green as a fresh landlubber!
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2.11. استفاده مجدد از همان هویت مدیریت شده کاربر برای دسترسی به Azure OpenAI از سایر منابع Azure

قبلاً در مورد نحوه اعمال a User Managed Identity به Azure Container Apps برای اتصال به Azure OpenAI. با این حال، این شناسه مدیریت شده توسط کاربر می تواند توسط سایر سرویس ها نیز مورد استفاده مجدد قرار گیرد.

به عبارت دیگر، برنامه‌های مستقر در دیگر منابع Azure می‌توانند از همان User Managed Identity برای اتصال به Azure OpenAI استفاده کنند.

برخی از منابع به شما امکان می دهند این هویت را در حین ایجاد مشخص کنید، در حالی که برای برخی دیگر، می توانید بعداً آن را اختصاص دهید.

در زیر، نحوه اختصاص یک شناسه مدیریت شده توسط کاربر به منابع موجود Azure، به جز نمونه‌های کانتینر Azure را نشان می‌دهیم.

برای Azure VM

برای اختصاص یک شناسه مدیریت شده توسط کاربر به ماشین مجازی Azure، دستور زیر را اجرا کنید:

az vm identity assign -g $RESOURCE_GROUP \
                      -n $VM_NAME \
                      --identities $USER_MANAGED_ID_RESOURCE_ID
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای سرویس برنامه Azure

برای اختصاص یک شناسه مدیریت شده توسط کاربر به یک سرویس برنامه Azure، دستور زیر را اجرا کنید:

az webapp identity assign -g $RESOURCE_GROUP \
                          --name $APP_SERVICE_NAME \
                          --identities $USER_MANAGED_ID_RESOURCE_ID
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای توابع Azure

برای اختصاص یک شناسه مدیریت شده توسط کاربر به توابع Azure، دستور زیر را اجرا کنید:

az functionapp identity assign -g $RESOURCE_GROUP \
                               -n $AZURE_FUNCTION_NAME \
                               --identities $USER_MANAGED_ID_RESOURCE_ID
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای نمونه های کانتینر Azure

برای نمونه‌های کانتینر Azure، می‌توانید در طول ایجاد نمونه، یک شناسه مدیریت‌شده توسط کاربر اختصاص دهید:

az container create \
                    --resource-group $RESOURCE_GROUP  \
                    --name $CONTAINER_INSTANCE_NAME \
                    --image $CONTAINER_IMAGE \
                    --assign-identity $USER_MANAGED_ID_RESOURCE_ID 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای سرویس Azure Kubernetes

برای اختصاص یک شناسه مدیریت شده توسط کاربر به سرویس Azure Kubernetes، دستور زیر را اجرا کنید:

az aks update \
                -g $RESOURCE_GROUP \
                --name $AKS_CLUSTER_NAME \
                --enable-managed-identity \
                --assign-identity $USER_MANAGED_ID_RESOURCE_ID
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مانند این، با استفاده از یک شناسه مدیریت شده توسط کاربر، می توانید با استفاده مجدد از نقش های دسترسی به درستی پیکربندی شده، به طور ایمن به منابع هدف در سرویس های مختلف Azure متصل شوید.

2.12. مقایسه کلیدهای دسترسی و هویت های مدیریت شده توسط کاربر از دیدگاه امنیتی

این بخش تفاوت های امنیتی بین استفاده از کلیدهای دسترسی و هویت های مدیریت شده توسط کاربر برای Azure OpenAI را توضیح می دهد.

هنگام استفاده از یک شناسه مدیریت شده توسط کاربر، شما آن را مشخص می کنید client ID از شناسه مدیریت شده کاربر هنگام ایجاد نمونه ای از ManagedIdentityCredential کلاس در برنامه جاوا شما این client ID مقدار به عنوان یک متغیر محیطی تنظیم می شود $USER_MANAGED_ID_CLIENT_ID هنگامی که شناسه مدیریت شده توسط کاربر ایجاد می شود.

در نگاه اول، ممکن است به نظر برسد که این تنها بخش مهمی از اطلاعات مورد نیاز برای اتصال است، به غیر از URL نقطه پایانی.

ManagedIdentityCredential credential =
        new ManagedIdentityCredentialBuilder()
                       .clientId(userManagedIDClientId)
                        .build();
OpenAIClient openAIClient = new OpenAIClientBuilder()
                                        .credential(credential)
                                        .endpoint(openAIEndpoint)
                                        .buildClient();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بیایید تأثیر یک فاش شده را در نظر بگیریم client ID در مقابل لو رفته Access Key.

یک Access Key شبیه یک رمز عبور معمولی است. اگر فاش شود، هر کسی که رمز عبور را بداند می تواند به منبع دسترسی پیدا کند. در مورد Azure OpenAI، این بدان معناست که هر کسی می‌تواند از مدل‌های هوش مصنوعی مانند GPT-4 استفاده کند. اگر شبکه در دسترس عموم باشد، تأثیر آن می تواند حتی بیشتر باشد.

از سوی دیگر، اگر client ID لو رفته است، تاثیر محدود است. این به این دلیل است که client ID به تنهایی نمی تواند به Azure OpenAI متصل شود. برای استفاده از یک شناسه مدیریت شده توسط کاربر، این سرویس باید روی Azure اجرا شود. حتی اگر Azure OpenAI برای عموم قابل دسترسی باشد، نمی توانید از یک محیط محلی یا از طریق یک شبکه با استفاده از یک برنامه جاوا متصل شوید.

علاوه بر این، انتساب نقش زیر برای شناسه مدیریت شده کاربر پیکربندی شده است:

az role assignment create --assignee $USER_MANAGED_ID_PRINCIPAL_ID \
    --scope $OPEN_AI_RESOURCE_ID \
    --role "Cognitive Services OpenAI User" 
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تنظیم می کند که چه اقداماتی را می توان با استفاده از این شناسه کاربری انجام داد. اینجا، Cognitive Services OpenAI User این نقش برای خدمات Azure OpenAI اعطا می شود و مجوزها را به عملیات در Azure OpenAI محدود می کند.

این بدان معناست که حتی با این شناسه، نمی‌توانید اقدامات مدیریتی مانند اضافه کردن مدل‌ها را نه فقط در سراسر Azure بلکه حتی در Azure OpenAI انجام دهید.

علاوه بر این، برای استفاده از این شناسه کاربری، باید به عنوان یک سرپرست به Azure وارد شوید و تنها منابعی که توسط سرپرست مشخص شده است در محدوده مجوزهای این شناسه قابل دسترسی هستند.

به طور خلاصه، در مقایسه با تأثیر یک کلید دسترسی لو رفته، یک شناسه کلاینت فاش شده به چندین مرحله برای بهره برداری نیاز دارد و آن را ایمن تر می کند.

به این دلایل، شناسه‌های مدیریت‌شده توسط کاربر روشی امن‌تر برای مدیریت عملیات نسبت به کلیدهای دسترسی ارائه می‌کنند. ما شما را تشویق می کنیم که از هویت های مدیریت شده برای ایجاد یک محیط امن استفاده کنید.

3 خلاصه

در این راهنما، ما از طریق یک فرآیند دقیق و گام به گام برای اتصال ایمن برنامه های کانتینر Azure به Azure OpenAI با استفاده از یک شناسه مدیریت شده توسط کاربر، قدم برداشتیم. در حالی که راه اندازی یک شناسه مدیریت شده توسط کاربر ممکن است در ابتدا دشوار به نظر برسد، اما مزیت قابل توجه قابلیت استفاده مجدد را ارائه می دهد. اگر سیستم‌های شما کم هستند یا انعطاف‌پذیری یک نگرانی عمده نیست، ممکن است یک سیستم مدیریت شده هویت ترجیح داده شود.

با این حال، با افزایش تعداد سیستم ها، شناسه های مدیریت شده توسط کاربر بسیار مفید می شوند. پس از ایجاد یک شناسه مدیریت شده توسط کاربر و تخصیص نقش‌ها، می‌توانید از همان شناسه در سرویس‌های مختلفی مانند Azure App Service، Azure Functions، و Azure Kubernetes Services استفاده کنید. هرچه سیستم ها یا خدمات بیشتری را مدیریت کنید، این کار سودمندتر می شود.

لطفاً سعی کنید از هویت های مدیریت شده برای ایجاد محیط های امن استفاده کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا