python - 在 Python 中并发 set_secret 调用 Azure KeyVault API
问题描述
我有一个 python 脚本,它当前将秘密字符串写入 Azure KeyVault。如果列表很小,这很有效,但我有 4000+ KVs 要写入,每次管道运行需要 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#,所以我无法翻译我看到的任何异步方法。关于我应该如何处理这个欢迎的任何想法。特别是在实例化多个客户端对象时。
解决方案
现在有用于在 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)
推荐阅读
- android - I'm wondering why I have to write "private" from SUPER NEW
- c++ - invalid use of member ‘xx::x’ in static member function
- java - 如何从 keycloak programmaticaly (Spring) 通过不记名令牌获取用户名和 uuid?
- elasticsearch - kubernetes fluentd 如何排除 liveness、readiness/health check 和 fluent.trace?
- julia - 推入朱莉娅的意外行为
- token - 我需要帮助来构建具有 Solidity 5.0 或更高版本的 ERC-721 合同
- c# - 如何在 C# 中将数据写入 android 文件?
- firebase - Is it possible to mock an authenticated Firebase user, in order to run full testing with jest, while preserving the database rules?
- sql - Custom ordering before regular ordering?
- c# - 在随机猜谜游戏中反击