练习 - 重构模板以使用模块

已完成

在本练习中,你将更新之前创建的 Bicep 模板,使其对 Azure 应用服务资源使用模块。 模块有助于使主模板的意图更加明确。 如果你愿意,可以在其他模板中重用应用服务模块。

在此过程中,你将:

  • 添加新的模块,并将应用服务资源移到模块中。
  • 从主 Bicep 模板中引用模块。
  • 为应用服务应用的主机名添加一个输出,并从模块和模板部署中发出它。
  • 测试部署,确保模板有效。

添加新的模块文件

  1. 在 Visual Studio Code 中,在你创建了 main.bicep 文件的同一文件夹中,创建一个名为“模块”的新文件夹。 在“模块”文件夹中,创建一个名为 appService.bicep 的文件。 保存该文件。

  2. 将以下内容添加到 appService.bicep 文件中:

    param location string
    param appServiceAppName string
    
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    var appServicePlanName = 'toy-product-launch-plan'
    var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'
    
    resource appServicePlan 'Microsoft.Web/serverFarms@2022-03-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    请注意,你已经从 main.bicep 模板中复制了参数和变量,因为 appService.bicep 模板需要是独立的。

  3. 保存对文件所做的更改。 请注意,Visual Studio Code 没有向你显示任何红色波浪线,指明有关缺少变量、缺少参数或资源无效的警告。

从父模板添加对模块的引用

现在你有了一个完整的模块来部署应用服务资源,现在可以在父模板中引用该模块了。 由于该模块部署了应用服务资源,因此可以从父模板中删除关联的资源和变量。

  1. 在 main.bicep 文件中,删除应用服务资源,以及 appServicePlanNameappServicePlanSkuName 变量定义。 请勿删除应用服务参数,因为你仍需要它们。 此外,不要删除存储帐户参数、变量或资源。

  2. 在 main.bicep 文件底部,添加以下 Bicep 代码:

    module appService 'modules/appService.bicep' = {
      name: 'appService'
      params: {
        location: location
        appServiceAppName: appServiceAppName
        environmentType: environmentType
      }
    }
    

    请注意,是通过在父模板中引用参数来指定模块的参数。

  3. 保存对文件所做的更改。

添加主机名作为输出

  1. 在 appService.bicep 文件的底部,添加以下 Bicep 代码:

    output appServiceAppHostName string = appServiceApp.properties.defaultHostName
    

    此代码声明该模块的输出,它将被命名为 appServiceAppHostName,类型为 string。 输出将从应用服务应用的 defaultHostName 属性中获取其值。

  2. 保存对文件所做的更改。

    此输出是在将用作模块的 Bicep 文件中声明的,因此它将仅适用于父模板。 你还需要将输出返回给部署了模板的人员。

  3. 打开 main.bicep 文件,并在文件底部添加以下代码:

    output appServiceAppHostName string = appService.outputs.appServiceAppHostName
    

    请注意,此输出的声明方式与模块中输出的声明方式类似。 但这次你引用的是模块的输出,而不是资源属性。

  4. 保存对文件所做的更改。

验证 Bicep 文件

完成上述所有更改后,main.bicep 文件应如以下示例所示:

param location string = 'eastus'
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
param appServiceAppName string = 'toylaunch${uniqueString(resourceGroup().id)}'

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountSkuName
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

module appService 'modules/appService.bicep' = {
  name: 'appService'
  params: {
    location: location
    appServiceAppName: appServiceAppName
    environmentType: environmentType
  }
}

output appServiceAppHostName string = appService.outputs.appServiceAppHostName

appService.bicep 文件应如以下示例所示:

param location string
param appServiceAppName string

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

var appServicePlanName = 'toy-product-launch-plan'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2v3' : 'F1'

resource appServicePlan 'Microsoft.Web/serverFarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

output appServiceAppHostName string = appServiceApp.properties.defaultHostName

如果任意文件均不匹配,请复制示例或调整模板以匹配示例。

部署已更新的 Bicep 模板

在终端中运行以下 Azure CLI 命令。

az deployment group create \
  --template-file main.bicep \
  --parameters environmentType=nonprod

在终端中运行以下 Azure PowerShell 命令。

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -environmentType nonprod

检查你的部署

  1. 在浏览器中返回到 Azure 门户。 转到资源组,可以看到现在有 2 个已成功的部署。

  2. 选择“2 个成功”链接。 请注意,列表中有一个名为“main”的部署,还有一个名为“appService”的新部署。

    Screenshot of the Azure portal interface for the deployments, with the two deployments listed and succeeded statuses.

  3. 选择名为 main 的部署,然后选择“部署详细信息”以展开已部署的资源列表。

    请注意,我们的模块部署出现在列表中。

    Screenshot of the Azure portal interface for the specific deployment, with one resource listed.

  4. 选择“输出”选项卡。请注意,有一个名为 appServiceAppHostName 的输出,其中包含应用服务应用的主机名。 将主机名复制到剪贴板。

    Screenshot of the Azure portal interface for the specific deployment's outputs.

  5. 打开新的浏览器选项卡,并粘贴复制的主机名。 应会看到默认的应用服务欢迎页。

    Screenshot of the default App Service welcome page.

祝贺你! 你已成功为出色的应用部署好了基础内容。