Аудио-видеозвонки из настраиваемого приложения в собрание Teams
Уровень: промежуточный
В этом руководстве вы узнаете, как Службы коммуникации Azure можно использовать в пользовательском приложении React, чтобы разрешить пользователю совершать аудио-видеозвонки в собрание Microsoft Teams. Вы узнаете о различных стандартных блоках, которые можно использовать для обеспечения этого сценария и предоставления практических действий, чтобы ознакомиться с различными связанными службами Microsoft Cloud.
Что вы создадите в этом руководстве
Общие сведения о решении приложения
Необходимые компоненты
- Node LTS — LTS узла используется для этого проекта.
- git
- Visual Studio Code или другой интегрированной среды разработки.
- расширение Функции Azure для VS Code
- Azure Functions Core Tools
- Подписка Azure
- Клиент разработчика Microsoft 365
- Учетная запись GitHub
- Visual Studio при использовании версии C# учебника. Visual Studio Code также можно использовать при желании.
Технологии, используемые в этом руководстве, включают
- React
- Службы коммуникации Azure
- Функции Azure
- Microsoft Graph
- Microsoft Teams
Создание ресурса Службы коммуникации Azure
В этом упражнении вы создадите ресурс Службы коммуникации Azure (ACS) в портал Azure.
Чтобы приступить к работе, выполните следующие задачи:
Посетите портал Azure в браузере и войдите в систему.
Введите службы коммуникации в строке поиска в верхней части страницы и выберите службы коммуникации из параметров, которые отображаются.
Выберите " Создать " на панели инструментов.
Выполните следующие задачи:
- Выберите свою подписку Azure.
- Выберите группу ресурсов для использования (создайте новую, если она не существует).
- Введите имя ресурса ACS. Это значение должно быть уникальным.
- Выберите расположение данных.
Выберите "Рецензирование" и "Создать" и "Создать".
После создания ресурса ACS перейдите к нему и выберите "Параметры"> — удостоверения и маркеры доступа пользователей.
Установите флажок голосовой связи и видеозвонков (VOIP).
Выберите Создать.
Скопируйте значения маркера удостоверения и доступа пользователей в локальный файл. Далее в этом упражнении потребуются значения.
Выберите "Параметры".> Ключи и скопируйте значение первичного ключа строка подключения в локальный файл, в который вы скопировали значения удостоверения пользователя и маркера.
Чтобы запустить приложение, вам потребуется ссылка на собрание Teams. Перейдите в Microsoft Teams, войдите в клиент разработчика Microsoft 365 и выберите параметр "Календарь " слева.
Совет
Если у вас нет учетной записи Microsoft 365, вы можете зарегистрироваться для подписки на программу разработчика Microsoft 365. Это бесплатно в течение 90 дней и будет постоянно обновляться до тех пор, пока вы используете его для действий разработки. Если у вас есть подписка Visual Studio Enterprise или Professional, обе программы включают бесплатную подписку разработчика Microsoft 365, активную для жизни подписки Visual Studio.
Выберите любую дату и время в календаре, добавьте заголовок собрания, пригласите пользователя из клиента разработчика Microsoft 365 и нажмите кнопку "Сохранить".
Выберите новое собрание, которое вы добавили в календарь, и скопируйте ссылку на собрание Teams, отображаемую в том же файле, где хранится удостоверение пользователя ACS, маркер и строка подключения.
Теперь, когда ресурс ACS настроен и у вас есть ссылка на присоединение к собранию Teams, давайте получите приложение React и запущено.
Интеграция Службы коммуникации Azure вызова в приложение React
В этом упражнении вы добавите составной пользовательский интерфейс ACS в приложение React, чтобы включить аудио-видеозвонки из настраиваемого приложения в собрание Microsoft Teams.
Посетите GitHub и войдите в систему. Если у вас еще нет учетной записи GitHub, можно выбрать параметр регистрации , чтобы создать ее.
Выберите параметр Fork, чтобы добавить репозиторий в нужную организацию или учетную запись GitHub.
Выполните следующую команду, чтобы клонировать этот репозиторий на компьютер. Замените <YOUR_ORG_NAME> именем организации или учетной записи GitHub.
git clone https://github.com/<YOUR_ORG_NAME>/MicrosoftCloud
Откройте папку проекта проекта samples/acs-to-teams-meeting в Visual Studio Code.
Разверните папку client/react .
Откройте файл package.json в VS Code и обратите внимание, что включены следующие пакеты ACS:
@azure/communication-common @azure/communication-react
Дважды проверьте наличие npm 10 или более поздней версии, открыв окно терминала и выполнив следующую команду:
npm --version
Совет
Если у вас нет npm 10 или более поздней версии, можно обновить npm до последней версии, выполнив команду
npm install -g npm
.Откройте окно терминала и выполните
npm install
команду в папке React , чтобы установить зависимости приложения.Откройте App.tsx и изучите импорт в верхней части файла. Они обрабатывают импорт символов безопасности ACS и аудио-видеозвонок, которые будут использоваться в приложении.
import { AzureCommunicationTokenCredential, CommunicationUserIdentifier } from '@azure/communication-common'; import { CallComposite, fromFlatCommunicationIdentifier, useAzureCommunicationCallAdapter } from '@azure/communication-react'; import React, { useState, useMemo, useEffect } from 'react'; import './App.css';
Примечание.
Вы увидите, как
CallComposite
компонент используется далее в этом упражнении. Он предоставляет основные функции пользовательского интерфейса для Службы коммуникации Azure, чтобы включить аудио-видеозвонок из приложения в собрание Microsoft Teams.App
Найдите компонент и выполните следующие задачи:- Ознакомьтесь с
useState
определениями в компоненте. userId
useState
Замените пустые кавычки функции значением удостоверения пользователя ACS, скопированным в предыдущем упражнении.token
useState
Замените пустые кавычки функции значением маркера ACS, скопированным в предыдущем упражнении.teamsMeetingLink
useState
Замените пустые кавычки функции значением ссылки на собрание Teams, скопированное в предыдущем упражнении.
// Replace '' with the ACS user identity value const [userId, setUserId] = useState<string>(''); // Replace '' with the ACS token value const [token, setToken] = useState<string>(''); // Replace '' with the Teams meeting link value const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Примечание.
Далее в этом руководстве вы узнаете, как динамически извлекать
userId
token
значения иteamsMeetingLink
значения.- Ознакомьтесь с
Ознакомьтесь с функциями
useMemo
App
компонента.- Функция
credential
useMemo
создает новыйAzureCommunicationTokenCredential
экземпляр после того, как маркер имеет значение. - Функция
callAdapterArgs
useMemo
возвращает объект, имеющий аргументы, используемые для выполнения аудио-и видеозвонка. Обратите внимание, что используетuserId
credential
аргументы вызова ACS иteamsMeetingLink
значения.
const credential = useMemo(() => { if (token) { return new AzureCommunicationTokenCredential(token) } return; }, [token]); const callAdapterArgs = useMemo(() => { if (userId && credential && displayName && teamsMeetingLink) { return { userId: fromFlatCommunicationIdentifier(userId) as CommunicationUserIdentifier, displayName, credential, locator: { meetingLink: teamsMeetingLink }, } } return {}; }, [userId, credential, displayName, teamsMeetingLink]);
Примечание.
useMemo
используется в этом сценарии, так как мы хотимAzureCommunicationTokenCredential
, чтобы объект и адаптер вызова создавался один раз при передаче необходимых параметров. Дополнительные сведения об использованииMemo см. здесь.- Функция
credentials
callAdapterArgs
После подготовки следующая строка обрабатывает создание адаптера вызовов ACS с помощью перехватчика React, предоставленногоuseAzureCommunicationCallAdapter
ACS. ОбъектcallAdapter
будет использоваться позже в пользовательском интерфейсе, вызываемом составным компонентом.const callAdapter = useAzureCommunicationCallAdapter(callAdapterArgs);
Примечание.
Так как
useAzureCommunicationCallAdapter
это перехватчик React, он не будет назначать значениеcallAdapter
, покаcallAdapterArgs
значение не будет допустимым.Ранее вы назначили удостоверение пользователя, токен и ссылку на собрание Teams со значениями состояния в компоненте
App
. Это работает хорошо сейчас, но в последующем упражнении вы увидите, как динамически извлекать эти значения. Так как вы задали значения ранее, закомментируйте код вuseEffect
функции, как показано далее. После получения Функции Azure выполнения в следующих упражнениях вы вернетесь к этому коду.useEffect(() => { /* Commenting out for now const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); */ }, []);
Найдите следующий код JSX. Он использует
CallComposite
символ, импортированный для отображения пользовательского интерфейса, используемого для создания аудио-и видеозвонка из приложения React в собрание Teams. ИсследуемаяcallAdapter
ранее функция передается свойствуadapter
для предоставления необходимых аргументов.if (callAdapter) { return ( <div> <h1>Contact Customer Service</h1> <div className="wrapper"> <CallComposite adapter={callAdapter} /> </div> </div> ); }
Сохраните файл перед продолжением.
Запустите
npm start
приложение в окне терминала. Убедитесь, что команда выполняется в папке React .После создания приложений отобразится вызывающий пользовательский интерфейс. Включите выбор микрофона и камеры и инициируйте вызов. Вы должны увидеть, что вы помещаетсяе в комнату ожидания. При присоединении к собранию, настроенном ранее в Microsoft Teams, вы можете разрешить гостям ввести собрание.
Нажмите клавиши CTRL+C , чтобы остановить приложение. Теперь, когда вы успешно выполнили его, давайте рассмотрим, как динамически получить удостоверение пользователя ACS и маркер и автоматически создать собрание Microsoft Teams и вернуть URL-адрес соединения с помощью Microsoft Graph.
Динамическое создание собрания Microsoft Teams с помощью Microsoft Graph
В этом упражнении вы автоматизируете процесс создания ссылки на собрание Microsoft Teams и передачи в ACS с помощью Функции Azure и Microsoft Graph.
Вам потребуется создать приложение идентификатора Microsoft Entra для проверки подлинности приложения daemon. На этом шаге проверка подлинности будет обрабатываться в фоновом режиме с учетными данными приложения, а приложение Идентификатора Microsoft Entra будет использовать разрешения приложения для вызова API Microsoft Graph. Microsoft Graph будет использоваться для динамического создания собрания Microsoft Teams и возврата URL-адреса собрания Teams.
Выполните следующие действия, чтобы создать приложение идентификатора Microsoft Entra.
- Перейдите к портал Azure и выберите идентификатор Microsoft Entra.
- Перейдите на вкладку "Регистрация приложений", а затем + Создать регистрацию.
- Введите сведения о новой форме регистрации приложения, как показано ниже, и нажмите кнопку "Зарегистрировать".
- Имя: приложение взаимодействия ACS Teams
- Поддерживаемые типы учетных записей: учетные записи в любом каталоге организации (любой каталог Идентификатора Майкрософт — Мультитенант) и личные учетные записи Майкрософт (например, Skype, Xbox)
- URI перенаправления: оставьте это поле пустым
- После регистрации приложения перейдите к разрешениям API и нажмите кнопку +Добавить разрешение.
- Выберите Microsoft Graph , за которым следуют разрешения приложения.
Calendars.ReadWrite
Выберите разрешение и нажмите кнопку "Добавить".- После добавления разрешений выберите "Предоставить согласие администратора" для <YOUR_ORGANIZATION_NAME>.
- Перейдите на вкладку "Сертификаты" и "Секреты" , выберите "+ Создать секрет клиента" и нажмите кнопку "Добавить".
- Скопируйте значение секрета в локальный файл. Далее в этом упражнении вы будете использовать это значение.
- Перейдите на вкладку "Обзор" и скопируйте
Application (client) ID
Directory (tenant) ID
значения в тот же локальный файл, который использовался на предыдущем шаге.
Создание файла local.settings.json
samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Откройте visual Studio или откройте папку GraphACSFunctions в Visual Studio Code.Перейдите
GraphACSFunctions
в проект и создайтеlocal.settings.json
файл со следующими значениями:{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "TENANT_ID": "", "CLIENT_ID": "", "CLIENT_SECRET": "", "USER_ID": "", "ACS_CONNECTION_STRING": "" }, "Host": { "LocalHttpPort": 7071, "CORS": "*", "CORSCredentials": false }, "watchDirectories": [ "Shared" ] }
- Используйте значения, скопированные в локальный файл в предыдущем упражнении, чтобы обновить
TENANT_ID
CLIENT_ID
иCLIENT_SECRET
значения. - Определите
USER_ID
идентификатор пользователя, который вы хотите создать собрание Microsoft Teams.
Идентификатор пользователя можно получить из портал Azure.
- Войдите с помощью учетной записи администратора клиента разработчика Microsoft 365.
- Выберите Microsoft Entra ID
- Перейдите на вкладку "Пользователи" на боковой панели.
- Найдите имя пользователя и выберите его, чтобы просмотреть сведения о пользователе.
- Внутри сведений
Object ID
о пользователе представляет объектUser ID
.Object ID
Скопируйте значение и используйте его дляUSER_ID
значения в local.settings.json.
Примечание.
ACS_CONNECTION_STRING
будет использоваться в следующем упражнении, поэтому его еще не нужно обновить.- Используйте значения, скопированные в локальный файл в предыдущем упражнении, чтобы обновить
Откройте
GraphACSFunctions.sln
папку acs-to-teams-meeting/server/csharp и обратите внимание, что она включает следующие пакеты Microsoft Graph и Identity:<PackageReference Include="Azure.Communication.Identity" Version="1.3.1" /> <PackageReference Include="Azure.Identity" Version="1.11.2" /> <PackageReference Include="Microsoft.Graph" Version="5.51.0" />
Перейдите к Program.cs и запишите следующий код в методе
ConfigureServices
:var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var clientSecretCredential = new ClientSecretCredential( config.GetValue<string>("TENANT_ID"), config.GetValue<string>("CLIENT_ID"), config.GetValue<string>("CLIENT_SECRET") ); return new GraphServiceClient( clientSecretCredential, ["https://graph.microsoft.com/.default"] ); }); ... services.AddSingleton<IGraphService, GraphService>(); }) .Build(); }
- Этот код создает
GraphServiceClient
объект, который можно использовать для вызова Microsoft Graph из Функции Azure. Это одинарный и может быть внедрен в другие классы. - Вызовы API Microsoft Graph можно выполнять с разрешениями только для приложений (например , Calendars.ReadWrite), передав
ClientSecretCredential
значение конструкторуGraphServiceClient
.Tenant Id
Client Id
ИспользуетсяClientSecretCredential
иClient Secret
значения из приложения идентификатора Microsoft Entra ID.
- Этот код создает
Open Services/GraphService.cs.
Ознакомьтесь с методом
CreateMeetingEventAsync
:using System; using System.Threading.Tasks; using Microsoft.Graph; using Microsoft.Extensions.Configuration; namespace GraphACSFunctions.Services; public class GraphService : IGraphService { private readonly GraphServiceClient _graphServiceClient; private readonly IConfiguration _configuration; public GraphService(GraphServiceClient graphServiceClient, IConfiguration configuration) { _graphServiceClient = graphServiceClient; _configuration = configuration; } public async Task<string> CreateMeetingAsync() { var userId = _configuration.GetValue<string>("USER_ID"); var newMeeting = await _graphServiceClient .Users[userId] .Calendar .Events .PostAsync(new() { Subject = "Customer Service Meeting", Start = new() { DateTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, End = new() { DateTime = DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, IsOnlineMeeting = true }); return newMeeting.OnlineMeeting.JoinUrl; } }
GraphServiceClient
иIConfiguration
объекты внедряются в конструктор и назначаются полям.- Функция
CreateMeetingAsync()
публикует данные в API событий календаря Microsoft Graph, который динамически создает событие в календаре пользователя и возвращает URL-адрес соединения.
Откройте TeamsMeetingFunctions.cs и выполните некоторое время для изучения конструктора. Вы
GraphServiceClient
посмотрели на более ранние версии и назначены полю_graphService
.private readonly IGraphService _graphService; public TeamsMeetingFunction(IGraphService graphService) => _graphService = graphService;
Run
Найдите метод:[Function("HttpTriggerTeamsUrl")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteStringAsync(await _graphService.CreateMeetingAsync()); return response; }
- Он определяет имя
HttpTriggerTeamsUrl
функции, которую можно вызвать с помощью HTTP-запроса GET. - Он вызывает
_graphService.CreateMeetingAsync()
событие, которое создает новое событие и возвращает URL-адрес соединения.
- Он определяет имя
Запустите программу, нажав клавишу F5 в Visual Studio или нажав кнопку "Отладка"> — начать отладку из меню. Это действие запускает проект Функции Azure и делает
ACSTokenFunction
доступным для вызова.
Примечание.
Если вы используете VS Code, вы можете открыть окно терминала в папке GraphACSFunctions и запустить func start
. В этом случае предполагается, что на компьютере установлен Функции Azure Core Tools.
Вызов функции Azure из React
Теперь, когда
httpTriggerTeamsUrl
функция готова к использованию, давайте вызовем ее из приложения React.Разверните папку client/react .
Добавьте env-файл в папку со следующими значениями:
REACT_APP_TEAMS_MEETING_FUNCTION=http://localhost:7071/api/httpTriggerTeamsUrl REACT_APP_ACS_USER_FUNCTION=http://localhost:7071/api/httpTriggerAcsToken
Эти значения будут переданы в React, так как они создаются, чтобы их можно было легко изменить по мере необходимости во время процесса сборки.
Откройте файл client/react/App.tsx в VS Code.
teamsMeetingLink
Найдите переменную состояния в компоненте. Удалите ссылку жестко закодированных команд и замените ее пустыми кавычками:const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Найдите функцию
useEffect
и измените ее, чтобы выглядеть следующим образом. Это обрабатывает вызов функции Azure, которую вы посмотрели ранее, которая создает собрание Teams и возвращает ссылку на присоединение к собранию:useEffect(() => { const init = async () => { /* Commenting out for now setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token const res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); const user = await res.json(); setUserId(user.userId); setToken(user.token); */ setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link const resTeams = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); const link = await resTeams.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Сохраните файл перед продолжением.
Откройте окно терминала в
cd
папку *React и запуститеnpm start
его, чтобы создать и запустить приложение.После сборки и загрузки приложения отобразится пользовательский интерфейс вызова ACS, который затем может вызвать собрание Teams, которое было динамически создано Microsoft Graph.
Остановите процесс терминала, введя ctrl+C в окне терминала.
Остановите проект Функции Azure.
Примечание.
Ознакомьтесь с документацией по Службы коммуникации Azure, чтобы узнать больше о расширении собраний Microsoft Teams другими способами.
Динамическое создание удостоверения и маркера Службы коммуникации Azure
В этом упражнении вы узнаете, как динамически извлекать значения удостоверения пользователя и маркера из Службы коммуникации Azure с помощью Функции Azure. После получения значения будут переданы в состав пользовательского интерфейса ACS, чтобы включить вызов, выполняемый клиентом.
Откройте local.settings.json и обновите
ACS_CONNECTION_STRING
значение с помощью строка подключения ACS, сохраненного в предыдущем упражнении.Откройте Startup.cs в Visual Studio и изучите второй
AddSingleton()
вызов в методеConfigureServices()
.var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { ... services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var connectionString = config.GetValue<string>("ACS_CONNECTION_STRING"); return new CommunicationIdentityClient(connectionString); }); ... }) .Build(); }
Вызов
AddSingleton()
создаетCommunicationIdentityClient
объект с помощьюACS_CONNECTION_STRING
значения из local.settings.json.Откройте ACSTokenFunction.cs и найдите конструктор и определения полей.
Имя поля
Scopes
определяется, включающееCommunicationTokenScope.VoIP
область. Эта область используется для создания маркера доступа для видеозвонка.private static readonly CommunicationTokenScope[] Scopes = [ CommunicationTokenScope.VoIP, ];
Одноэлементный
CommunicationIdentityClient
экземпляр, созданный в Startup.cs, внедряется в конструктор и назначается полю_tokenClient
.private readonly CommunicationIdentityClient _tokenClient; public ACSTokenFunction(CommunicationIdentityClient tokenClient) { _tokenClient = tokenClient; }
Изучите
Run()
метод в ACSTokenFunction.cs:[Function("HttpTriggerAcsToken")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var user = await _tokenClient.CreateUserAsync(); var userToken = await _tokenClient.GetTokenAsync(user, Scopes); var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync( new { userId = user.Value.Id, userToken.Value.Token, userToken.Value.ExpiresOn } ); return response; }
- Он определяет функцию с именем
HttpTriggerAcsToken
, которую можно вызвать с помощью HTTP-запроса GET. - Новый пользователь ACS создается путем
_tokenClient.CreateUserAsync()
вызова метода. - Маркер доступа, используемый для видеозвонков, создается путем вызова
_tokenClient. GetTokenAsync()
метода. - Идентификатор пользователя и маркер возвращаются из функции в виде объекта JSON.
- Он определяет функцию с именем
Запустите программу, нажав клавишу F5 в Visual Studio или нажав кнопку "Отладка"> — начать отладку из меню. Это запустит проект Функции Azure и сделает
ACSTokenFunction
доступным для вызова.Примечание.
Если вы используете VS Code, вы можете открыть окно терминала в папке GraphACSFunctions и запустить
func start
. В этом случае предполагается, что на компьютере установлен Функции Azure Core Tools.Теперь, когда Функции Azure запущены локально, клиент должен иметь возможность вызывать их для получения удостоверений и маркеров ACS.
Откройте примеры/acs-to-teams-meeting/client/react/App.tsx-файл в редакторе.
userId
Найдите переменные состояния иtoken
переменные состояния компонента. Удалите жестко закодированные значения и замените их пустыми кавычками:const [userId, setUserId] = useState<string>(''); const [token, setToken] = useState<string>('');
useEffect
Найдите функцию и измените ее следующим образом, чтобы включить вызов функции Azure для получения удостоверения пользователя и маркера ACS:useEffect(() => { const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Сохраните файл перед продолжением.
Откройте окно терминала и запустите
npm start
его в папкеreact
. После сборки и загрузки вы увидите отображаемый пользовательский интерфейс вызова ACS и вы можете вызвать собрание Teams, которое было динамически создано Microsoft Graph.Остановите приложение React, нажав клавиши CTRL+C в окне терминала.
Остановите проект Функции Azure.
Зафиксируйте изменения Git и отправьте их в репозиторий GitHub с помощью Visual Studio Code:
- Щелкните значок системы управления версиями (3-й вниз на панели инструментов Visual Studio Code).
- Введите сообщение фиксации и нажмите кнопку "Фиксация".
- Выберите "Синхронизировать изменения".
Развертывание приложения для Функции Azure и приложений контейнеров Azure
Внимание
Помимо предварительных требований, перечисленных в этом руководстве, вам также потребуется установить следующие средства на компьютере, чтобы выполнить это упражнение.
- Azure CLI
- Если вы используете VS Code, установите расширение Функции Azure
В этом упражнении вы узнаете, как развернуть функции Microsoft Graph и ACS, рассмотренные в предыдущих упражнениях для Функции Azure. Вы также создадите образ контейнера и развернете его в приложениях контейнеров Azure.
Развертывание в Функции Azure
Примечание.
В этом разделе используется Visual Studio для публикации функций C# в Azure. Если вы предпочитаете использовать Visual Studio Code, следуйте инструкциям в кратком руководстве по созданию функции C# в Azure с помощью краткого руководства по Visual Studio Code .
samples/acs-video-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Откройте проект в Visual Studio.Щелкните проект правой
GraphACSFunctions
кнопкой мыши и выберите " Опубликовать".Выберите Azure в целевом разделе, а затем нажмите кнопку "Далее".
Выберите приложение-функцию Azure (Windows) и нажмите кнопку "Далее".
Выберите подписку, а затем нажмите кнопку "Создать".
Введите следующие данные:
- Имя функции: требуется глобально уникальное имя. Пример: acsFunctions<YOUR_LAST_NAME>.
- Подписка. Выберите нужную подписку.
- Группа ресурсов. Выберите группу ресурсов, созданную ранее в этом руководстве, или вы также можете создать новую.
- План размещения: план потребления.
- Расположение. Выберите регион, в который вы хотите развернуть.
- служба хранилища Azure. Создание нового. (Вы также можете выбрать существующую учетную запись хранения.)
- Azure Insights: создайте новую. (Вы также можете выбрать существующую учетную запись хранения.)
Примечание.
Требуется глобально уникальное имя. Вы можете сделать имя более уникальным, добавив номер или фамилию в конец имени.
После создания приложения-функции Azure отобразится экран подтверждения. Убедитесь, что выбран параметр "Выполнить из пакета ", а затем нажмите кнопку "Готово".
Выберите "Опубликовать", чтобы развернуть функцию в Azure.
После развертывания функции в Azure перейдите к портал Azure и выберите созданное приложение-функцию.
Скопируйте URL-адрес развернутой функции. Далее в этом упражнении вы будете использовать это значение.
Выберите "Параметры".> Конфигурация в меню слева.
Нажмите кнопку " Создать приложение" и добавьте следующие ключи и значения в параметры приложения. Эти значения можно изменить из
local.settings.json
GraphACSFunctions
проекта.# Retrieve these values from local.settings.json TENANT_ID: <YOUR_VALUE> CLIENT_ID: <YOUR_VALUE> CLIENT_SECRET: <YOUR_VALUE> USER_ID: <YOUR_VALUE> ACS_CONNECTION_STRING: <YOUR_VALUE>
Нажмите кнопку "Сохранить", чтобы сохранить параметры.
Наконец, необходимо включить CORS (совместное использование ресурсов между источниками) для приложения-функции, чтобы сделать API-интерфейсы приложения-функции доступными из-за пределов вашего домена. Выберите параметры —> CORS в меню слева.
Введите
*
(доступное из любых доменов) в текстовом поле "Разрешенные источники" и нажмите кнопку "Сохранить".
Развертывание на платформе "Контейнеры приложений Azure"
Первая задача, которую вы будете выполнять, — создать новый ресурс Реестр контейнеров Azure (ACR). После создания реестра вы создадите образ и отправьте его в реестр.
Откройте командное окно и выполните следующую команду, чтобы войти в подписку Azure:
az login
Добавьте следующие переменные оболочки, заменяющие значения заполнителей соответствующим образом. Добавьте GITHUB_USERNAME> в качестве нижнего регистра и замените домен< Функции Azure значением AZURE_FUNCTIONS_DOMAIN> (включите
https://
его в значение домена).<GITHUB_USERNAME="<YOUR_GITHUB_USERNAME>" RESOURCE_GROUP="<YOUR_RESOURCE_GROUP_NAME>" ACR_NAME="aca"$GITHUB_USERNAME AZURE_FUNCTIONS_DOMAIN="<YOUR_AZURE_FUNCTIONS_URL>"
Создайте новый ресурс Реестр контейнеров Azure, выполнив следующую команду:
az acr create \ --resource-group $RESOURCE_GROUP \ --name $ACR_NAME \ --sku Basic \ --admin-enabled true
Откройте файл client/react/Dockerfile в редакторе и обратите внимание, что выполняются следующие задачи:
- Приложение React создается и назначается этапу сборки.
- Сервер nginx настроен и выходные данные этапа сборки копируются на образ сервера nginx.
Создайте образ контейнера в Azure, выполнив следующую команду из корневого каталога клиента или react . Замените <YOUR_FUNCTIONS_DOMAIN доменом Функции Azure>, скопированным в локальный файл ранее в этом упражнении.
az acr build --registry $ACR_NAME --image acs-to-teams-meeting \ --build-arg REACT_APP_ACS_USER_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerAcsToken \ --build-arg REACT_APP_TEAMS_MEETING_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerTeamsUrl .
Выполните следующую команду, чтобы вывести список образов в реестре. Вы увидите новое изображение.
az acr repository list --name $ACR_NAME --output table
Теперь, когда образ развернут, необходимо создать приложение контейнера Azure, которое может запустить контейнер.
Посетите портал Azure в браузере и войдите в систему.
Введите приложения контейнеров в верхней строке поиска и выберите "Приложения-контейнеры " из параметров, которые отображаются.
Выберите " Создать " на панели инструментов.
Примечание.
Хотя вы используете портал Azure, приложение-контейнер также можно создать с помощью Azure CLI. Дополнительные сведения см . в кратком руководстве по развертыванию первого приложения контейнера. Вы увидите пример использования Azure CLI в конце этого упражнения.
Выполните следующие задачи:
- Выберите свою подписку.
- Выберите группу ресурсов, используемую (при необходимости создайте новую). Вы можете использовать ту же группу ресурсов, которую вы использовали для ресурса ACS, если хотите. Скопируйте имя группы ресурсов в тот же локальный файл, где хранится домен Функции Azure.
- Введите имя приложения-контейнера для собрания acs-to-teams.
- выберите регион.
- Выберите "Создать" в разделе "Среда приложений контейнеров".
- Введите имя среды acs-to-teams-meeting-env.
- Выберите кнопку Создать.
- Нажмите кнопку "Далее": параметры >приложения.
Введите следующие значения на экране создания приложения контейнера:
- Установите флажок "Использовать изображение быстрого запуска".
- Имя: acs-to-teams-meeting
- Источник изображения: Реестр контейнеров Azure
- Реестр: <YOUR_ACR_REGISTRY_NAME.azurecr.io>
- Изображение: собрание acs-to-teams
- Тег изображения: последняя версия
- ЦП и память: 0,25 ядра ЦП, память -.5 Ги
В разделе параметров входящего трафика приложения выполните следующие действия.
- Установите флажок Включено.
- Выберите переключатель "Принять трафик" в любом месте .
Это позволит создать точку входа (входящий трафик) для приложения React и разрешить ее вызывать из любого места. Приложения контейнеров Azure перенаправляют весь трафик на HTTPS.
- Целевой порт: 80
Выберите Review + create (Просмотреть и создать). После прохождения проверки нажмите кнопку "Создать ".
Если возникает ошибка, это может быть связано с тем, что среда приложений контейнеров неактивна слишком долго. Самым простым решением будет снова пройти процесс создания приложения-контейнера. Кроме того, можно выполнить следующую команду, чтобы создать приложение контейнера с помощью Azure CLI:
az containerapp create --name acs-to-teams-meeting --resource-group $RESOURCE_GROUP \ --location westus --image acs-to-teams-meeting \ --cpu 0.25 --memory 0.5 --environment-name acs-to-teams-meeting-env \ --ingress-enabled true --ingress-target-port 80 --ingress-type External \ --ingress-protocol Https --ingress-traffic Anywhere
После завершения развертывания приложения контейнера перейдите к нему в портал Azure и выберите URL-адрес приложения на экране обзора, чтобы просмотреть приложение, работающее в контейнере nginx!
Поздравляем!
Вы завершили работу с этим руководством
Возникла проблема с этим разделом? Если это так, отправьте нам отзыв, чтобы мы исправили этот раздел.