У меня есть python веб-приложение, развернутое в службе приложений Azure и использующее его идентификатор управляемой службы (MSI), получает токен и подключается к Azure SQL БД.
Все работает хорошо, и я обновляю sh токены до истечения 8 часов. Однако периодически (кажется, примерно раз в 10 дней) база данных становится недоступной, и в журналах появляется ошибка:
pyodbc.InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)")
Текущее исправление - перезапуск службы приложений.
Я думаю о причине, как я получаю токен, используя следующий код:
msi_enpoint = environ.get("MSI_ENDPOINT")
msi_secret = environ.get("MSI_SECRET")
token_auth_uri = f"{msi_endpoint}?resource={resource_uri}&api-version={token_api_version}"
head_msi = {'Secret': msi_secret}
resp = requests.get(token_auth_uri, headers=head_msi)
access_token = resp.json()['access_token']
И следующую строку из MSFT docs
MSI_SECRET - a заголовок, используемый для смягчения атак подделки запросов на стороне сервера (SSRF). Значение поворачивается платформой .
Если значение поворачивается во время работы приложения, то в следующий раз, когда приложение попытается получить токен, старый MSI_SECRET
будет по-прежнему переменной среды и недействительными учетными данными для получения токена, и, следовательно, будет вызывать последующий сбой при входе в базу данных.
Это кажется правильным? Как мы могли преодолеть эту проблему, так как запланированный перезапуск приложения все еще мог пропустить поворот MSI_SECRET
?