Параллельные вызовы set_secret для API Azure KeyVault в Python - PullRequest
0 голосов
/ 09 мая 2019

У меня есть скрипт на python, который в настоящее время записывает секретные строки в Azure KeyVault.Это хорошо работает, если список небольшой, но у меня есть 4000+ KV для записи, и это занимает 50 минут каждый раз, когда запускается конвейер.

Я использую библиотеку следующим образом:

from azure.keyvault import KeyVaultClient, KeyVaultAuthentication, KeyVaultId
from azure.common.credentials import ServicePrincipalCredentials

def auth_callback(server, resource, scope):
...

client = KeyVaultClient(KeyVaultAuthentication(auth_callback))
data = sys.stdin.read()
if data:
    print('Writing outputs to keyvault '+kvURL)
    outputs = json.loads(data)
    n = 0
    for op in outputs.items():
        key = baseEnv + '-' + baseFunction + '-' + op[0]
        key = key.replace('_', '-')
        val = str(op[1]['value'])
        print('Storing: ' + key + ' = ' + val)
        try:
            secret_bundle = client.set_secret(kvURL, key, val)
        except:
            print('err in key'+key)
            exit(os.EX_SOFTWARE)
            n += 1
    print(str(n)+' secrets written.')
else:
    print('OK nothing to do.')

Поскольку сценарию просто необходимо выполнять параллельные вызовы API, мне явно не требуется многопроцессорная обработка или параллелизм потоков, а только асинхронный способ создания экземпляра объекта client.

docs мне не очень помогает, и я не знаю никакого c #, поэтому я не могу перевести любые асинхронные методы, которые я вижу.Любая идея о том, как я должен подходить к этому приветствию.Особенно в отношении создания нескольких клиентских объектов.

1 Ответ

0 голосов
/ 28 мая 2019

Как я знаю, почти все API Azure SDK упакованы в соответствующие API REST. Поэтому после того, как я рассмотрел API-интерфейсы REST Azure KeyVault, API не поддерживает массовую установку секретов только в одном запросе.

Следовательно, единственное решение, позволяющее сократить временные затраты на запуск вашего скрипта, - это сделать его распараллеливание с помощью multiprocessing или сторонних пакетов в Python.

Вот два способа, которые я рекомендовал.

  1. Следуйте первому примеру кода multiprocessing, чтобы запустить его параллельно с помощью процесса Pool, например, ниже

    from multiprocessing import Pool
    
    def setSecret(op):
        key = baseEnv + '-' + baseFunction + '-' + op[0]
        key = key.replace('_', '-')
        val = str(op[1]['value'])
        print('Storing: ' + key + ' = ' + val)
        ret = (key, 1)
        try:
            secret_bundle = client.set_secret(kvURL, key, val)
        except:
            print('err in key'+key)
            ret = (key, 0)
        return ret
    
    if __name__=='__main__':
        proc_num = 100
        with Pool(proc_num) as p:
            rets = p.map(setSecret, outputs.items())
        n_successed = sum([ok for _, ok in rets])
    
  2. Вы можете обратиться к блогу Простые параллельные HTTP-запросы с Python и asyncio , чтобы переписать ваш код для прямого вызова REST API Установить секрет - Установить секрет и запустить одновременно .

Надеюсь, это поможет.

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