显示错误消息的 Azure CLI 密钥保管库恢复 - 它有重试策略吗?

Azure CLI key vault recovery showing error messages - does it have a retry strategy?

我有一个 Azure CLI 脚本,用于将机密从参考密钥保管库复制到另一个密钥保管库。由于此脚本将 运行 多次,因此它会检查每个密钥是否已被软删除,如果是,则将恢复此版本。

然后检查新恢复的键的值以确定它是否需要更新。

write-host Recovering a soft-deleted secret for $secretName
az keyvault secret recover --name "$secretName" --vault-name $keyVaultName

if ((az keyvault secret show --name "$secretName" --vault-name $keyVaultName --output json | convertfrom-json | select-object value).value -eq "$secretValue"){
    write-host The recovered secret has the correct value for $secretName
}

当第一条指令恢复了一个秘密而第二条指令要求这个秘密(比较它的值)时出现问题:

ResourceNotFoundError: (SecretNotFound) A secret with (name/id) [...] was not found in this key vault. If you recently deleted this secret you may be able to recover it using the correct recovery command. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125182

这有时会出现多次。

但是,接下来是...

The recovered secret has the correct value for [...]

...给我的印象是 show 命令具有某种内置的重试策略,尽管我找不到任何相关文档。

我也试过将 show 命令放在 try/catch 中,但没有发现任何错误。

我希望脚本 运行 没有任何错误 - 任何人都可以告诉我如何正确处理这个恢复然后检索过程而不会产生任何错误,即使脚本以某种方式继续并最终检查值成功?


更新:

我能够通过从 recover 命令捕获秘密来解决这个问题...

$recoveredSecret = (az keyvault secret recover --name "$secretName" --vault-name $keyVaultName --output json --only-show-errors | convertfrom-json | select-object value)

if ($recoveredSecret.value -eq $secretValue){
    write-host The recovered secret has the correct value for $secretName
}

但我还是想知道为什么 show 命令失败然后似乎要重试。

Azure CLI key vault recovery showing error messages - does it have a retry strategy?

我可以在我这边重现这个问题。

那是因为recover命令需要一定的时间来恢复secret。

发送recover命令后,Powershell会不等待recover命令完成,直接执行下一条命令。但是,后台需要一些时间来执行恢复命令。但是如果我们在recovery命令后立即使用show命令,就会遇到这个错误,因为后台recover操作可能还没有完成。

这就是这个问题有时会多次出现的原因。

要解决这个问题,我们只需要在recovery命令后添加一个sleep命令:

az keyvault secret recover --name "$secretName" --vault-name "$keyVaultName"

Start-sleep -Seconds 30

if ((az keyvault secret show --name "$secretName" --vault-name "$keyVaultName" --output json | convertfrom-json | select-object value).value -eq "$secretValue"){
    write-host The recovered secret has the correct value for $secretName
}