사용자 지정 앱에서 Teams 모임으로 오디오/비디오 통화
수준: 중간
이 자습서에서는 사용자가 Microsoft Teams 모임에 오디오/비디오 통화를 할 수 있도록 사용자 지정 React 애플리케이션에서 Azure Communication Services를 사용하는 방법을 알아봅니다. 이 시나리오를 가능하게 하는 데 사용할 수 있는 다양한 구성 요소에 대해 알아보고 관련된 다양한 Microsoft 클라우드 서비스를 안내하는 실습 단계를 제공합니다.
이 자습서에서 빌드할 내용
애플리케이션 솔루션 개요
필수 조건
- 노드 LTS - 이 프로젝트에 노드 LTS가 사용됩니다.
- git
- Visual Studio Code 또는 선택한 다른 IDE입니다.
- VS Code용 Azure Functions 확장
- Azure Functions Core Tools
- Azure 구독
- Microsoft 365 개발자 테넌트
- GitHub 계정
- 자습서의 C# 버전을 사용하는 경우 Visual Studio 입니다. 선호하는 경우 Visual Studio Code를 사용할 수도 있습니다.
이 자습서에서 사용되는 기술은 다음과 같습니다.
- React
- Azure Communication Services
- Azure 기능
- Microsoft Graph
- Microsoft 팀
Azure Communication Services 리소스 만들기
이 연습에서는 Azure Portal에서 ACS(Azure Communication Services) 리소스를 만듭니다.
시작하려면 다음 작업을 수행합니다.
브라우저에서 Azure Portal 을 방문하여 로그인합니다.
페이지 맨 위에 있는 검색 창에 통신 서비스를 입력하고 표시되는 옵션에서 Communication Services를 선택합니다.
도구 모음에서 만들기를 선택합니다.
다음 작업을 수행합니다.
- Azure 구독을 선택합니다.
- 사용할 리소스 그룹을 선택합니다(없는 경우 새 리소스 그룹 만들기).
- ACS 리소스 이름을 입력합니다. 고유한 값이어야 합니다.
- 데이터 위치를 선택합니다.
검토 + 만들기를 선택한 다음 만들기를 선택합니다.
ACS 리소스가 만들어지면 해당 리소스로 이동하여 설정 (> ID 및 사용자 액세스 토큰)을 선택합니다.
VOIP(음성 및 영상 통화) 확인란을 선택합니다.
생성을 선택합니다.
ID 및 사용자 액세스 토큰 값을 로컬 파일에 복사합니다. 이 연습의 뒷부분에서 값이 필요합니다.
설정 -- 키를 선택하고 기본 키 연결 문자열 값을 사용자 ID 및 토큰 값을 복사한 로컬 파일에 복사 합니다.>
애플리케이션을 실행하려면 Teams 모임 링크가 필요합니다. Microsoft Teams로 이동하여 Microsoft 365 개발자 테넌트에 로그인하고 왼쪽에서 일정 옵션을 선택합니다.
일정에서 날짜/시간을 선택하고, 모임 제목을 추가하고, Microsoft 365 개발자 테넌트에서 사용자를 초대하고, 저장을 선택합니다.
일정에 추가한 새 모임을 선택하고 ACS 사용자 ID, 토큰 및 연결 문자열 저장한 동일한 파일에 표시되는 Teams 모임 링크를 복사합니다.
ACS 리소스가 설정되고 Teams 모임 참가 링크가 있으므로 React 애플리케이션을 시작하고 실행해 보겠습니다.
React 앱에 Azure Communication Services 호출 통합
이 연습에서는 ACS UI 통화 복합을 React 앱에 추가하여 사용자 지정 앱에서 Microsoft Teams 모임으로 오디오/비디오 호출을 수행할 수 있도록 합니다.
GitHub를 방문하여 로그인합니다. GitHub 계정이 아직 없는 경우 등록 옵션을 선택하여 만들 수 있습니다.
포크 옵션을 선택하여 원하는 GitHub 조직/계정에 리포지토리를 추가합니다.
다음 명령을 실행하여 이 리포지토리를 컴퓨터에 복제합니다. YOUR_ORG_NAME> GitHub 조직/계정 이름으로 대체<합니다.
git clone https://github.com/<YOUR_ORG_NAME>/MicrosoftCloud
Visual Studio Code에서 샘플/acs-to-teams-meeting 프로젝트 폴더를 엽니다.
클라이언트/react 폴더를 확장합니다.
VS Code에서 package.json 파일을 열고 다음 ACS 패키지가 포함되어 있는지 확인합니다.
@azure/communication-common @azure/communication-react
터미널 창을 열고 다음 명령을 실행하여 npm 10 이상이 설치되어 있는지 다시 확인합니다.
npm --version
팁
npm 10 이상이 설치되어 있지 않은 경우 npm을 실행
npm install -g npm
하여 최신 버전으로 업데이트할 수 있습니다.터미널 창을 열고 react 폴더에서 명령을 실행
npm install
하여 애플리케이션 종속성을 설치합니다.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
에서 구성 요소를 사용하는 방법을 확인할 수 있습니다. 앱에서 Microsoft Teams 모임으로 오디오/비디오 통화를 할 수 있도록 Azure Communication Services의 핵심 UI 기능을 제공합니다.App
구성 요소를 찾아서 다음 작업을 수행합니다.- 잠시 시간을 내어 구성 요소의
useState
정의를 검사합니다. userId
useState
함수의 빈 따옴표를 이전 연습에서 복사한 ACS 사용자 ID 값으로 바꿉니다.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>('');
참고 항목
이 자습서의 뒷부분에서는 동적으로 값
token
및teamsMeetingLink
값을 검색userId
하는 방법을 알아보세요.- 잠시 시간을 내어 구성 요소의
잠시 시간을 내어 구성 요소의
useMemo
함수를App
살펴봅니다.- 이 함수는
credential
useMemo
토큰에 값이 있으면 새AzureCommunicationTokenCredential
인스턴스를 만듭니다. - 이 함수는
callAdapterArgs
useMemo
오디오/비디오 호출에 사용되는 인수가 있는 개체를 반환합니다. ACS 호출 인수의userId
값credential
및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
이 시나리오에서 사용됩니다. useMemo에 대한 자세한 내용은 여기를 참조하세요.- 이 함수는
credentials
callAdapterArgs
준비가 되면 다음 줄은 ACS에서 제공하는 React 후크를 사용하여useAzureCommunicationCallAdapter
ACS 호출 어댑터를 만드는 것을 처리합니다. 개체는callAdapter
나중에 복합 구성 요소를 호출하는 UI에서 사용됩니다.const callAdapter = useAzureCommunicationCallAdapter(callAdapterArgs);
참고 항목
useAzureCommunicationCallAdapter
React 후크이므로 값이 유효할callAdapter
때까지callAdapterArgs
값을 할당하지 않습니다.이전에 구성 요소의 상태 값에 사용자 ID, 토큰 및 Teams 모임 링크를 할당했습니다
App
. 지금은 잘 작동하지만, 이후 연습에서는 이러한 값을 동적으로 검색하는 방법을 확인할 수 있습니다. 이전에 값을 설정했으므로 다음과 같이 함수의useEffect
코드를 주석 처리합니다. 다음 연습에서 Azure Functions가 실행되면 이 코드를 다시 검토합니다.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 폴더 내에서 명령을 실행해야 합니다.애플리케이션이 빌드된 후 호출 UI가 표시됩니다. 마이크 및 카메라 선택을 사용하도록 설정하고 통화를 시작합니다. 대기실에 배치된 것을 볼 수 있습니다. Microsoft Teams에서 이전에 설치한 모임에 참가하는 경우 게스트가 모임에 참가하도록 허용할 수 있습니다.
Ctrl +C를 눌러 애플리케이션을 중지합니다. 성공적으로 실행했으므로 ACS 사용자 ID 및 토큰을 동적으로 가져오고 Microsoft Teams 모임을 자동으로 만들고 Microsoft Graph를 사용하여 조인 URL을 반환하는 방법을 살펴보겠습니다.
Microsoft Graph를 사용하여 동적으로 Microsoft Teams 모임 만들기
이 연습에서는 Azure Functions 및 Microsoft Graph를 사용하여 Microsoft Teams 모임 링크를 만들고 ACS에 전달하는 프로세스를 자동화합니다.
디먼 앱 인증을 위해 Microsoft Entra ID 앱을 만들어야 합니다. 이 단계에서는 앱 자격 증명을 사용하여 백그라운드에서 인증을 처리하고, Microsoft Entra ID 앱은 애플리케이션 권한을 사용하여 Microsoft Graph API를 호출합니다. Microsoft Graph는 동적으로 Microsoft Teams 모임을 만들고 Teams 모임 URL을 반환하는 데 사용됩니다.
다음 단계를 수행하여 Microsoft Entra ID 앱을 만듭니다.
- Azure Portal로 이동하여 Microsoft Entra ID를 선택합니다.
- 앱 등록 탭과 + 새 등록을 선택합니다.
- 아래와 같이 새 앱 등록 양식 세부 정보를 입력하고 등록을 선택합니다.
- 이름: ACS Teams Interop 앱
- 지원되는 계정 유형: 모든 조직 디렉터리의 계정(모든 Microsoft Entra ID 디렉터리 - 다중 테넌트) 및 개인 Microsoft 계정(예: Skype, Xbox)
- 리디렉션 URI: 비워 둡니다.
- 앱이 등록되면 API 권한으로 이동하여 + 권한 추가를 선택합니다.
- Microsoft Graph를 선택한 다음 애플리케이션 권한을 선택합니다.
Calendars.ReadWrite
사용 권한을 선택한 다음 추가를 선택합니다.- 권한을 추가한 후 YOUR_ORGANIZATION_NAME> 대한 관리자 동의 부여를 <선택합니다.
- 인증서 및 비밀 탭으로 이동하여 + 새 클라이언트 비밀을 선택한 다음 추가를 선택합니다.
- 비밀 값을 로컬 파일에 복사합니다. 이 연습의 뒷부분에서 이 값을 사용합니다.
- 개요 탭으로 이동하여 이전 단계에서 사용한 것과 동일한 로컬 파일에 값과
Directory (tenant) ID
값을 복사Application (client) ID
합니다.
local.settings.json 파일 만들기
samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Visual Studio에서 열거나 Visual Studio Code에서 GraphACSFunctions 폴더를 엽니다.프로젝트로
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" ] }
- 이전 연습에서 로컬 파일에 복사한 값을 사용하여 값 및
CLIENT_SECRET
값을 업데이트TENANT_ID
CLIENT_ID
합니다. - Microsoft Teams 모임을 만들려는 사용자 ID로 정의
USER_ID
합니다.
Azure Portal에서 사용자 ID를 가져올 수 있습니다.
- Microsoft 365 개발자 테넌트 관리자 계정을 사용하여 로그인합니다.
- Microsoft Entra ID 선택
- 사이드바의 사용자 탭으로 이동합니다.
- 사용자 이름을 검색하고 선택하여 사용자 세부 정보를 확인합니다.
- 사용자 세부 정보
Object ID
User ID
내에서 .Object ID
값을 복사하고 local.settings.json 값에 사용합니다USER_ID
.
참고 항목
ACS_CONNECTION_STRING
는 다음 연습에서 사용되므로 아직 업데이트할 필요가 없습니다.- 이전 연습에서 로컬 파일에 복사한 값을 사용하여 값 및
GraphACSFunctions.sln
acs-to-teams-meeting/server/csharp 폴더에 있으며 다음 Microsoft Graph 및 ID 패키지가 포함되어 있습니다.<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
Azure Functions에서 Microsoft Graph를 호출하는 데 사용할 수 있는 개체를 만듭니다. 싱글톤이며 다른 클래스에 삽입할 수 있습니다. - 생성자에 값을 전달
ClientSecretCredential
하여 앱 전용 권한(예: Calendars.ReadWrite)으로 Microsoft Graph API 호출을GraphServiceClient
수행할 수 있습니다. MicrosoftClientSecretCredential
Entra ID 앱의Tenant Id
Client Id
값 및Client Secret
값을 사용합니다.
- 이 코드는
서비스/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()
사용자의 일정에 이벤트를 동적으로 만들고 조인 URL을 반환하는 Microsoft Graph 일정 이벤트 API에 데이터를 게시합니다.
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; }
- HTTP GET 요청을 사용하여 호출할 수 있는 함수 이름을
HttpTriggerTeamsUrl
정의합니다. - 새 이벤트를 만들고 조인 URL을 반환하는 호출
_graphService.CreateMeetingAsync()
입니다.
- HTTP GET 요청을 사용하여 호출할 수 있는 함수 이름을
Visual Studio에서 F5 키를 누르거나 디버그를> 선택하여 프로그램을 실행합니다. 메뉴에서 디버깅을 시작합니다. 이 작업은 Azure Functions 프로젝트를 시작하고 호출할 수 있도록 합니다
ACSTokenFunction
.
참고 항목
VS Code를 사용하는 경우 GraphACSFunctions 폴더에서 터미널 창을 열고 실행할 func start
수 있습니다. 이 경우 컴퓨터에 Azure Functions Core Tools가 설치되어 있다고 가정합니다.
React에서 Azure Function 호출
이제 함수를
httpTriggerTeamsUrl
사용할 준비가 되었으므로 React 앱에서 호출해 보겠습니다.클라이언트/react 폴더를 확장합니다.
다음 값을 사용하여 폴더에 .env 파일을 추가합니다.
REACT_APP_TEAMS_MEETING_FUNCTION=http://localhost:7071/api/httpTriggerTeamsUrl REACT_APP_ACS_USER_FUNCTION=http://localhost:7071/api/httpTriggerAcsToken
이러한 값은 빌드 시 React에 전달되므로 빌드 프로세스 중에 필요에 따라 쉽게 변경할 수 있습니다.
VS Code에서 client/react/App.tsx 파일을 엽니다.
구성 요소에서
teamsMeetingLink
상태 변수를 찾습니다. 하드 코딩된 팀 링크를 제거하고 빈 따옴표로 바꿉니다.const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
함수를
useEffect
찾아 다음과 같이 변경합니다. 이는 이전에 살펴본 Azure Function 호출을 처리하여 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 호출 UI가 표시되고 Microsoft Graph에서 동적으로 만든 Teams 모임을 호출할 수 있습니다.
터미널 창에 Ctrl +C를 입력하여 터미널 프로세스를 중지합니다.
Azure Functions 프로젝트를 중지합니다.
참고 항목
다른 방법으로 Microsoft Teams 모임을 확장하는 방법에 대한 자세한 내용은 Azure Communication Services 설명서를 참조하세요.
동적으로 Azure Communication Services ID 및 토큰 만들기
이 연습에서는 Azure Functions를 사용하여 Azure Communication Services에서 사용자 ID 및 토큰 값을 동적으로 검색하는 방법을 알아봅니다. 검색된 값은 고객이 호출할 수 있도록 ACS UI 복합으로 전달됩니다.
local.settings.json 열고 이전 연습에서 저장한 ACS 연결 문자열 값을 업데이트
ACS_CONNECTION_STRING
합니다.Visual Studio에서 Startup.cs 열고 메서드의 두 번째
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()
local.settings.json 값을 사용하여 개체를ACS_CONNECTION_STRING
만듭니다CommunicationIdentityClient
.ACSTokenFunction.cs 열고 생성자 및 필드 정의를 찾습니다.
범위가 포함된
CommunicationTokenScope.VoIP
필드가Scopes
정의됩니다. 이 범위는 화상 통화에 대한 액세스 토큰을 만드는 데 사용됩니다.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; }
- HTTP GET 요청을 사용하여 호출할 수 있는 명명된
HttpTriggerAcsToken
함수를 정의합니다. - 메서드를 호출
_tokenClient.CreateUserAsync()
하여 새 ACS 사용자를 만듭니다. - 비디오 통화에 사용되는 액세스 토큰은 메서드를
_tokenClient. GetTokenAsync()
호출하여 생성됩니다. - 사용자 ID 및 토큰은 함수에서 JSON 개체로 반환됩니다.
- HTTP GET 요청을 사용하여 호출할 수 있는 명명된
Visual Studio에서 F5 키를 누르거나 디버그를> 선택하여 프로그램을 실행합니다. 메뉴에서 디버깅을 시작합니다. 그러면 Azure Functions 프로젝트가 시작되고
ACSTokenFunction
호출할 수 있게 됩니다.참고 항목
VS Code를 사용하는 경우 GraphACSFunctions 폴더에서 터미널 창을 열고 실행할
func start
수 있습니다. 이 경우 컴퓨터에 Azure Functions Core Tools가 설치되어 있다고 가정합니다.이제 Azure Functions가 로컬로 실행되고 있으므로 클라이언트가 이를 호출하여 ACS 사용자 ID 및 토큰 값을 가져올 수 있어야 합니다.
편집기에서 samples/acs-to-teams-meeting/client/react/App.tsx 파일을 엽니다.
구성 요소에서
userId
상태 변수 및token
상태 변수를 찾습니다. 하드 코딩된 값을 제거하고 빈 따옴표로 바꿉니다.const [userId, setUserId] = useState<string>(''); const [token, setToken] = useState<string>('');
함수를
useEffect
찾아서 다음과 같이 변경하여 Azure Function을 호출하여 ACS 사용자 ID 및 토큰을 검색할 수 있도록 합니다.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 호출 UI가 표시되고 Microsoft Graph에서 동적으로 만든 Teams 모임을 호출할 수 있습니다.터미널 창에서 Ctrl +C를 눌러 React 앱을 중지합니다.
Azure Functions 프로젝트를 중지합니다.
Visual Studio Code를 사용하여 Git 변경 내용을 커밋하고 GitHub 리포지토리에 푸시합니다.
- 소스 제어 아이콘(Visual Studio Code 도구 모음에서 세 번째 아래쪽)을 선택합니다.
- 커밋 메시지 입력하고 커밋을 선택합니다.
- 변경 내용 동기화를 선택합니다.
Azure Functions 및 Azure Container Apps에 앱 배포
Important
이 자습서에 나열된 필수 구성 요소 외에도 이 연습을 완료하려면 컴퓨터에 다음 도구를 설치해야 합니다.
이 연습에서는 이전 연습에서 설명한 Microsoft Graph 및 ACS 함수를 Azure Functions에 배포하는 방법을 알아봅니다. 또한 컨테이너 이미지를 빌드하고 Azure Container Apps에 배포합니다.
Azure Functions에 배포
참고 항목
이 섹션에서는 Visual Studio를 사용하여 C# 함수를 Azure에 게시합니다. Visual Studio Code를 사용하려는 경우 Visual Studio Code 빠른 시작을 사용하여 Azure에서 C# 함수 만들기의 지침을 따를 수 있습니다.
samples/acs-video-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Visual Studio에서 프로젝트를 엽니다.프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를
GraphACSFunctions
선택합니다.대상 섹션에서 Azure를 선택한 다음, 다음을 클릭합니다.
Azure 함수 앱(Windows)을 선택한 다음, 다음을 클릭합니다.
구독을 선택한 다음+ 새로 만들기를 선택합니다.
다음 정보를 입력합니다.
- 함수 이름: 전역적으로 고유한 이름이 필요합니다. 예: acsFunctions<YOUR_LAST_NAME>.
- 구독: 구독을 선택합니다.
- 리소스 그룹: 이 자습서의 앞부분에서 만든 리소스 그룹을 선택하거나 새 리소스 그룹을 만들 수도 있습니다.
- 호스팅 계획: 소비 계획.
- 위치: 배포하려는 지역을 선택합니다.
- Azure Storage: 새 스토리지를 만듭니다. (기존 스토리지 계정을 선택할 수도 있습니다.)
- Azure Insights: 새 인사이트를 만듭니다. (기존 스토리지 계정을 선택할 수도 있습니다.)
참고 항목
전역적으로 고유한 이름이 필요합니다. 이름 끝에 숫자나 성을 추가하여 이름을 더 고유하게 만들 수 있습니다.
Azure Function App이 만들어지면 확인 화면이 표시됩니다. 패키지에서 실행 옵션이 선택되어 있는지 확인한 다음 마침을 선택합니다.
게시를 선택하여 Azure에 함수를 배포합니다.
함수가 Azure에 배포되면 Azure Portal로 이동하여 만든 함수 앱을 선택합니다.
배포한 함수의 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 Container Apps에 배포
첫 번째 작업은 새 ACR(Azure Container Registry) 리소스를 만드는 것입니다. 레지스트리가 만들어지면 이미지를 빌드하고 레지스트리에 푸시합니다.
명령 창을 열고 다음 명령을 실행하여 Azure 구독에 로그인합니다.
az login
자리 표시자에 대한 값을 적절하게 대체하는 다음 셸 변수를 추가합니다. <GITHUB_USERNAME> 소문자 값으로 추가하고 Azure Functions 도메인을< 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 Container Registry 리소스를 만듭니다.
az acr create \ --resource-group $RESOURCE_GROUP \ --name $ACR_NAME \ --sku Basic \ --admin-enabled true
편집기에서 클라이언트/react/Dockerfile 파일을 열고 다음 작업이 수행되는지 확인합니다.
- React 애플리케이션이 빌드되고 빌드 단계에 할당됩니다.
- nginx 서버가 구성되고 빌드 단계의 출력이 nginx 서버 이미지로 복사됩니다.
클라이언트/react 폴더의 루트에서 다음 명령을 실행하여 Azure에서 컨테이너 이미지를 빌드합니다. YOUR_FUNCTIONS_DOMAIN> 이 연습의 앞부분에서 로컬 파일에 복사한 Azure Functions 도메인으로 바꿉<니다.
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 Container App을 만들어야 합니다.
브라우저에서 Azure Portal 을 방문하여 로그인합니다.
위쪽 검색 창에 컨테이너 앱을 입력하고 표시되는 옵션에서 Container Apps를 선택합니다.
도구 모음에서 만들기를 선택합니다.
참고 항목
Azure Portal을 사용하지만 Azure CLI를 사용하여 컨테이너 앱을 만들 수도 있습니다. 자세한 내용은 빠른 시작: 첫 번째 컨테이너 앱 배포를 참조하세요. 이 연습이 끝날 때 Azure CLI를 사용하는 방법의 예제도 볼 수 있습니다.
다음 작업을 수행합니다.
- 구독을 선택합니다.
- 사용할 리소스 그룹을 선택합니다(필요한 경우 새 리소스 그룹 만들기). 원하는 경우 ACS 리소스에 사용한 것과 동일한 리소스 그룹을 사용할 수 있습니다. 리소스 그룹 이름을 Azure Functions 도메인을 저장한 동일한 로컬 파일에 복사합니다.
- acs-to-teams-meeting의 컨테이너 앱 이름을 입력합니다.
- 지역을 선택합니다.
- Container Apps 환경 섹션에서 새로 만들기를 선택합니다.
- acs-to-teams-meeting-env의 환경 이름을 입력합니다.
- 생성 단추를 선택합니다.
- 다음: 앱 설정을 >선택합니다.
컨테이너 앱 만들기 화면에 다음 값을 입력합니다.
- 빠른 시작 이미지 사용 확인란의 선택을 취소합니다.
- 이름: acs-to-teams-meeting
- 이미지 원본: Azure Container Registry
- 레지스트리: <YOUR_ACR_REGISTRY_NAME.azurecr.io>
- 이미지: acs-to-teams-meeting
- 이미지 태그: 최신
- CPU 및 메모리: 0.25 CPU 코어, -.5 Gi 메모리
애플리케이션 수신 설정 섹션에서 다음을 수행합니다.
- 사용 확인란을 선택합니다.
- 어디서나 트래픽 허용 단추를 선택합니다.
그러면 React 애플리케이션에 대한 진입점(수신)이 만들어지고 어디서나 호출할 수 있습니다. Azure Container Apps는 모든 트래픽을 HTTPS로 리디렉션합니다.
- 대상 포트: 80
검토 + 만들기를 선택합니다. 유효성 검사가 통과되면 만들기 단추를 선택합니다.
오류가 발생하면 컨테이너 앱 환경이 너무 오랫동안 비활성 상태이기 때문일 수 있습니다. 가장 간단한 솔루션은 컨테이너 앱을 다시 만드는 프로세스를 진행하는 것입니다. 또는 다음 명령을 실행하여 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 Portal에서 탐색하고 개요 화면에서 애플리케이션 URL 을 선택하여 nginx 컨테이너에서 실행 중인 애플리케이션을 봅니다.
축하합니다!
이 자습서를 완료했습니다.
본 섹션과 관련하여 문제가 있으십니까? 문제가 있으시면 본 섹션을 개선하기 위해 피드백을 제출해 주세요.