教學課程:媒體服務受信任的儲存體
警告
Azure 媒體服務將於 2024 年 6 月 30 日淘汰。 如需詳細資訊,請參閱 AMS淘汰指南。
在本教學課程中,您將了解:
- 如何啟用 Azure 媒體服務的受信任的儲存體
- 如何針對受信任的儲存體使用受控識別
- 如何在使用防火牆或 VPN 之類的網路存取控制時,為 Azure 服務提供儲存體帳戶的存取權
透過 2020-05-01 API,您可以將受控識別與媒體服務帳戶建立關聯,以啟用受信任的儲存體。
注意
受信任的儲存體只能在 API 中使用,而且目前未在 Azure 入口網站中啟用。
媒體服務可以使用系統驗證自動存取您的儲存體帳戶。 媒體服務會驗證新增關聯的使用者是否具有 Azure Resource Manager RBAC 的記憶體帳戶存取權。
跨訂用帳戶記憶體帳戶的使用方式
注意
當媒體服務設定為使用受控識別來存取記憶體時,媒體服務可以使用受控識別可以存取的任何記憶體帳戶。
使用系統驗證記憶體時,記憶體帳戶必須與媒體服務帳戶位於相同的訂用帳戶中。 使用與媒體服務帳戶位於相同區域中的記憶體帳戶,以避免額外的數據輸出成本。
針對這兩種驗證類型,建立或更新媒體服務帳戶的主體必須具有記憶體帳戶的 'Microsoft.Storage/storageAccounts/listkeys/action' 許可權。
概觀
重要
針對對媒體服務的所有要求,請使用 2020-05-01 API。
以下是針對媒體服務建立受信任的儲存體的一般步驟:
- 建立資源群組。
- 建立儲存體帳戶。
- 輪詢儲存體帳戶,直到其準備就緒為止。 當儲存體帳戶準備就緒時,要求會傳回服務主體識別碼。
- 尋找「儲存體 Blob 資料參與者」角色的識別碼。
- 呼叫授權提供者並新增角色指派。
- 更新媒體服務帳戶,以使用受控識別向儲存體帳戶進行驗證。
- 如果您不想繼續使用資源並支付費用,請刪除資源。
先決條件
您需要 Azure 訂用帳戶才能開始進行。 如果您沒有 Azure 訂用帳戶,請建立免費試用帳戶。
取得您的租用戶識別碼和訂用帳戶識別碼
如果您不知道如何取得租使用者標識碼和訂用帳戶標識碼,請參閱 如何尋找您的訂用帳戶和租使用者標識符。
建立服務主體和祕密
如果您不知道如何建立服務主體和祕密,請參閱取得認證以存取媒體服務 API。
使用 REST 用戶端
此指令碼適用於 REST 用戶端,例如 Visual Studio 程式碼延伸模組中所提供的內容。 針對您的開發環境加以調整。
設定初始變數
指令碼的這個部分是用於 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
取得適用於圖形 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}}
儲存服務主體識別碼
@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
建立具有系統指派的受控識別的媒體服務帳戶
// @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}}"
}
取得儲存體「儲存體 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}}
設定儲存體角色指派
角色指派指出媒體服務帳戶的服務主體具有儲存體角色「儲存體 Blob 資料參與者」。 這可能需要一段時間,也請您請務必等候,否則媒體服務帳戶將無法正確設定。
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}}"
}
}
授與受控識別針對儲存體帳戶的略過存取權
此動作會將系統受控識別的存取權變更為受控識別。 如此一來,儲存體帳戶就可以透過防火牆存取儲存體帳戶,因為不論 IP 存取規則 (ACL) 為何,Azure 服務都可以存取儲存體帳戶。
同樣地,請等到角色已在儲存體帳戶中指派,否則媒體服務帳戶將無法正確設定。
// @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"
}
}
}
更新媒體服務帳戶以使用受控識別
此要求可能需要重試數次,因為儲存體角色指派可能需要幾分鐘的時間才能傳播。
// @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}}
取得說明及支援
您可以連絡媒體服務並提出問題,或遵循下列其中一種方法來追蹤我們的更新:
- 問與答
-
Stack Overflow。 使用
azure-media-services
標記問題。 - @MSFTAzureMedia 或使用 @AzureSupport 來要求支援。
- 透過 Azure 入口網站 開啟支援票證。