Azure容器实例部署时配置环境变量:解决机器学习模型部署中密钥环境变量无法在score.py中使用的问题
在Azure Container Instance部署的ML服务中设置密钥环境变量
我来帮你搞定这个问题,其实有两种实用的方案可以让你的score.py获取到密钥环境变量,分别适合不同的场景:
方法1:直接在部署配置中添加环境变量(测试场景适用)
这种方式最简单直接,你只需要在AciWebservice.deploy_configuration()里加上environment_variables参数,把密钥作为键值对传入就行:
from azureml.core.webservice import AciWebservice deployment_config = AciWebservice.deploy_configuration( cpu_cores=0.5, memory_gb=1, auth_enabled=True, # 添加你的密钥环境变量 environment_variables={"API_SECRET_KEY": "your-actual-secret-value"} )
然后在你的score.py里,就可以通过os.getenv()读取这个变量了:
import os def init(): # 从环境变量中读取密钥 secret_key = os.getenv("API_SECRET_KEY") # 这里可以用密钥做初始化操作,比如初始化API客户端、数据库连接等 global api_client api_client = YourAPIClient(secret_key)
⚠️ 注意:这种方式会把密钥明文写在代码里,绝对不要把包含明文密钥的代码提交到版本控制系统,只适合本地测试或者临时验证场景。
方法2:使用Azure Key Vault管理密钥(生产环境推荐)
如果是生产环境,强烈建议用Azure Key Vault来存储和管理你的敏感密钥,避免密钥暴露。步骤如下:
- 把密钥存入Key Vault:先在你的Azure Key Vault中创建一个机密(Secret),比如命名为
ml-api-secret。 - 关联Key Vault与Azure ML工作区:确保你的Azure ML工作区已经和Key Vault关联(通常创建工作区时会自动关联,若没有可以手动在Azure Portal配置)。
- 在环境中引用Key Vault密钥:创建或修改Azure ML环境,用特殊语法引用Key Vault里的密钥:
from azureml.core import Environment from azureml.core.webservice import AciWebservice from azureml.core.model import InferenceConfig, Model # 获取你的工作区对象(假设已经初始化了ws) # ws = Workspace.from_config() # 加载或创建推理环境 env = Environment.get(workspace=ws, name="your-inference-env") # 如果是新环境,先配置依赖: # env = Environment(name="prod-inference-env") # env.python.conda_dependencies = CondaDependencies.create(pip_packages=["azureml-defaults"]) # 添加环境变量,用Key Vault引用语法 env.environment_variables["API_SECRET_KEY"] = "{{secrets://your-key-vault-name/ml-api-secret}}" # 配置推理和部署参数 inference_config = InferenceConfig(source_directory="./src", entry_script="score.py", environment=env) deployment_config = AciWebservice.deploy_configuration( cpu_cores=0.5, memory_gb=1, auth_enabled=True ) # 部署模型 service = Model.deploy( workspace=ws, name="prod-ml-service", models=[your_trained_model], inference_config=inference_config, deployment_config=deployment_config ) service.wait_for_deployment(show_output=True)
同样,在score.py里读取的方式和方法1完全一样,用os.getenv("API_SECRET_KEY")就能拿到Key Vault里的密钥值,而且整个过程中密钥不会出现在代码或配置文件里,安全性拉满。
如何更新已部署服务的环境变量
如果你的服务已经部署好了,不想重新部署的话,可以直接更新服务的环境变量:
from azureml.core.webservice import AciWebservice # 获取已部署的服务 service = AciWebservice(workspace=ws, name="your-service-name") # 更新环境变量(可以用明文或Key Vault引用) service.update(environment_variables={"API_SECRET_KEY": "new-secret-value"}) # 或者用Key Vault的方式 # service.update(environment_variables={"API_SECRET_KEY": "{{secrets://your-key-vault-name/new-secret-name}}"})
内容的提问来源于stack exchange,提问作者kuti
相关产品推荐
相关产品推荐

