如何向Azure Machine Learning推理服务器提供访问密钥?
首先明确两个常见误区:
- 用于训练阶段的密钥传递方案仅适用于模型训练、管道执行等存在作业运行上下文的场景,推理服务属于独立运行的长驻Web服务,没有对应的训练Run上下文,因此调用
Run.get_context()返回离线实例属于预期行为。 - 直接在环境变量定义中明文写入密钥的方式风险极高:密钥会明文出现在代码、环境定义、镜像构建记录中,极易发生泄露,完全不推荐。
最优方案:Azure密钥保管库(AKV) + 托管身份
这是安全等级最高、推荐度最高的方案,操作流程如下:
- 为你的AML推理端点分配托管身份(可选择系统分配托管身份,或预先创建的用户分配托管身份)
- 前往你存储数据库密码的AKV,为上述托管身份授予
机密读取权限,遵循最小权限原则,不要分配额外的写入、删除等权限 - 在推理服务的入口代码(通常是score.py)中引入对应的身份验证和密钥保管库SDK,直接通过托管身份拉取密钥,无需在代码、环境配置中写入任何明文凭据,示例代码如下:
from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient # 初始化客户端,托管身份会自动完成身份验证,无需手动传入凭据 credential = DefaultAzureCredential() secret_client = SecretClient(vault_url="https://<你的AKV名称>.vault.azure.cn/", credential=credential) db_password = secret_client.get_secret("<你的数据库密钥在AKV中的名称>").value
这种方式的优势是密钥全程只存在于AKV和推理服务的运行内存中,不会在任何配置、日志、镜像文件里泄露,同时你可以在AKV中随时轮换密钥,无需重新部署推理服务。
次选方案:AML安全环境变量
如果你需要更简单的实现方式,可以使用AML内置的安全环境变量功能,不要直接在代码里明文写入密钥,操作如下:
- 首先将密钥存储在和你AML工作区关联的AKV中
- 部署推理服务时,通过AML的部署配置指定安全环境变量,引用AKV中的密钥,这类环境变量不会在AML的任何配置、日志接口中明文返回,仅在推理服务运行时注入到容器环境中
示例代码如下:
from azure.ai.ml.entities import Environment env = Environment.from_pip_requirements(env_name, "requirements-azure.txt") env.environment_variables = { "DB_PASSWORD": "{{azureml:<你的密钥在AML工作区中的密钥名称>}}" }
这种方式实现更简单,安全等级略低于第一种方案,适合对安全要求不是极高的场景。
内容的提问来源于stack exchange,提问作者Funzo
相关产品推荐
相关产品推荐

