如何在 Azure 机器学习服务管道中使用密钥

Posted

技术标签:

【中文标题】如何在 Azure 机器学习服务管道中使用密钥【英文标题】:How to use secret keys in Azure Machine Learning Service pipelines 【发布时间】:2019-06-04 04:18:39 【问题描述】:

我正在使用 Azure 机器学习服务和 pipeline functionality 对我的机器学习模型进行数据准备、训练和测试。但是,在我的数据准备步骤中,我需要连接到数据库,并且我想找到一种方法来传递我的秘密密码或密钥,而无需将它们以纯文本形式写入我的脚本文件中。

在本地,我使用环境变量来使用秘密密码和密钥,但据我所知,这在管道基础设施中是不可能的,因为 Conda 不支持传递环境变量。如果有人可以确认或否认这一点,那将很有帮助。

在 Azure 门户的 Azure 机器学习服务中,我找到了一个“密钥库”资源,它是在我创建“机器学习服务工作区”资源时自动创建的。这似乎正是我所需要的。是吗?如果是这样,我该如何使用它?

如果以上都不能解决我的问题,有没有其他方法可以安全地在我的脚本中使用秘密密码和密钥,而不用在脚本中以纯文本形式编写它们?

编辑:我意识到我的问题非常关注数据库连接。但是,问题实际上是关于任何类型的秘密或密码,而不仅仅是数据库凭据。正如答案中所指出的,这里可能值得一提的是,Azure SQL 数据库连接可以(并且应该)使用DataTransferStep 来解决。

【问题讨论】:

【参考方案1】:

您使用什么样的数据库?如果是 Azure SQL,则可以使用 DataTransferStep 而不是传递机密。相关类是:

DataTransferStep

DataReference

AzureSqlDataBaseDataStore

【讨论】:

谢谢。我也许应该更清楚这一点。然而,我的问题比数据库凭据更广泛,所以它仍然是一个悬而未决的问题。 有道理。我提交了一项功能请求以支持远程运行中的机密。【参考方案2】:

您可以通过 argumentsparameter 传递凭据,而不是使用环境变量:

pipeline_step = PythonScriptStep(
    script_name='train.py',
    arguments=['--keyvault_name', 'MyKV', '--secret_name', 'MyPW'], ...

并在train.py中定义脚本参数如下:

parser = argparse.ArgumentParser('train')
parser.add_argument('--keyvault_name')
parser.add_argument('--secret_name')
args = parser.parse_args()

然后您可以在脚本中使用变量args.keyvault_nameargs.secret_name。您可以使用这些值从 Key Vault 读取密码。当然,您必须首先创建 Key Vault 并将密码存储在那里。此外,您还必须确保 AML Workspace 具有从 Key Vault 读取机密的权限。

当然,您也可以在脚本参数中以纯文本形式传递密码,但这是不可取的。

【讨论】:

这可能是一个可行的解决方案。我还没有真正考虑过。但是,我还不知道如何激活 Key Vault。与工作区一起创建了一个,但我无法弄清楚如何使用它。【参考方案3】:

从 Azure ML SDK 版本 1.0.57 开始,现在支持通过 azureml.core.keyvault.KeyVault 对象将机密传递给远程运行:

请参阅在远程运行中使用机密部分in this notebook

【讨论】:

太棒了。我希望我能在那里尝试一下,但不幸的是我不再使用 Azure。不过,我希望我不是唯一一个等待秘密支持的人。 由于我自己无法尝试,因此将您的答案标记为解决方案让我感到不舒服。也许任何第二意见可以帮助我感到舒服?

以上是关于如何在 Azure 机器学习服务管道中使用密钥的主要内容,如果未能解决你的问题,请参考以下文章

Azure 机器学习管道:如何在失败时重试?

如何将 Pycharm 和 git 与 azure 机器学习服务(工作区)集成

在 Azure 容器实例中部署机器学习模型时如何访问所有已注册的模型?

Azure 机器学习在运行管道时抛出错误“无效图:节点中的计算目标无效”

安排 Azure 机器学习计算实例

如何将参数传递给 Azure 机器学习服务中的训练脚本?