カスタム アプリから Teams 会議へのオーディオ/ビデオ通話
レベル: 中間
このチュートリアルでは、カスタム React アプリケーションでAzure Communication Servicesを使用して、ユーザーが Microsoft Teams 会議に音声/ビデオ通話を行えるようにする方法について説明します。 このシナリオを可能にするために使用できるさまざまな構成要素について学習し、関連するさまざまな 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 Functions
- Microsoft Graph
- Microsoft Teams
Azure Communication Services リソースをCreateする
この演習では、Azure portalにAzure Communication Services (ACS) リソースを作成します。
作業を開始するには、次のタスクを実行します。
ブラウザーでAzure portalにアクセスし、サインインします。
ページ上部の検索バーに「Communication Services」と入力し、表示されるオプションから [Communication Services] を選択します。
ツール バーの [Create] を選択します。
次のタスクを実行します。
- Azure サブスクリプションを選択します。
- 使用するリソース グループを選択します (存在しない場合は新しいリソース グループを作成します)。
- ACS リソース名を入力します。 これは一意の値である必要があります。
- データの場所を選択します。
[確認とCreate]、[Create] の順に選択します。
ACS リソースが作成されたら、そのリソースに移動し、[ 設定] --> [ID] & [ユーザー アクセス トークン] を選択します。
[ 音声およびビデオ通話 (VOIP)] チェック ボックスをオンにします。
[Generate] \(生成) を選択します。
ID トークンとユーザー アクセス トークンの値をローカル ファイルにコピーします。 値は、この演習の後半で必要になります。
[設定] --> [キー] を選択し、[主キー接続文字列値を、ユーザー ID とトークン値をコピーしたローカル ファイルにコピーします。
アプリケーションを実行するには、Teams 会議リンクが必要です。 Microsoft Teams に移動し、Microsoft 365 開発者テナントでサインインし、左側の [予定表] オプションを選択します。
ヒント
現在 Microsoft 365 アカウントをお持ちでない場合は、 Microsoft 365 Developer Program サブスクリプションにサインアップできます。 これは 90 日間 無料 で、開発アクティビティに使用している限り、継続的に更新されます。 Visual Studio Enterprise または Professional サブスクリプションをお持ちの場合は、両方のプログラムに無料の Microsoft 365 開発者サブスクリプションが含まれます。これは、Visual Studio サブスクリプションの有効期間中有効です。
予定表で任意の日付/時刻を選択し、会議のタイトルを追加し、Microsoft 365 開発者テナントからユーザーを招待して、[保存] を選択 します。
予定表に追加した新しい会議を選択し、ACS ユーザー ID、トークン、および接続文字列を保存したのと同じファイルに表示される Teams 会議リンクをコピーします。
ACS リソースがセットアップされ、Teams 会議参加リンクが作成されたので、React アプリケーションを起動して実行してみましょう。
Azure Communication Services 呼び出しをReact アプリに統合する
この演習では、ACS UI 呼び出し複合を React アプリに追加して、カスタム アプリから Microsoft Teams 会議に音声/ビデオ通話を行えるようにします。
GitHub にアクセスしてサインインします。 GitHub アカウントがまだない場合は、[ サインアップ ] オプションを選択して作成できます。
[フォーク] オプションを選択して、目的の GitHub organization/アカウントにリポジトリを追加します。
次のコマンドを実行して、このリポジトリをマシンに複製します。 YOUR_ORG_NAMEを GitHub organization/アカウント名に置き換えます<。>
git clone https://github.com/<YOUR_ORG_NAME>/MicrosoftCloud
Visual Studio Code で samples/acs-to-teams-meeting プロジェクト フォルダーを開きます。
クライアント/react フォルダーを展開します。
VS Code で package.json ファイルを開き、次の ACS パッケージが含まれていることに注意してください。
@azure/communication-common @azure/communication-react
ターミナル ウィンドウを開き、次のコマンドを実行して npm 10 以上がインストールされていることをダブルチェックします。
npm --version
ヒント
npm 10 以上がインストールされていない場合は、 を実行
npm install -g npm
して 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>('');
注意
このチュートリアルの後半では、および
teamsMeetingLink
の値をuserId
token
動的に取得する方法について説明します。- 少し時間を取って、
少し時間を取って、コンポーネント内の
useMemo
関数をApp
調べます。- トークンに
credential
useMemo
値が含まれると、関数によって新しいAzureCommunicationTokenCredential
インスタンスが作成されます。 - 関数は
callAdapterArgs
useMemo
、オーディオ/ビデオ呼び出しを行うために使用される引数を持つ オブジェクトを返します。 では、ACS 呼び出し引数で 、credential
、およびteamsMeetingLink
の値が使用userId
されていることに注意してください。
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
は、必要なパラメーターが渡されるときにオブジェクトと呼び出しアダプターの引数を 1 回だけAzureCommunicationTokenCredential
作成する必要があるため、このシナリオで使用されます。 useMemo に関するその他 の詳細については、こちらを参照してください。- トークンに
と
callAdapterArgs
のcredentials
準備ができたら、次の行は ACS によって提供されるReact フックをuseAzureCommunicationCallAdapter
使用して ACS コール アダプタの作成を処理します。 オブジェクトはcallAdapter
、後で複合コンポーネントを呼び出す UI で使用されます。const callAdapter = useAzureCommunicationCallAdapter(callAdapterArgs);
注意
はReactフックであるため
useAzureCommunicationCallAdapter
、値が有効になるまでcallAdapterArgs
値callAdapter
はに割り当てられません。以前に、ユーザー 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 会議を動的にCreateする
この演習では、Microsoft Teams 会議リンクを作成し、Azure Functionsと Microsoft Graph を使用して 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 相互運用機能アプリ
- サポートされているアカウントの種類: 任意の組織のディレクトリ内のアカウント (任意のMicrosoft Entra ID ディレクトリ - マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など)
- リダイレクト URI: この値は空白のままにします
- アプリが登録されたら、[ API のアクセス許可 ] に移動し、[ + アクセス許可の追加] を選択します。
- [ Microsoft Graph] の後に [ アプリケーションのアクセス許可] を選択します。
- アクセス許可を
Calendars.ReadWrite
選択し、[ 追加] を選択します。 - アクセス許可を追加したら、[YOUR_ORGANIZATION_NAME>に管理者の同意を付与する<] を選択します。
- [ 証明書 & シークレット ] タブに移動し、[ + 新しいクライアント シークレット] を選択し、[ 追加] を選択します。
- シークレットの値をローカル ファイルにコピーします。 この値は、この演習の後半で使用します。
- [ 概要 ] タブに移動し、前の
Application (client) ID
手順で使用したのと同じローカル ファイルに とDirectory (tenant) ID
の値をコピーします。
local.settings.json ファイルの作成
Visual Studio で を
samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln
開くか、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_ID
とCLIENT_SECRET
値を更新しますTENANT_ID
。 - Microsoft Teams 会議を作成するユーザー ID を使用して定義
USER_ID
します。
Azure portalからユーザー ID を取得できます。
- Microsoft 365 開発者テナント管理者アカウントを使用してログインします。
- [Microsoft Entra ID] を選択します
- サイド バーの [ ユーザー ] タブに移動します。
- ユーザー名をSearchし、それを選択してユーザーの詳細を表示します。
- ユーザーの詳細内で、
Object ID
は を表しますUser ID
。 値をObject ID
コピーし、local.settings.jsonのUSER_ID
値に使用します。
注意
ACS_CONNECTION_STRING
は次の演習で使用されるため、まだ更新する必要はありません。- 以前の演習でローカル ファイルにコピーした値を使用して、 値
acs-to-teams-meeting/server/csharp フォルダーにあるを開
GraphACSFunctions.sln
き、次の 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
行うことができます。 ではClientSecretCredential
、Tenant Id
Microsoft Entra 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()
Microsoft Graph カレンダー イベント API にデータを投稿します。これにより、ユーザーの予定表にイベントが動的に作成され、結合 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; }
- HTTP GET 要求で呼び出すことができる の
HttpTriggerTeamsUrl
関数名を定義します。 - を呼び出
_graphService.CreateMeetingAsync()
し、新しいイベントを作成し、結合 URL を返します。
- HTTP GET 要求で呼び出すことができる の
Visual Studio で F5 キーを押すか、メニューから [ デバッグ] --> [デバッグの開始 ] を選択して、プログラムを実行します。 このアクションにより、Azure Functions プロジェクトが開始され、 が
ACSTokenFunction
呼び出し可能になります。
注意
VS Code を使用している場合は、 GraphACSFunctions フォルダーでターミナル ウィンドウを開き、 を実行 func start
できます。 これは、コンピューターに Azure Functions Core Tools がインストールされていることを前提としています。
Reactから Azure 関数を呼び出す
関数を
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 関数の呼び出しが処理され、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(); }, []);
続行する前にファイルを保存します。
*react フォルダーにターミナル ウィンドウ
cd
を開き、 を実行npm start
してアプリケーションをビルドして実行します。アプリケーションのビルドと読み込みが完了すると、ACS 呼び出し UI が表示され、Microsoft Graph によって動的に作成された Teams 会議に呼び出すことができます。
ターミナル ウィンドウで Ctrl + C キー を押してターミナル プロセスを停止します。
Azure Functions プロジェクトを停止します。
注意
他の方法で Microsoft Teams 会議を拡張する方法の詳細については、Azure Communication Servicesドキュメントを参照してください。
Azure Communication Services ID とトークンを動的にCreateする
この演習では、Azure Functionsを使用してAzure Communication Servicesからユーザー ID とトークンの値を動的に取得する方法について説明します。 取得されると、値は ACS UI コンポジットに渡され、顧客による呼び出しが可能になります。
local.settings.json開き、前の
ACS_CONNECTION_STRING
演習で保存した ACS 接続文字列で値を更新します。Visual Studio で Startup.cs を開き、 メソッドの 2 番目
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
local.settings.jsonの値をACS_CONNECTION_STRING
使用して オブジェクト が作成されます。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; }
ACSTokenFunction.csの
Run()
メソッドを調べる:[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
関数を定義します。 - 新しい ACS ユーザーは、 メソッドを呼び出すことによって作成されます
_tokenClient.CreateUserAsync()
。 - ビデオ呼び出しに使用されるアクセス トークンは、 メソッドを呼び出すことによって作成されます
_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 関数を呼び出して 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(); }, []);
続行する前にファイルを保存します。
ターミナル ウィンドウを開き、 フォルダーで を
react
実行npm start
します。 ビルドと読み込みが完了すると、ACS 呼び出し UI が表示され、Microsoft Graph によって動的に作成された Teams 会議に呼び出すことができます。ターミナル ウィンドウで Ctrl + C キーを押して、React アプリを停止します。
Azure Functions プロジェクトを停止します。
Git の変更をコミットし、Visual Studio Code を使用して GitHub リポジトリにプッシュします。
- [ソース管理] アイコン (Visual Studio Code ツール バーの 3 つ目の下) を選択します。
- コミット メッセージを入力し、[コミット] を選択します。
- [ 変更の同期] を選択します。
アプリを Azure Functions と Azure Container Apps にデプロイする
重要
このチュートリアルに記載されている前提条件に加えて、この演習を完了するには、コンピューターに次のツールをインストールする必要もあります。
- Azure CLI
- VS Code を使用している場合は、Azure Functions拡張機能をインストールします
この演習では、前の演習で説明した Microsoft Graph および ACS 関数をAzure Functionsに展開する方法について説明します。 また、コンテナー イメージをビルドし、Azure Container Apps にデプロイします。
Azure Functions へのデプロイ
Note
このセクションでは、 Visual Studio を使用して C# 関数を Azure に発行します。 Visual Studio Code を使用する場合は、「Visual Studio Code クイックスタートを使用して Azure で C# 関数をCreateする」の手順に従うことができます。
Visual Studio でプロジェクトを
samples/acs-video-to-teams-meeting/server/csharp/GraphACSFunctions.sln
開きます。プロジェクトを
GraphACSFunctions
右クリックし、[発行] を選択 します。[ターゲット] セクションで [ Azure ] を選択し、[ 次へ] をクリックします。
[ Azure Function App (Windows)] を選択し、[ 次へ] をクリックします。
サブスクリプションを選択し、[+ Create新規] を選択します。
次の情報を入力します。
- 関数名: グローバルに一意の名前が必要です。 例: acsFunctions<YOUR_LAST_NAME>。
- サブスクリプション: サブスクリプションを選択します。
- リソース グループ: このチュートリアルで前に作成したリソース グループを選択するか、新しいリソース グループを作成することもできます。
- ホスティング プラン: 従量課金プラン。
- 場所: デプロイ先のリージョンを選択します。
- Azure Storage: 新しいストレージをCreateします。 (既存のストレージ アカウントを選択することもできます)。
- Azure Insights: 新しい分析情報をCreateします。 (既存のストレージ アカウントを選択することもできます)。
注意
グローバルに一意の名前が必要です。 名前の末尾に番号または姓を追加することで、名前をより一意にすることができます。
Azure Function App が作成されると、確認画面が表示されます。 [ パッケージから実行 ] オプションが選択されていることを確認し、[ 完了] を選択します。
[ 発行] を選択して、関数を Azure にデプロイします。
関数が Azure にデプロイされたら、Azure portalに移動し、作成した関数アプリを選択します。
デプロイした関数の URL をコピーします。 この値は、この演習の後半で使用します。
左側のメニューで [ 設定] --> [構成] を選択します。
[ + 新しいアプリケーション設定 ] ボタンを選択し、[ アプリケーション設定] に次のキーと値を追加します。 これらの値は、プロジェクト内
GraphACSFunctions
からlocal.settings.json
取得できます。# 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 をデプロイする
最初に実行するタスクは、新しいAzure Container Registry (ACR) リソースを作成することです。 レジストリが作成されたら、イメージをビルドしてレジストリにプッシュします。
コマンド ウィンドウを開き、次のコマンドを実行して 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 リソースをCreateします。
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 」と入力し、表示されるオプションから [Container Apps ] を選択します。
ツール バーの [Create] を選択します。
注意
Azure portalを使用していますが、Azure CLI を使用してコンテナー アプリを作成することもできます。 詳細については、クイック スタート: コンテナアプリを使用した最初のコンテナー アプリのデプロイに関するページを参照してください。 この演習の最後に Azure CLI を使用する方法の例も示します。
次のタスクを実行します。
- サブスクリプションを選択します。
- 使用するリソース グループを選択します (必要に応じて新しいリソース グループを作成します)。 必要に応じて、ACS リソースに使用したのと同じリソース グループを使用できます。 リソース グループ名を、Azure Functions ドメインを保存したのと同じローカル ファイルにコピーします。
- acs-to-teams-meeting のコンテナー アプリ名を入力します。
- リージョンを選択します。
- [Container Apps Environment]\(コンテナー アプリ環境\) セクションで [Create new] を選択します。
- acs-to-teams-meeting-env の環境名を入力します。
- [作成] ボタンを選択します。
- [ 次へ: アプリ設定] を選択 >します。
[コンテナー アプリのCreate] 画面で、次の値を入力します。
- [ クイック スタート イメージを使用 する] チェックボックスの選択を解除します。
- 名前: 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
[Review + create](レビュー + 作成) を選択します。 検証に合格したら、[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 portalに移動し、[概要] 画面で [アプリケーション URL] を選択して、nginx コンテナーで実行されているアプリケーションを表示します。
おめでとうございます。
このチュートリアルは完了しました
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示