繁体   English   中英

在 Python 中并发 set_secret 调用 Azure KeyVault API

[英]Concurrent set_secret calls to Azure KeyVault API in Python

我有一个 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 进行并发调用,因此我并不明确需要多处理或线程并发,只是一种实例化客户端对象的异步方式。

这些文档对我帮助不大,而且我不知道任何 c#,所以我无法翻译我看到的任何异步方法。 我应该如何处理这个欢迎的任何想法。 特别是在实例化多个客户端对象方面。

据我所知,几乎所有 Azure SDK API 都封装了相关的 REST API。 因此,在我查看 Azure KeyVault REST API 之后,没有一个 API 支持仅在一个请求中批量设置机密。

因此,减少运行脚本的时间成本的唯一解决方案是通过 Python 中的multiprocessing或第三方包使其并行化。

这是我推荐的两种方法。

  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. 可以参考博客Easy parallel HTTP requests with Python and asyncio重写你的代码,直接调用REST API Set Secret - Set Secret并发运行。

希望能帮助到你。

现在有用于在 Python 中使用 Key Vault 的新包来替换azure-keyvault ,每个包都支持异步操作,使并发调用更加简单:

azure-identity也是应该与这些一起用于身份验证的包。

秘密包 README 中有异步创建秘密的文档; 这是一个示例,说明如何将异步客户端用于您的用例(为了可读性简化了一些位),使用asyncio 的gather方法

import asyncio
from azure.identity.aio import DefaultAzureCredential
from azure.keyvault.secrets.aio import SecretClient

kvURL = "https://{vault-name}.vault.azure.net"
credential = DefaultAzureCredential()
client = SecretClient(kvURL, credential)

async def set_secrets():
    async with client:
        data = sys.stdin.read()
        if data:
            print("Writing outputs to keyvault " + kvURL)
            outputs = json.loads(data)
            n = 0
            coroutines = []
            for op in outputs.items():
                key = "secret" + str(n)
                val = "value"
                print('Storing: ' + key + ' = ' + val)
                try:
                    coroutines.append(client.set_secret(key, val))
                except:
                    print("err in key " + key)
                    exit(os.EX_SOFTWARE)
            return await asyncio.gather(*coroutines)
        else:
            print("OK nothing to do.")

loop = asyncio.get_event_loop()
results = loop.run_until_complete(set_secrets())
loop.close()
print(results)  # prints a list of secrets created

(我使用 Python 开发 Azure SDK)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM