자습서: Media Services 신뢰할 수 있는 스토리지

Media Services 로고 v3


경고

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

이 자습서에서는 다음에 대해 알아봅니다.

  • Azure Media Services에 대해 신뢰할 수 있는 스토리지를 사용하도록 설정하는 방법
  • 신뢰할 수 있는 스토리지에 관리 ID를 사용하는 방법
  • 방화벽 또는 VPN과 같은 네트워크 액세스 제어를 사용할 때 Azure 서비스에 스토리지 계정에 대한 액세스 권한을 부여하는 방법

2020-05-01 API를 사용하면 관리 ID를 Media Services 계정과 연결하여 신뢰할 수 있는 스토리지를 사용하도록 설정할 수 있습니다.

참고

신뢰할 수 있는 스토리지는 API에서만 사용할 수 있으며 현재 Azure Portal에서는 사용할 수 없습니다.

Media Services는 시스템 인증을 사용하여 스토리지 계정에 자동으로 액세스할 수 있습니다. Media Services는 연결을 추가하는 사용자가 Azure Resource Manager RBAC를 사용하여 스토리지 계정에 액세스했는지 확인합니다.

구독 간 스토리지 계정 사용

참고

Media Services가 관리 ID를 사용하여 스토리지에 액세스하도록 구성된 경우 Media Services는 관리 ID가 액세스할 수 있는 모든 스토리지 계정을 사용할 수 있습니다.

스토리지에 시스템 인증을 사용하는 경우 스토리지 계정은 Media Services 계정과 동일한 구독에 있어야 합니다. 추가 데이터 송신 비용이 발생하지 않도록 Media Services 계정과 동일한 지역에 있는 스토리지 계정을 사용합니다.

두 인증 유형 모두에 대해 Media Services 계정을 만들거나 업데이트하는 보안 주체에는 스토리지 계정에 대한 'Microsoft.Storage/storageAccounts/listkeys/action' 권한이 있어야 합니다.

개요

중요

Media Services에 대한 모든 요청에 2020-05-01 API를 사용합니다.

다음은 Media Services에 대해 신뢰할 수 있는 스토리지를 생성하기 위한 일반적인 단계입니다.

  1. 리소스 그룹을 만듭니다.
  2. 스토리지 계정을 만듭니다.
  3. 스토리지 계정이 준비될 때까지 폴링합니다. 스토리지 계정이 준비되면 요청에서 서비스 주체 ID를 반환합니다.
  4. Storage Blob 데이터 기여자 역할의 ID를 찾습니다.
  5. 권한 부여 공급자를 호출하고 역할 할당을 추가합니다.
  6. 관리 ID를 사용하여 스토리지 계정에 인증하도록 미디어 서비스 계정을 업데이트합니다.
  7. 리소스를 더 이상 사용하지 않고 요금이 청구되지 않도록 하려면 리소스를 삭제합니다.

사전 요구 사항

시작하려면 Azure 구독이 필요합니다. Azure 구독이 아직 없는 경우 평가판 계정을 만듭니다.

테넌트 ID 및 구독 ID 가져오기

테넌트 ID 및 구독 ID를 가져오는 방법을 모르는 경우 구독 및 테넌트 ID 찾는 방법을 참조하세요.

서비스 주체 및 비밀 만들기

서비스 주체 및 비밀을 만드는 방법을 모르는 경우 Media Services API에 액세스하기 위한 자격 증명 가져오기를 참조하세요.

REST 클라이언트 사용

이 스크립트는 Visual Studio 코드 확장에서 사용할 수 있는 것과 같은 REST 클라이언트와 함께 사용하기 위한 것입니다. 개발 환경에 맞게 조정합니다.

초기 변수 설정

이 스크립트 부분은 REST 클라이언트에서 사용됩니다. 개발 환경에서 변수를 다르게 사용할 수 있습니다.

### AAD details
@tenantId = your tenant ID
@servicePrincipalId = the service principal ID
@servicePrincipalSecret = the service principal secret

### AAD resources
@armResource = https%3A%2F%2Fmanagement.core.windows.net%2F
@graphResource = https%3A%2F%2Fgraph.windows.net%2F
@storageResource = https%3A%2F%2Fstorage.azure.com%2F

### Service endpoints
@armEndpoint = management.azure.com
@graphEndpoint = graph.windows.net
@aadEndpoint = login.microsoftonline.com

### ARM details
@subscription = your subscription id
@resourceGroup = the resource group you'll be creating
@storageName = the name of the storage you'll be creating
@accountName = the name of the account you'll be creating
@resourceLocation = East US (or the location that works best for your region)

Azure Resource Manager에 대한 토큰 가져오기

// @name getArmToken
POST https://{{aadEndpoint}}/{{tenantId}}/oauth2/token
Accept: application/json
Content-Type: application/x-www-form-urlencoded

resource={{armResource}}&client_id={{servicePrincipalId}}&client_secret={{servicePrincipalSecret}}&grant_type=client_credentials

Graph API에 대한 토큰 가져오기

이 스크립트 부분은 REST 클라이언트에서 사용됩니다. 개발 환경에서 변수를 다르게 사용할 수 있습니다.

// @name getGraphToken
POST https://{{aadEndpoint}}/{{tenantId}}/oauth2/token
Accept: application/json
Content-Type: application/x-www-form-urlencoded

resource={{graphResource}}&client_id={{servicePrincipalId}}&client_secret={{servicePrincipalSecret}}&grant_type=client_credentials

서비스 주체 세부 정보 가져오기

// @name getServicePrincipals
GET https://{{graphEndpoint}}/{{tenantId}}/servicePrincipals?$filter=appId%20eq%20'{{servicePrincipalId}}'&api-version=1.6
x-ms-client-request-id: cae3e4f7-17a0-476a-a05a-0dab934ba959
Authorization:  Bearer {{getGraphToken.response.body.access_token}}

서비스 주체 ID 저장

@servicePrincipalObjectId = {{getServicePrincipals.response.body.value[0].objectId}}

리소스 그룹 만들기

// @name createResourceGroup
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}
    ?api-version=2016-09-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
    "location": "{{resourceLocation}}"
}

스토리지 계정 만들기

// @name createStorageAccount
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}
    ?api-version=2019-06-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
    "sku": {
    "name": "Standard_GRS"
    },
    "kind": "StorageV2",
    "location": "{{resourceLocation}}",
    "properties": {
    }
}

스토리지 계정 상태 가져오기

스토리지 계정이 준비되는 데 시간이 좀 걸리므로 이 요청은 상태를 폴링합니다. 스토리지 계정이 준비될 때까지 이 요청을 반복합니다.

// @name getStorageAccountStatus
GET {{createStorageAccount.response.headers.Location}}
Authorization: Bearer {{getArmToken.response.body.access_token}}

스토리지 계정 세부 정보 가져오기

스토리지 계정이 준비되면 스토리지 계정의 속성을 가져옵니다.

// @name getStorageAccount
GET https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}
    ?api-version=2019-06-01
Authorization: Bearer {{getArmToken.response.body.access_token}}

ARM에 대한 토큰 가져오기

// @name getStorageToken
POST https://{{aadEndpoint}}/{{tenantId}}/oauth2/token
Accept: application/json
Content-Type: application/x-www-form-urlencoded

resource={{storageResource}}&client_id={{servicePrincipalId}}&client_secret={{servicePrincipalSecret}}&grant_type=client_credentials

시스템 할당 관리 ID를 사용하여 Media Services 계정 만들기

// @name createMediaServicesAccount
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Media/mediaservices/{{accountName}}?api-version=2020-05-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
  "identity": {
      "type": "SystemAssigned"
  },
  "properties": {
    "storageAccounts": [
      {
        "id": "{{getStorageAccountStatus.response.body.id}}"
      }
    ],
    "encryption": {
      "type": "SystemKey"
    }
  },
  "location": "{{resourceLocation}}"
}

스토리지 Storage Blob 데이터 역할 정의 가져오기

// @name getStorageBlobDataContributorRoleDefinition
GET https://management.azure.com/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}/providers/Microsoft.Authorization/roleDefinitions?$filter=roleName%20eq%20%27Storage%20Blob%20Data%20Contributor%27&api-version=2015-07-01
Authorization: Bearer {{getArmToken.response.body.access_token}}

스토리지 역할 할당 설정

역할 할당은 Media Services 계정에 대한 서비스 주체에게 Storage Blob 데이터 기여자 스토리지 역할 있음을 의미합니다. 이 작업은 시간이 걸릴 수 있으며 기다려야 합니다. 그렇지 않으면 Media Services 계정이 올바르게 설정되지 않습니다.

PUT https://management.azure.com/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}/providers/Microsoft.Authorization/roleAssignments/{{$guid}}?api-version=2020-04-01-preview
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
  "properties": {
    "roleDefinitionId": "/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}/providers/Microsoft.Authorization/roleDefinitions/{{getStorageBlobDataContributorRoleDefinition.response.body.value[0].name}}",
    "principalId": "{{createMediaServicesAccount.response.body.identity.principalId}}"
  }
}

스토리지 계정에 관리 ID 바이패스 액세스 권한 부여

이 작업은 시스템 관리 ID에서 관리 ID로의 액세스를 변경합니다. 이러한 방식으로 Azure 서비스가 IP 액세스 규칙(ACL)에 관계없이 스토리지 계정에 액세스할 수 있으므로 스토리지 계정은 방화벽을 통해 스토리지 계정에 액세스할 수 있습니다.

다시 말하지만 스토리지 계정에 역할이 할당될 때까지 기다리세요. 그렇지 않으면 Media Services 계정이 잘못 설정됩니다.

// @name setStorageAccountFirewall
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}
    ?api-version=2019-06-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
    "sku": {
    "name": "Standard_GRS"
    },
    "kind": "StorageV2",
    "location": "{{resourceLocation}}",
    "properties": {
      "minimumTlsVersion": "TLS1_2",
      "networkAcls": {
        "bypass": "AzureServices",
        "virtualNetworkRules": [],
        "ipRules": [],
        "defaultAction": "Deny"
      }
    }
}

관리 ID를 사용하도록 Media Services 계정 업데이트

스토리지 역할 할당이 전파되는 데 몇 분 정도 걸릴 수 있으므로 이 요청을 몇 번 재시도해야 할 수 있습니다.

// @name updateMediaServicesAccountWithManagedStorageAuth
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Media/mediaservices/{{accountName}}?api-version=2020-05-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
  "identity": {
      "type": "SystemAssigned"
  },
  "properties": {
    "storageAccounts": [
      {
        "id": "{{getStorageAccountStatus.response.body.id}}"
      }
    ],
    "storageAuthentication": "ManagedIdentity",
    "encryption": {
      "type": "SystemKey"
    }
  },
  "location": "{{resourceLocation}}"
}

액세스 테스트

스토리지 계정에서 자산을 만들어 액세스를 테스트합니다.

// @name createAsset
PUT https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Media/mediaservices/{{accountName}}/assets/testasset{{index}}withoutmi?api-version=2018-07-01
Authorization: Bearer {{getArmToken.response.body.access_token}}
Content-Type: application/json; charset=utf-8

{
}

리소스 삭제

만든 리소스를 더 이상 유지하지 않고 요금이 계속 청구되지 않도록 하려면 해당 리소스를 삭제합니다.

### Clean up the Storage account
DELETE https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Storage/storageAccounts/{{storageName}}
    ?api-version=2019-06-01
Authorization: Bearer {{getArmToken.response.body.access_token}}

### Clean up the Media Services account
DELETE https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Media/mediaservices/{{accountName}}?api-version=2020-05-01
Authorization: Bearer {{getArmToken.response.body.access_token}}

### Clean up the Media Services account
GET https://{{armEndpoint}}/subscriptions/{{subscription}}/resourceGroups/{{resourceGroup}}/providers/Microsoft.Media/mediaservices/{{accountName}}?api-version=2020-05-01
Authorization: Bearer {{getArmToken.response.body.access_token}}

도움말 및 지원 보기

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