Azure部署MLflow Docker:保存制品至Blob Storage报MissingRequiredHeader错误
通过Docker镜像在Azure上部署MLflow服务器后,服务器URL可正常访问,但保存制品到Azure Blob Storage时触发报错:
requests.exceptions.HTTPError: 400 Client Error: An HTTP header that's mandatory for this request is not specified
补充信息:
- 使用Azure Blob Storage存储制品,SQL后端连接正常
- 启动脚本
launch.sh内容:
mlflow server \ --backend-store-uri "$MLFLOW_BACKEND_STORE_URI" \ --default-artifact-root "$MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT" \ --host "$MLFLOW_SERVER_HOST" \ --port "$MLFLOW_SERVER_PORT" \ --workers "$MLFLOW_SERVER_WORKERS"
- Azure Web应用配置的环境变量示例:
MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT="https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/$STORAGE_CONTAINER_NAME?$SAS_TOKEN" AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=$STORAGE_ACCOUNT_NAME;AccountKey=$AZURE_STORAGE_ACCESS_KEY;BlobEndpoint=https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/;FileEndpoint=https://$STORAGE_ACCOUNT_NAME.file.core.windows.net/;QueueEndpoint=https://$STORAGE_ACCOUNT_NAME.queue.core.windows.net/;TableEndpoint=https://$STORAGE_ACCOUNT_NAME.table.core.windows.net/"
检查SAS令牌的权限与格式
当前用SAS令牌拼接在MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT里,要确保SAS令牌包含写入、创建、删除等必要权限,且未过期。另外注意SAS令牌开头不要带?,如果生成的SAS是?sv=xxx,要去掉前面的?,只保留sv=xxx&...部分,避免重复的?导致解析错误,进而缺失请求头。切换使用Azure存储连接字符串配置制品根目录
放弃带SAS的URL作为default-artifact-root,改用wasbs格式路径:wasbs://<container-name>@<storage-account-name>.blob.core.windows.net/,MLflow会自动通过AZURE_STORAGE_CONNECTION_STRING获取认证信息,避免手动拼接SAS带来的头信息缺失问题。修改后的
MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT示例:MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT="wasbs://$STORAGE_CONTAINER_NAME@$STORAGE_ACCOUNT_NAME.blob.core.windows.net/"验证环境变量是否正确传递到容器
在Azure Web应用的容器内执行命令,检查环境变量是否正确加载:echo $AZURE_STORAGE_CONNECTION_STRING echo $MLFLOW_SERVER_DEFAULT_ARTIFACT_ROOT确保
$STORAGE_ACCOUNT_NAME这类占位符已被替换为实际值,且变量值无空值或解析错误。检查MLflow版本兼容性
旧版本MLflow对Azure Blob Storage的SAS令牌支持可能存在问题,建议升级到2.x以上的最新稳定版MLflow,确保与Azure存储服务API兼容,避免版本差异导致的请求头缺失。
内容的提问来源于stack exchange,提问作者Sabrine Bendimerad

