Share via


教學課程:為 Azure 函數應用程式提供媒體服務帳戶的存取權

媒體服務標誌 v3


警告

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 檔案。 將 subscriptionIdresourceGroupmediaServicesAccountName 變數變更為您先前決定的變數。

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
  }
...

授與函數應用程式對媒體服務帳戶資源的存取權

針對此要求:

  • assigneeaz functionapp create 中位於 JSON 回應的 principalId
  • scopeaz 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>

取得說明及支援

您可以連絡媒體服務並詢問問題,或依照下列其中一種方法追蹤我們的更新: