迁移 Python ADAL 自定义指标 Azure 函数以支持托管标识
Migrate Python ADAL Custom Metrics Azure Function to support Managed Identity
我有一个 Python 函数使用预览选项发送自定义指标到 Azure 使用 REST API https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-store-custom-rest-api,以前这是一个 C# 函数,其中授权和获取承载令牌由以下人员自动处理:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string bearerToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://monitoring.azure.com/").ConfigureAwait(false);
这在使用登录用户的 VS Code 中以及在将托管标识分配给函数时在 Azure 中起作用。
我需要将其转换为 Python 但到目前为止,我能想到的最好的(工作)是:
import logging, requests, os, adal
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
regional_monitoring_url = "https://eastus.monitoring.azure.com"
monitored_resource_id = os.environ['RESOURCE_ID']
full_endpoint = f"{regional_monitoring_url}{monitored_resource_id}/metrics"
tenant_id = os.environ['AZURE_TENANT_ID']
context = adal.AuthenticationContext(f'https://login.microsoftonline.com/{tenant_id}')
token = context.acquire_token_with_client_credentials("https://monitoring.azure.com/", os.environ['AZURE_CLIENT_ID'], os.environ['AZURE_CLIENT_SECRET'] )
bearer_token = token['accessToken']
json = req.get_json()
headers = {"Authorization": 'Bearer ' + bearer_token}
result = requests.post(url = full_endpoint, headers = headers, json = json)
return func.HttpResponse(f"Done - {result.status_code} {result.text}", status_code=200)
这显然依赖于我创建具有相关权限的服务主体。我正在尝试弄清楚如何使用 C# 库拥有的自动托管身份授权。
我知道 ADAL 应该被 MSAL 取代,但我无法解决 how/if 自动处理托管身份的问题,所以我尝试了 azure-identity:
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
token = credential.get_token("https://monitoring.azure.com/.default")
bearer_token = token.token
这给了我一个令牌,但因为它需要一个范围而不是资源,这意味着将 .default 添加到资源 URL,当我将承载令牌发送到监视端点时,它抱怨资源没有'匹配并且必须完全是“https://monitoring.azure.com/”
目前这是不可能的,还是我遗漏了 azure-identity 或 MSAL Python 模块的某些内容?
根据我的研究,当我们请求 Azure AD 令牌发出自定义指标时,请确保请求令牌的受众是 https://monitoring.azure.com/. For more details, please refer to here。所以我们应该将范围更新为 https://monitoring.azure.com//.default
例如
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
credential = DefaultAzureCredential()
token = credential.get_token("https://monitoring.azure.com//.default")
bearer_token = token.token
#full_endpoint=""
json = req.get_json()
headers = {"Authorization": 'Bearer ' + bearer_token}
#result = requests.post(url = full_endpoint, headers = headers, json = json)
return func.HttpResponse(f"Done - {bearer_token}", status_code=200)
我有一个 Python 函数使用预览选项发送自定义指标到 Azure 使用 REST API https://docs.microsoft.com/en-us/azure/azure-monitor/platform/metrics-store-custom-rest-api,以前这是一个 C# 函数,其中授权和获取承载令牌由以下人员自动处理:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string bearerToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://monitoring.azure.com/").ConfigureAwait(false);
这在使用登录用户的 VS Code 中以及在将托管标识分配给函数时在 Azure 中起作用。
我需要将其转换为 Python 但到目前为止,我能想到的最好的(工作)是:
import logging, requests, os, adal
import azure.functions as func
def main(req: func.HttpRequest) -> func.HttpResponse:
regional_monitoring_url = "https://eastus.monitoring.azure.com"
monitored_resource_id = os.environ['RESOURCE_ID']
full_endpoint = f"{regional_monitoring_url}{monitored_resource_id}/metrics"
tenant_id = os.environ['AZURE_TENANT_ID']
context = adal.AuthenticationContext(f'https://login.microsoftonline.com/{tenant_id}')
token = context.acquire_token_with_client_credentials("https://monitoring.azure.com/", os.environ['AZURE_CLIENT_ID'], os.environ['AZURE_CLIENT_SECRET'] )
bearer_token = token['accessToken']
json = req.get_json()
headers = {"Authorization": 'Bearer ' + bearer_token}
result = requests.post(url = full_endpoint, headers = headers, json = json)
return func.HttpResponse(f"Done - {result.status_code} {result.text}", status_code=200)
这显然依赖于我创建具有相关权限的服务主体。我正在尝试弄清楚如何使用 C# 库拥有的自动托管身份授权。
我知道 ADAL 应该被 MSAL 取代,但我无法解决 how/if 自动处理托管身份的问题,所以我尝试了 azure-identity:
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
token = credential.get_token("https://monitoring.azure.com/.default")
bearer_token = token.token
这给了我一个令牌,但因为它需要一个范围而不是资源,这意味着将 .default 添加到资源 URL,当我将承载令牌发送到监视端点时,它抱怨资源没有'匹配并且必须完全是“https://monitoring.azure.com/”
目前这是不可能的,还是我遗漏了 azure-identity 或 MSAL Python 模块的某些内容?
根据我的研究,当我们请求 Azure AD 令牌发出自定义指标时,请确保请求令牌的受众是 https://monitoring.azure.com/. For more details, please refer to here。所以我们应该将范围更新为 https://monitoring.azure.com//.default
例如
def main(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
credential = DefaultAzureCredential()
token = credential.get_token("https://monitoring.azure.com//.default")
bearer_token = token.token
#full_endpoint=""
json = req.get_json()
headers = {"Authorization": 'Bearer ' + bearer_token}
#result = requests.post(url = full_endpoint, headers = headers, json = json)
return func.HttpResponse(f"Done - {bearer_token}", status_code=200)