Подключение к Azure SQL БД из Azure Службы приложений с MSI периодически прерывается - PullRequest
1 голос
/ 23 января 2020

У меня есть 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...