在 Azure 应用服务中装载 Azure 文件

在 Azure 应用服务中装载 Azure 文件

概括

我有一个运行自定义容器的 Azure 应用服务。当我将路径绑定到 Azure 文件共享时,我的容器停止工作。查看日志Container Issues,我看到错误:[BYOS] Custom storage volume(s) failed to initialize: [/var/LWASFiles/Sites/my-app/a3484543-39f9-45a3-816b-9524640dfd50]

细节

  • 我的自定义容器有一个定义的卷/var/www/html/v3/uploads

  • 我试图将其映射到 Azure 文件共享,该共享位于与托管 ASE 位于同一 vnet 中的存储帐户上,并且规则允许 ASE 子网与端口 137、138、138 和 445 上的文件共享之间的流量。

  • 托管 ASE 配置有内部负载均衡器(即,它是一个私有 ASE)。

  • 存储帐户已配置专用终结点。

  • 该卷在应用服务的设置 > 配置 > 路径映射下进行映射,使用有效密钥和与容器上的卷路径匹配的挂载路径。

  • 在添加路径映射之前,应用服务按预期运行。

  • 添加路径映射后,容器无法启动/我能找到的唯一异常信息来自日志Container Issues,如上面的摘要所示。

  • 如果我删除路径映射,即使强制重启,问题仍然存在。解决问题的唯一方法是删除并重新部署应用服务。

  • 它通过私有端点成功连接到 MySql DB(用于 MySQL 服务器的 Azure 数据库)。

  • 使用dig {privateEndpointFqdn}我可以证明存储帐户的私有端点已正确解析(就像 MySQL 一样;正如您所期望的那样)

  • 使用tcptraceroute {privateEndpointFqdn} {destinationPort}我可以证明我可以连接到端口 445 上的存储帐户(以及端口 3306 上的 MySQL DB)。

  • 注意:我无法连接到端口 137、138 或 139 上的存储帐户,尽管这些端口通过 NSG 允许使用与上述 445 相同的入站和出站规则;但我怀疑这些端口不再需要用于 CIFS(我只是在第一次遇到该问题后以防万一添加了这些端口,以防它们在某些帖子中提到过它们)。

  • 我通过 SSH 进入容器来运行上述测试,因此命令是从其上下文中运行的。注意:由于添加路径映射后无法启动容器,因此这些测试是在创建应用服务之后但在添加路径映射之前执行的。

  • 我已经将WEBSITES_CONTAINER_START_TIME_LIMIT其增加到最大值:1800

  • 我的容器公开端口 80(即 App Service 为容器支持的默认端口之一);当路径映射不存在时,网站可以正常工作,因此这应该不是问题。我还设置WEBSITES_PORT80,只是为了保险起见。

  • WEBSITES_ENABLE_APP_SERVICE_STORAGE设置为false(尽管我也尝试过将其设置为true,以防万一 / 它没有什么区别所以我恢复为false)。

  • 我的文件共享有几 GB 的数据。我尝试创建一个没有内容的相同文件共享并映射到该文件共享(在重新创建应用服务并证明其有效之后立即进行;以确保我的测试不会受到较大文件共享的影响)。这会产生与较大文件共享相同的问题。

  • 我的容器的图像正在从 Azure 容器存储库加载。

  • 该图像基于ubuntu:21.04

  • 我已经包含了azure-clicifs-utils包(我认为这仅在从容器执行挂载操作时才需要,而不是从 AppService 的配置执行;但我想涵盖所有假设)

  • 托管 ASE 位于该区域内UK South(存储帐户/所有资源也是如此)。

注意:这是我第一次在 App Service 中运行容器;所以 PEBKAC 绝对是可能的。

任何建议或故障排除建议都将不胜感激。谢谢。

答案1

我通过将存储帐户的网络selected networks(我已将其列入 ASE 的 VNet 和 Web 应用程序的出站 IP 白名单)更改为all networks通过门户解决了该问题:

https://portal.azure.com/#@<myTentantName>.onmicrosoft.com/resource/subscriptions/<mySubscrption>/resourceGroups/<myStorageAccountsResourceGroup>/providers/Microsoft.Storage/storageAccounts/<myStorageAccountName>/networking

然后我重新启动了我的应用程序(包括删除并重新添加挂载点……不确定是否有必要,但为了安全起见):

# stop the web app
az webapp stop \
    --subscription <sub id> \
    -g <resourcegroup> \
    -n <sitename> 

# drop the existing path mapping
az webapp config storage-account delete \
    --subscription <sub id> \
    -g <resourcegroup> \
    -n <sitename> \
    --custom-id <path-mapping-name> \

# re-add the path mapping
az webapp config storage-account add \
    --subscription <sub id> \
    -g <resourcegroup> \
    -n <sitename> \
    --custom-id <path-mapping-name> \
    --storage-type AzureFiles \
    --account-name [Azure storage account name] \
    --share-name   [Azure storage share name] \
    --access-key   [storage access key] \
    --mount-path   [/path/to/mount within the container] 

# restart the web app
az webapp start \
    --subscription <sub id> \
    -g <resourcegroup> \
    -n <sitename> 

相关内容