다음을 통해 공유


자습서: Azure Function 앱에 Media Services 계정에 대한 액세스 권한 부여

Media Services 로고 v3


경고

Azure Media Services는 2024년 6월 30일에 사용 중지됩니다. 자세한 내용은 AMS 사용 중지 가이드를 참조하세요.

방송 스튜디오에서 "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
  • 위치
  • myFunction: "OnAir" 사용
  • myLiveEvent: "live1" 사용
  • ipaddresses 사용: "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 응답의 값 하나 이상이 시퀀스의 다음 단계에서 사용되기 때문입니다.

Storage 계정 만들기

직접 만들 Media Services 계정에는 스토리지 계정이 연결되어 있어야 합니다. 먼저 Media Services 계정에 대한 스토리지 계정을 만듭니다. 후속 단계에 your-storage-account-name을 사용합니다.

CLI를 사용하여 Azure Storage 계정 만들기

다음 명령을 사용하여 Azure Storage 계정을 만들 수 있습니다.

스토리지 계정을 만들려면 먼저 위치 내에 리소스 그룹을 만들어야 합니다.

사용 가능한 위치를 나열하려면 다음 명령을 사용합니다.

CLI를 사용하여 사용 가능한 위치 나열

사용 가능한 위치를 나열하려면 다음 명령을 사용합니다.

az account list-locations

CLI를 사용하여 리소스 그룹 만들기

리소스 그룹을 만들려면 다음 명령을 사용합니다.

az group create -n <resourceGroupName> --location chooseLocation

SKU 선택

스토리지 계정의 SKU도 선택해야 합니다. 스토리지 계정을 나열할 수 있습니다.

Standard_LRS, Standard_GRS, Standard_RAGRS, Standard_ZRS, Premium_LRS, Premium_ZRS, Standard_GZRS, Standard_RAGZRS 목록에서 SKU를 선택합니다.

  • 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 Function 설정

이 섹션에서는 Azure Function을 설정합니다.

코드 가져오기

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 파일을 변경합니다. subscriptionId, resourceGroupmediaServicesAccountName 변수를 이전에 결정한 값으로 변경합니다.

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 계정 리소스에 대한 액세스 권한 부여

이 요청의 경우:

  • 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 Function에 대한 액세스를 보호하고 "On Air" 조명을 연결하는 것은 이 문서의 범위에 포함되지 않습니다.

리소스 정리

직접 만든 리소스를 사용할 계획이 없으면 리소스 그룹을 삭제합니다.

CLI를 사용하여 리소스 그룹 삭제

az group delete --name <your-resource-group-name>

도움말 및 지원 보기

다음 방법 중 하나로 Media Services에 질문하거나 업데이트를 따를 수 있습니다.