Как заставить аутентификацию токенов SQL работать в Runbook Azure Python 3?

#python #sql-server #python-3.x #azure #azure-automation

Вопрос:

У меня есть скрипт Python 3 в Runbook Azure, который мне нужно подключить к базе данных SQL Server Azure с помощью проверки подлинности токенов.

Проблема в том, что {Драйвер ODBC 17 для SQL Server} не предустановлен на машине Azure, над которой мы не имеем никакого контроля. Я попытался посмотреть, смогу ли я принудительно установить {драйвер ODBC 17 для SQL Server} в поле с помощью os.system («msiexec»), но это не сработало, так как не удалось получить доступ к службе установщика Windows.

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

Есть ли обходной путь для этого?

Если кому-то интересно, это мой код…

  #!/usr/bin/env python3
    
 import adal
 from msrestazure.azure_active_directory import AADTokenCredentials
 import pyodbc
 import struct
    
 resource = "x"
 tenant = "x"
 authorityHostUrl = "https://login.microsoftonline.com"
 clientId = "x"
 clientSecret = "x"
 authority_uri = authorityHostUrl   '/'   tenant
 resource_uri = 'https://database.windows.net/'
    
 context = adal.AuthenticationContext(authority_uri, api_version=None)
 mgmt_token = context.acquire_token_with_client_credentials(resource_uri, clientId, clientSecret)
 token = mgmt_token["accessToken"]
    
 SQL_COPT_SS_ACCESS_TOKEN = 1256 
 driver = "{ODBC Driver 17 for SQL Server}"
 server = "x.database.windows.net"
 database = "x"
 connString = "DRIVER="   driver   ";SERVER="   server   ";DATABASE="   database  ";Trusted_Connection=False;Encrypt=True;Integrated Security=False;"
    
 tokenb = bytes(token, "UTF-8")
 exptoken = b''
 for i in tokenb:
     exptoken  = bytes({i})
     exptoken  = bytes(1)
 tokenstruct = struct.pack("=i", len(exptoken))   exptoken
    
 conn = pyodbc.connect(connString, attrs_before = {SQL_COPT_SS_ACCESS_TOKEN:tokenstruct})
    
 cursor = conn.cursor()
 cursor.execute("SELECT TOP (5) * FROM Reference")
 row = cursor.fetchone()
    
 for i in row:
     print(i)
 

Ответ №1:

В вашем случае я бы рекомендовал вам настроить гибридную рабочую группу, импортировать все необходимые модули в HWR и выполнить на ней свой runbook. Для получения дополнительной информации о гибридных рабочих группах обратитесь к этому документу.

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

1. Я понимаю это, но если мне придется управлять своей собственной инфраструктурой для запуска сценария, это как бы противоречит цели использования Runbook Azure. Для меня проблема больше связана с тем, что драйвер устарел на виртуальной машине, размещенной в Azure.