Проверка подлинности Azure python sdk с помощью сертификата зависает

#python #azure #azure-authentication #azure-sdk-python #azure-gov

Вопрос:

Я пытаюсь пройти аутентификацию с помощью python SDK для извлечения данных виртуальной сети Azure.

В качестве первого шага для проверки того, что я могу аутентифицировать, я пытаюсь использовать клиент подписки для составления списка подписок. Я создаю учетные данные сертификата для использования для аутентификации.

Когда я звоню, чтобы перечислить подписки от клиента подписки, вызов зависает, по-видимому, на неопределенный срок без возвращенной ошибки. Я пытаюсь аутентифицироваться на azure_gov. Вот код:

 import logging
import os
import boto3
from msrestazure.azure_cloud import AZURE_US_GOV_CLOUD as CLOUD
from azure.identity import CertificateCredential
from azure.mgmt.subscription import SubscriptionClient

# Setup logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logging.basicConfig(level=logging.INFO)

# Constants
CERT_PATH = '/tmp/cert.pem'
AZURE_CERT_PATH = '/tmp/cert.pem'
AZURE_TENANT_ID = os.environ['AZURE_TENANT_ID']
AZURE_CLIENT_ID = os.environ['AZURE_CLIENT_ID']
AZURE_SDK_S3_BUCKET = os.environ['AZURE_SDK_S3_BUCKET']

s3 = boto3.client('s3')
s3.download_file(AZURE_SDK_S3_BUCKET, 'certs/cert.pem', CERT_PATH)

# Setup Azure credentials
credential = CertificateCredential(
   tenant_id=AZURE_TENANT_ID, 
   client_id=AZURE_CLIENT_ID, 
   certificate_path=AZURE_CERT_PATH, 
   authority=CLOUD.endpoints.active_directory)

logger.info(f'tenant_id  = {AZURE_TENANT_ID}, client_id = {AZURE_CLIENT_ID}')
logger.info(f'CLOUD: {CLOUD}')

sub_client = SubscriptionClient(
   credential=credential, 
   base_url=CLOUD.endpoints.resource_manager)
        
#Code times out here
subscription = next(sub_client.subscriptions.list())
logger.info(f'Fetched subscription {subscription.subscription_id}') 
 

Я несколько раз проверял, что все cert tenant_id , и client_id все совпадают с тем, что я вижу в active directory.

Я нашел следующие сообщения от Microsoft: первое сообщение и второе сообщение, которые оба используют azure.mgmt.resource SubscriptionClient , что дает no attribute 'signed_session' CertificateCredential при попытке использовать a CertificateCredential для настройки клиента.

Я нашел следующий адаптер для использования CertificateCredential класса с этим клиентом и попытался использовать его, но он также выдает мне ту же проблему с таймаутом при следующем вызове(sub_client.subscriptions.list).

Редактировать:

Я все еще вижу проблемы с этим, когда время ожидания полностью истекает после максимального количества повторных попыток, я получаю следующую ошибку:

Попытка проверки учетных данных:

Данные среды: Не удалось выполнить проверку подлинности: Объект HTTPSConnection в 0x7fad94f116d8>: Не удалось установить новое соединение: [Ошибка 110] Время ожидания соединения истекло

Я не думаю, что это проблема среды, так как я могу войти в Azure CLI из того же экземпляра.

Комментарии:

1. «нет атрибута «signed_session»» означает, что вы используете старый ресурс azure-mgmt. Чтобы azure-identity работала, вам нужна как минимум версия 15.0.0 (последняя версия, тем лучше). В случае сомнений, пожалуйста, создайте проблему github.com/Azure/azure-sdk-for-python/issues

2. Это устраняет проблему, которую я видел с «без атрибута» signed_session»», так что спасибо, но я все еще вижу, что соединение просто зависает, и я не уверен, почему.