2

我想部署使用ARM模板将自定义脚本扩展添加到Azure VM,并且我想让它使用SAS令牌从存储帐户下载文件。Azure VM自定义脚本扩展SAS令牌支持

这里是模板(简化):

{ 
    "name": "CustomScriptExtension" 
    "type": "Microsoft.Compute/virtualMachines/extensions", 
    "location": "eastus", 
    "properties": { 
     "publisher": "Microsoft.Compute", 
     "type": "CustomScriptExtension", 
     "typeHandlerVersion": "1.8", 
     "settings": { 
      "fileUris": [ 
       "https://{storage-account}.blob.core.windows.net/installers/{installer}.msi?sv=2015-04-05&sig={signature}&st=2017-05-03T05:18:28Z&se=2017-05-10T05:18:28Z&srt=o&ss=b&sp=r" 
      ], 
      "commandToExecute": "start /wait msiexec /package {installer}.msi /quiet" 
     }, 
    } 
} 

和部署它会导致这个错误:

{ 
    "name": "CustomScriptExtension", 
    "type": "Microsoft.Compute.CustomScriptExtension", 
    "typeHandlerVersion": "1.8", 
    "statuses": [ 
    { 
     "code": "ProvisioningState/failed/3", 
     "level": "Error", 
     "displayStatus": "Provisioning failed", 
     "message": "Failed to download all specified files. Exiting. Error Message: Missing mandatory parameters for valid Shared Access Signature" 
    } 
    ] 
} 

如果我打与SAS的URL令牌其直接拉低文件只是好,所以我知道SAS令牌是正确的。自定义脚本扩展是否不支持包含SAS令牌的URL?

回答

4

我想明白了,这必须是自定义脚本扩展中的一个错误,导致它不支持存储帐户级SAS令牌。如果我在SAS令牌的末尾添加&sr=b(它不是存储帐户级别SAS令牌规范的一部分),它开始工作。

我发现这个信息在这里: https://azureoperations.wordpress.com/2016/11/21/first-blog-post/

+0

非常好,非常感谢。这解决了我的问题! –

1

正如@ 4c74356b41说。现在,客户脚本扩展模板不支持SAS令牌。如果您想从私人存储帐户下载文件,则可以使用存储帐户密钥。请参阅此example

{ 
     "type": "Microsoft.Compute/virtualMachines/extensions", 
     "name": "[concat(variables('vmName'),'/', variables('extensionName'))]", 
     "apiVersion": "[variables('apiVersion')]", 
     "location": "[resourceGroup().location]", 
     "dependsOn": [ 
     "[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]" 
     ], 
     "properties": { 
     "publisher": "Microsoft.Azure.Extensions", 
     "type": "CustomScript", 
     "typeHandlerVersion": "2.0", 
     "autoUpgradeMinorVersion": true, 
     "settings": { 
      "fileUris": "[split(parameters('fileUris'), ' ')]", 
      "commandToExecute": "[parameters('commandToExecute')]" 
     }, 
     "protectedSettings": { 
      "storageAccountName": "[parameters('customScriptStorageAccountName')]", 
      "storageAccountKey": "[parameters('customScriptStorageAccountKey')]" 
     } 
     } 
    } 
+0

看看我的示例脚本,我再次把SAS令牌到URL,因此,如果您知道完整的URL(因为你有SAS令牌)它是一个公共网址,这就像说公共网址不被支持。我明白了,看到我上面的答案。 – gregjhogan