教學課程:為 Azure 函數應用程式提供媒體服務帳戶的存取權
警告
Azure 媒體服務將於 2024 年 6 月 30 日淘汰。 如需詳細資訊,請參閱 AMS淘汰指南。
假設您想要讓訪客前往您的網站或應用程式,以瞭解您在廣播工作室中「On Air」的內容。 您可以使用媒體服務 API 來判斷媒體服務即時事件何時正在執行,但這可能很難從內嵌的裝置呼叫。 相反地,您可以使用 Azure Functions公開內嵌裝置的 HTTP API。 Azure Functions 接著可以呼叫媒體服務以取得即時事件的狀態。
本教學課程使用 2020-05-01 媒體服務 API。
登入 Azure
若要使用本文中的任何命令,請先登入要使用的訂閱。
登入 Azure。 當您使用此命令時,系統會提示您輸入要使用的訂閱。
az login
設定訂用帳戶
使用此命令設定要使用的訂閱。
使用 CLI 設定 Azure 訂用帳戶
在下列命令中,提供您要用於媒體服務帳戶的 Azure 訂用帳戶識別碼。
az account set --subscription <subscriptionName>
必要條件
重要
強烈建議您先從命令列快速入門在 Azure 中建立 C# 函式,然後再嘗試本教學課程。 這是因為其中包含的設定步驟與此處所需的步驟相同。 如此也會讓您有機會使用本教學課程所依據的簡單範例。
資源名稱
開始前,請決定您要建立的資源名稱。 這些範例應該可以輕鬆識別為集合,尤其當您不打算在完成測試後使用這些範例。 許多資源類型的命名規則都不同,因此最好保持全部小寫。 例如,「mediatest1rg」用於資源群組名稱,而「mediatest1stor」用於儲存體帳戶名稱。 針對本文中每個步驟使用相同的名稱。
您會在下列命令中看到這些參考的名稱。 您需要的資源名稱如下:
- myRG
- myStorageAccount
- myAmsAccount
- location
- myFunction:使用 “OnAir”
- myLiveEvent:使用 “live1”
- ipaddresses use: “0.0.0./32”
注意
上方連字號僅用於分隔指引字組。 由於 Azure 服務中的命名資源不一致,命名資源時請勿使用連字號。
以 00000000-0000-0000-0000000000 表示的任何項目都是資源的唯一識別碼。 此值通常是由 JSON 回應傳回。 您應該在 [記事本] 或其他文本編輯器中複製並貼上 JSON 回應,因為這些回應將包含稍後 CLI 命令所需的值。
此外,您不會建立區域名稱。 區域名稱是由 Azure 決定。
列出 Azure 區域
如果您不確定要使用的實際區域名稱,請使用此命令取得清單:
使用此命令列出帳戶的可用區域。
az account list-locations --query "[].{DisplayName:displayName, Name:name}" -o table
順序
下方每個步驟會以特定順序完成,因為序列中的下一個步驟會使用來自 JSON 回應的一或多個值。
建立儲存體帳戶
您要建立的媒體服務帳戶必須有相關的儲存體帳戶。 請先建立媒體服務帳戶的儲存體帳戶。 您會將 your-storage-account-name
用於後續步驟。
使用 CLI 建立 Azure 記憶體帳戶
使用下列命令來建立 Azure 記憶體帳戶。
若要建立記憶體帳戶,您必須先在位置內建立資源群組。
若要列出可用的位置,請使用下列命令:
使用 CLI 列出可用的位置
若要列出可用的位置,請使用下列命令:
az account list-locations
使用 CLI 建立資源群組
若要建立資源群組,請使用下列命令:
az group create -n <resourceGroupName> --location chooseLocation
選擇 SKU
您也需要為您的記憶體帳戶選擇 SKU。 您可以列出記憶體帳戶。
從下列清單中選擇 SKU:Standard_LRS、Standard_GRS、Standard_RAGRS、Standard_ZRS、Premium_LRS、Premium_ZRS、Standard_GZRS Standard_RAGZRS。
- 變更
myStorageAccount
為長度少於 24 個字元的唯一名稱。 - 變更
chooseLocation
為您想要在其中運作的區域。 - 變更
chooseSKU
為慣用的 SKU。
az storage account create -n <myStorageAccount> -g <resourceGroup> --location <chooseLocation> --sku <chooseSKU>
建立媒體服務帳戶
現在請建立媒體服務帳戶。 尋找 '
如需此命令的詳細資訊,請參閱 媒體服務 CLI 參考。
設定 Azure 函式
在本節中,您將設定 Azure 函式。
取得程式碼
使用 Azure Functions 建立函式專案,並從 HTTP 範本擷取程式碼。
func init MediaServicesLiveMonitor –dotnet
變更目錄
請務必將工作目錄變更為專案目錄。 否則,您將會收到錯誤。
cd .\MediaServicesLiveMonitor\
函式命名
func new --name OnAir --template "HTTP trigger" --authlevel "anonymous"
設定函式專案
安裝媒體服務和其他延伸模組
在終端機視窗中執行 dotnet add package 命令,以安裝專案中所需的延伸模組套件。 下列命令會安裝媒體服務和 Azure 身分識別套件。
dotnet add package Microsoft.Azure.Management.Media
dotnet add package Azure.Identity
編輯 OnAir.cs 程式碼
變更 OnAir.cs
檔案。 將 subscriptionId
、resourceGroup
和 mediaServicesAccountName
變數變更為您先前決定的變數。
using Azure.Core;
using Azure.Identity;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Management.Media;
using Microsoft.Azure.Management.Media.Models;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Rest;
using System.Threading.Tasks;
namespace MediaServicesLiveMonitor
{
public static class OnAir
{
[FunctionName("OnAir")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
if (string.IsNullOrWhiteSpace(name))
{
return new BadRequestObjectResult("Missing 'name' URL parameter");
}
var credential = new ManagedIdentityCredential();
var accessTokenRequest = await credential.GetTokenAsync(
new TokenRequestContext(
scopes: new string[] { "https://management.core.windows.net" + "/.default" }
)
);
ServiceClientCredentials credentials = new TokenCredentials(accessTokenRequest.Token, "Bearer");
var subscriptionId = "00000000-0000-0000-000000000000"; // Update
var resourceGroup = "<your-resource-group-name>"; // Update
var mediaServicesAccountName = "<your-media-services-account-name>"; // Update
var mediaServices = new AzureMediaServicesClient(credentials)
{
SubscriptionId = subscriptionId
};
var liveEvent = await mediaServices.LiveEvents.GetAsync(resourceGroup, mediaServicesAccountName, name);
if (liveEvent == null)
{
return new NotFoundResult();
}
return new OkObjectResult(liveEvent.ResourceState == LiveEventResourceState.Running ? "On air" : "Off air");
}
}
}
建立函數應用程式
建立函數應用程式以裝載函式。 名稱與您先前下載的名稱 MediaServicesLiveMonitorApp
相同。
az functionapp create --resource-group <your-resource-group-name> --consumption-plan-location your-region --runtime dotnet --functions-version 3 --name MediaServicesLiveMonitorApp --storage-account mediatest3store --assign-identity "[system]"
在 JSON 回應中,尋找 principalId
:
{
...
"identity": {
//Note the principalId value for the following step
"principalId": "00000000-0000-0000-000000000000",
"tenantId": "00000000-0000-0000-000000000000",
"type": "SystemAssigned",
"userAssignedIdentities": null
}
...
授與函數應用程式對媒體服務帳戶資源的存取權
針對此要求:
-
assignee
是az functionapp create
中位於 JSON 回應的principalId
-
scope
是az ams account create
中位於 JSON 回應的id
。 請參閱上方的範例 JSON 回應。
az role assignment create --assignee 00000000-0000-0000-000000000000 --role "Media Services Account Administrator" --scope "/subscriptions/<the-subscription-id>/resourceGroups/<your-resource-group>/providers/Microsoft.Media/mediaservices/<your-media-services-account-name>"
發佈函式
func azure functionapp publish MediaServicesLiveMonitorApp
驗證
在瀏覽器中,移至函式 URL,例如:
https://mediaserviceslivemonitorapp.azurewebsites.net/api/onair?name=live1
這應該會傳回 404 (找不到) 錯誤,因為即時事件尚未存在。
建立即時事件
az ams live-event create --resource-group test3 --account-name mediatest3 --name live1 --streaming-protocol RTMP
在瀏覽器中,移至函式 URL,例如:
https://mediaserviceslivemonitorapp.azurewebsites.net/api/onair?name=live1
這現在應該會顯示「Off Air」。
啟動即時事件
如果您啟動即時事件,函式應該會傳回「On Air」。
az ams live-event start live1
此函式允許存取任何人。 保護 Azure 函式的存取權,而裝設「On Air」指示燈不在本文件的範圍內。
清除資源
如果您不打算使用所建立的資源,請刪除資源群組。
使用 CLI 刪除資源群組
az group delete --name <your-resource-group-name>
取得說明及支援
您可以連絡媒體服務並詢問問題,或依照下列其中一種方法追蹤我們的更新:
- 問與答
-
Stack Overflow。 使用
azure-media-services
標記問題。 - @MSFTAzureMedia 或使用 @AzureSupport 來要求支援。
- 透過 Azure 入口網站 開啟支援票證。