gpt4 book ai didi

azure - 二头肌模板导致部署时出现 "Object reference not set to an instance of an object"异常

转载 作者:行者123 更新时间:2023-12-03 02:13:23 25 4
gpt4 key购买 nike

下面我添加了 3 个 Bicep 文件的内容。如果将它们添加到同一目录并运行基于订阅的 Azure 部署,如下所示...

az 部署子创建 --name "VerifyBug"--location "northeurope"--template-file .\main.bicep

...您将得到“对象引用未设置到对象实例”。我刚刚花费了 24 小时的大部分时间试图找出到底是什么导致了这个异常,因为它来自于一个更大的复制部署。没有任何迹象表明异常是在哪里抛出的。

我发现问题出在 serverfarm.outputs.serverfarmId 值上。了解如何在稍后与另一个对象联合的对象中使用它。问题似乎是在联合运算符内使用 ARM 输出的组合,但我希望有更技术性的解释。我在这里发布此内容主要是为了帮助其他人避免将来遇到类似的痛苦。

我找到的解决方案是将 function.bicepserverfarm 模块之后的所有内容分解为一个单独的模块,该模块将服务器场 ID 作为参数。然后一切都会正常,但我很想听听关于为什么会这样的解释。

ma​​in.bicep

targetScope = 'subscription'

var location = 'northeurope'

var resourceNamePrefix = 'test-resource'

resource resourceGroup 'Microsoft.Resources/resourceGroups@2020-10-01' = {
name: '${resourceNamePrefix}-rg'
location: location
}

module func 'function.bicep' = {
name: '${deployment().name}-Func'
scope: resourceGroup
params: {
resourceNamePrefix: resourceNamePrefix
location: location
}
}

函数.bicep

param location string
param resourceNamePrefix string
param networking object = {}

module serverfarm 'appServicePlan.bicep' = {
name: '${deployment().name}-AppSvcPlan'
params: {
resourceNamePrefix: resourceNamePrefix
location: location
}
}

var siteConfig = {
linuxFxVersion: 'DOTNET-ISOLATED|6.0'
http20Enabled: true
alwaysOn: true
ftpsState: 'Disabled'
functionAppScaleLimit: 1
minimumElasticInstanceCount: 1
vnetRouteAllEnabled: !empty(networking)
}

var basicProperties = {
serverFarmId: serverfarm.outputs.serverfarmId
httpsOnly: true
redundancyMode: 'None'
reserved: true
siteConfig: siteConfig
}

var networkingProperties = empty(networking) ? {} : {
virtualNetworkSubnetId: networking.subnetResourceId
}
var functionProperties = union(basicProperties, networkingProperties)

resource function 'Microsoft.Web/sites@2021-02-01' = {
name: '${resourceNamePrefix}-fn'
location: location
kind: 'functionapp,linux'
properties: functionProperties
}

appServicePlan.bicep

param resourceNamePrefix string
param location string

resource serverfarm 'Microsoft.Web/serverfarms@2021-02-01' = {
kind: 'linux'
name: '${resourceNamePrefix}-appserviceplan'
location: location
sku: {
name: 'S1'
tier: 'Standard'
}
properties: {
reserved: true
maximumElasticWorkerCount: 1
}
}

output serverfarmId string = serverfarm.id

最佳答案

这是因为“资源管理器在开始部署操作之前解析变量”。 Reference .

在以下部分中,资源管理器尝试解析 serverFarmId: serverfarm.outputs.serverfarmId,但它尚不存在。

var basicProperties = {
serverFarmId: serverfarm.outputs.serverfarmId
httpsOnly: true
redundancyMode: 'None'
reserved: true
siteConfig: siteConfig
}

修改后的函数.bicep

在这里,我删除了变量并重建了资源部署,然后将参数从虚拟网络对象更改为带有子网 ID 的字符串。我使用空字符串比使用对象得到了更好的结果。我运行了部署,它运行正常,没有错误。

param location string
param resourceNamePrefix string
param subnetResourceId string = ''

module serverfarm 'appServicePlan.bicep' = {
name: '${deployment().name}-AppSvcPlan'
params: {
resourceNamePrefix: resourceNamePrefix
location: location
}
}

resource function 'Microsoft.Web/sites@2021-02-01' = {
name: '${resourceNamePrefix}-fn'
location: location
kind: 'functionapp,linux'
properties: {
serverFarmId: serverfarm.outputs.serverfarmId
httpsOnly: true
redundancyMode: 'None'
reserved: true
siteConfig: {
linuxFxVersion: 'DOTNET-ISOLATED|6.0'
http20Enabled: true
alwaysOn: true
ftpsState: 'Disabled'
functionAppScaleLimit: 1
minimumElasticInstanceCount: 1
vnetRouteAllEnabled: !empty(subnetResourceId)
}
virtualNetworkSubnetId: !empty(subnetResourceId) ? subnetResourceId : null
}
}

关于azure - 二头肌模板导致部署时出现 "Object reference not set to an instance of an object"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72461613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com