使用Azure模板扩展fileUris部署VM下载失败及Blob下载问题求助
解决Azure Blob下载失败及Custom Script扩展404错误的实战方案
针对你遇到的两个Azure相关问题,我整理了针对性的排查和解决步骤,帮你快速定位问题:
问题1:无法从Azure Blob下载文件
这类问题大多和权限、路径、网络三个维度有关,按以下顺序排查:
- 确认Blob存在性与路径正确性:Azure Blob的名称和路径是大小写敏感的,先登录Azure Portal,找到对应的存储账户和容器,确认你要下载的Blob确实存在,且文件名、路径和你使用的完全一致(比如不要把
Script.sh写成script.sh,除非Blob本身就是小写)。 - 检查容器与Blob的访问权限:
- 如果是测试场景,可以临时把容器权限设置为匿名读取访问(容器),尝试再次下载。如果能成功,说明是权限问题,后续再调整为更安全的方式(比如使用SAS令牌或RBAC角色)。
- 如果使用SAS令牌访问,确保令牌包含**读取(r)**权限,有效期未过期,且生成时的参数正确。可以用Azure CLI重新生成一个测试令牌:
az storage blob generate-sas --account-name <你的存储账户名> --container-name <容器名> --name <Blob文件名> --permissions r --expiry 2024-12-31T23:59:59Z --auth-mode login
- 排查网络限制:
- 如果你是从本地客户端下载,确认本地防火墙、代理没有阻止访问Azure存储服务的出站请求。
- 如果你是从VM内部下载,检查VM所在的NSG出站规则是否允许访问
Storage服务标签,同时查看存储账户的防火墙设置,是否将VM的IP或其所在虚拟网络加入了允许列表。
问题2:Custom Script扩展启动VM时出现404错误
错误提示failed to download file[1]: unexpected status code: got=404 expected=200,说明扩展无法访问你指定的fileUris中的URL,按以下步骤解决:
- 先在VM内测试URL有效性:登录到目标VM,用curl(Linux)或Invoke-WebRequest(Windows)直接访问
fileUris中的URL,比如:# Linux curl -I "https://你的存储账户.blob.core.windows.net/容器名/脚本文件.sh?SAS令牌"
如果返回404,说明URL本身有问题,先修复URL;如果返回200,再排查扩展的其他配置。# Windows Invoke-WebRequest -Uri "https://你的存储账户.blob.core.windows.net/容器名/脚本文件.ps1?SAS令牌" -Method Head - 确保URL包含有效的SAS令牌:如果Blob容器是私有,VM默认没有权限访问,必须在
fileUris的URL后拼接具有读取权限的SAS令牌。正确的URL格式应为:https://<存储账户名>.blob.core.windows.net/<容器名>/<文件名>?<完整的SAS令牌> - 检查存储账户的网络访问策略:如果存储账户设置了防火墙,需要将VM所在的虚拟网络添加到存储账户的允许列表,或者临时允许所有网络访问(仅测试用)。同时确认VM的NSG出站规则允许访问Azure存储服务。
- 查看扩展日志定位细节:在VM内部可以查看扩展的详细日志,找到具体的错误原因:
- Windows系统:
C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension - Linux系统:
/var/log/azure/Microsoft.Compute.CustomScriptExtension
- Windows系统:
- 验证ARM模板中的扩展配置:确保
fileUris是正确的数组格式,且commandToExecute中引用的文件名和Blob文件名一致,比如:"properties": { "publisher": "Microsoft.Compute", "type": "CustomScriptExtension", "typeHandlerVersion": "1.10", "settings": { "fileUris": [ "https://yourstorageaccount.blob.core.windows.net/scripts/setup.sh?sv=2023-11-03&ss=b&srt=sco&sp=r&se=2024-12-31T23:59:59Z&st=2024-01-01T00:00:00Z&spr=https&sig=xxxxxxxxxx" ], "commandToExecute": "sudo sh setup.sh" } }
内容的提问来源于stack exchange,提问作者Rehan Ch
相关产品推荐
相关产品推荐

