チュートリアル: Azure 関数アプリに Media Services アカウントへのアクセス権を付与する

Media Services ロゴ v3


警告

Azure Media Services は、2024 年 6 月 30 日に廃止されます。 詳細については、「 AMS 廃止ガイド」を参照してください。

たとえば、自分の Web サイトまたはアプリケーションの訪問者に、ブロードキャスト スタジオで "On Air" (放送中) であることを知らせたいとします。 Media Services API を使用して、Media Services ライブ イベントがいつ実行されているかを判断することはできますが、埋め込みデバイスから呼び出すのは難しい場合があります。 代わりに、Azure Functions を使用して埋め込みデバイスの HTTP API を公開できます。 これにより、Azure Functions が Media Services を呼び出して、ライブイベントの状態を取得できます。

関数アプリに Media Services アカウントへのアクセスを付与するマネージド ID

このチュートリアルでは、2020-05-01 Media Services API を使用します。

Azure へのサインイン

この記事のいずれかのコマンドを使用するには、まず、使用するサブスクリプションにサインインする必要があります。

Azure にサインインします。 このコマンドを使用すると、使用するサブスクリプションの入力を求めるメッセージが表示されます。

az login

サブスクリプションの設定

このコマンドを使用して、使用するサブスクリプションを設定します。

CLI を使用して Azure サブスクリプションを設定する

次のコマンドで、Media Services アカウントで使用する Azure サブスクリプション ID を指定します。

az account set --subscription <subscriptionName>

前提条件

重要

このチュートリアルを実行する前に、コマンド ラインのクイックスタートから Azure で C# 関数を作成することを強くお勧めします。 これは、それに含まれているセットアップ手順がここで必要な手順と同じであるためです。 また、このチュートリアルの基になっている簡単な例を使用することもできます。

リソース名

作業を開始する前に、作成するリソースの名前を決定します。 これらは、テストの完了後に使用する予定がない場合は特に、セットとして簡単に識別できる必要があります。 名前付けルールは多くのリソースの種類で異なるため、すべて小文字を使用することをお勧めします。 たとえば、リソース グループ名は "mediatest1rg"、ストレージ アカウント名は "mediatest1stor" にします。 この記事の各手順では、同じ名前を使用します。

これらの名前は、下のコマンドで参照されます。 必要なリソースの名前は次のとおりです。

  • myRG
  • myStorageAccount
  • myAmsAccount
  • location
  • myFunction: use "OnAir"
  • myLiveEvent: use "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 応答から 1 つまたは複数の値がシーケンスの次の手順で使用されるため、下の各手順は特定の順序で行われます。

ストレージ アカウントの作成

作成する Media Services アカウントには、ストレージ アカウントが関連付けられている必要があります。 最初に、Media Services アカウントのストレージ アカウントを作成します。 以降のステップには、your-storage-account-name を使用します。

CLI を使用して Azure Storage アカウントを作成する

次のコマンドを使用して、Azure Storage アカウントを作成します。

ストレージ アカウントを作成するには、まず 1 つの場所にリソース グループを作成する必要があります。

利用可能な場所を一覧表示するには、次のコマンドを使用します。

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>

Media Services アカウントを作成する

次に、Media Services アカウントを作成します。 ` を探します。

このコマンドの詳細については、Media Services の CLI リファレンスを参照してください。

Azure 関数を設定する

このセクションでは、Azure 関数を設定します。

コードを取得する

Azure Functions を使用して、関数プロジェクトを作成し、HTTP テンプレートからコードを取得します。

func init MediaServicesLiveMonitor –dotnet

ディレクトリを変更する

作業ディレクトリをプロジェクト ディレクトリに必ず変更してください。 そうしない場合、エラーが発生します。

cd .\MediaServicesLiveMonitor\

関数名の指定

func new --name OnAir --template "HTTP trigger" --authlevel "anonymous"

関数プロジェクトを構成する

Media Services とその他の拡張機能をインストールする

ターミナル ウィンドウで dotnet add package コマンドを実行して、プロジェクトに必要な拡張機能パッケージをインストールします。 次のコマンドを実行すると、Media Services と Azure ID パッケージがインストールされます。

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

関数アプリに Media Services アカウント リソースへのアクセスを許可する

この要求の場合:

  • 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 (Not Found) エラーが返されます。

ライブ イベントを作成する

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>

ヘルプとサポート

質問がある場合は Media Services に問い合わせるか、次のいずれかの方法で更新内容に従ってください。