-1

我正在尝试创建一个简单的脚本,列出我的 Azure 美国政府帐户上的虚拟机。但是,我面临这个错误:

azure.core.exceptions.ClientAuthenticationError: DefaultAzureCredential failed to retrieve a token from the included credentials.
Attempted credentials:
    VisualStudioCodeCredential: Azure Active Directory error '(invalid_scope) AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid. The scope https://management.azure.com/.default https://management.core.usgovcloudapi.net/.default is not valid. static scope limit exceeded.

这是我使用的代码:

def get_access_to_virtual_machine():
    subscription_id = key.SUBSCRIPTION_ID
    credentials = DefaultAzureCredential(authority = AZURE_US_GOV_CLOUD.endpoints.active_directory, 
                                        tenant_id = key.TENANT_ID,
                                        exclude_environment_credential = True,
                                        exclude_managed_identity_credential = True,
                                        exclude_shared_token_cache_credential = True)               
    compute_client = ComputeManagementClient(credential = credentials, 
                                            subscription_id = subscription_id, 
                                            base_url = AZURE_US_GOV_CLOUD.endpoints.resource_manager,
                                            credential_scopes = [AZURE_US_GOV_CLOUD.endpoints.active_directory_resource_id + '.default'])
    return compute_client

def get_azure_vm(resource_group_name, virtual_machine_name):
    compute_client = get_access_to_virtual_machine()
    vm_data = compute_client.virtual_machines.get(resource_group_name, 
                                                virtual_machine_name, 
                                                expand = 'instanceView')
    return vm_data

我也使用 Visual Studio 登录了我的 Azure 美国政府帐户。错误源于compute_client.virtual_machines.get()命令。我 100% 确定我使用的凭据是正确的,但我真的坚持这一点。我尝试过使用ClientSecretCredential而不是DefaultAzureCredential遇到相同的ClientAuthenticationError. 另外,我不确定scope错误提到的这个参数应该在哪里传递。

4

2 回答 2

0

对于 Azure 订阅管理,范围应该是{management-endpoint}/user_impersonation而不是{management-endpoint}/.default. 例如,在 Azure Commercial 中,范围将为https://management.azure.com/user_impersonation.

我不是 100% 确定,但 Azure 政府的管理端点是https://management.usgovcloudapi.net/或者https://management.core.usgovcloudapi.net/. 根据正确的端点,您的范围值应该是https://management.usgovcloudapi.net/user_impersonationhttps://management.core.usgovcloudapi.net/user_impersonation

请尝试通过更改它。

更新

查看 GitHub 问题here,似乎 SDK 本身存在问题。请尝试提出的解决方案here

于 2021-06-09T04:15:16.350 回答
0

不确定您拥有哪个版本的 Python SDK,但我能够加载最新的模块并获取以下代码以在 Azure 美国政府云中运行并拉回 VM 数据:

import os
from msrestazure.azure_cloud import AZURE_US_GOV_CLOUD as CLOUD
from azure.mgmt.compute import ComputeManagementClient
from azure.identity import DefaultAzureCredential

subscription_id = 'xxx-xxx-xxx-xxxx'
tenant_id = 'xxxx-xxxx-xxxx-xxxx'
resource_group_name = 'rgName'
vm_name = 'vmName'

credential = DefaultAzureCredential(
    authority=CLOUD.endpoints.active_directory, 
    tenant_id=tenant_id)

compute_client = ComputeManagementClient(
    credential, subscription_id, 
    base_url=CLOUD.endpoints.resource_manager,
    credential_scopes=[CLOUD.endpoints.resource_manager + '/.default'])

vm_data = compute_client.virtual_machines.get(
    resource_group_name, 
    vm_name, 
    expand = 'instanceView')

print(f"{vm_data.name}")

需要注意的一些事项:

  • 您将一些身份验证方法设置为排除,您可能希望确保不排除您期望的方法
  • 最新的SDK在导入中设置环境,我将其设置为“CLOUD”,这样只需更改导入语句即可将相同的代码用于各种云
  • 最新的 SDK 似乎确实希望将 '/.default' 作为 credential_scopes 的一部分
于 2021-06-09T18:42:45.013 回答