연습 - 모듈을 사용하도록 템플릿 리팩터링

완료됨

이 연습에서는 Azure App Service 리소스에 모듈을 사용하도록 앞서 만든 Bicep 템플릿을 업데이트합니다. 모듈은 주 템플릿의 의도를 보다 명확하게 유지하는 데 도움이 됩니다. 원하는 경우 App Service 모듈을 다른 템플릿에서 재사용할 수 있습니다.

프로세스 중에 다음을 수행합니다.

  • 새 모듈을 추가하고 App Service 리소스를 이동합니다.
  • 주 Bicep 템플릿에서 모듈을 참조합니다.
  • App Service 앱의 호스트 이름에 대한 출력을 추가하고 모듈 및 템플릿 배포에서 내보냅니다.
  • 배포를 테스트하여 템플릿이 유효한지 확인합니다.

새 모듈 파일 추가

  1. Visual Studio Code에서 main.bicep 파일을 만든 폴더에 modules라는 새 폴더를 만듭니다. modules 폴더에서 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@2023-12-01' = {
      name: appServicePlanName
      location: location
      sku: {
        name: appServicePlanSkuName
      }
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
      }
    }
    

    appService.bicep 템플릿은 자체 포함되어야 하기 때문에 main.bicep 템플릿에서 매개 변수 및 변수를 복사했습니다.

  3. 변경 내용을 파일에 저장합니다. Visual Studio Code에는 누락된 변수, 누락된 매개 변수 또는 잘못된 리소스에 대한 경고를 나타내는 빨간색 물결선이 표시되지 않습니다.

부모 템플릿에서 모듈에 대한 참조 추가

App Service 리소스를 배포하기 위한 전체 모듈을 만들었으므로 부모 템플릿 내에서 이 모듈을 참조할 수 있습니다. 모듈이 App Service 리소스를 배포하기 때문에 부모 템플릿에서 연결된 리소스 및 변수를 삭제할 수 있습니다.

  1. main.bicep 파일에서 App Service 리소스와 appServicePlanName, appServicePlanSkuName 변수 정의를 삭제합니다. App Service 매개 변수는 여전히 필요하므로 삭제하지 마세요. 스토리지 계정 매개 변수, 변수 또는 리소스도 삭제하지 마세요.

  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 형식이 될 것임을 선언합니다. 출력은 App Service 앱의 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@2023-05-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@2023-12-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSkuName
  }
}

resource appServiceApp 'Microsoft.Web/sites@2023-12-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 Portal로 돌아갑니다. 리소스 그룹으로 이동하면 이제 두 개의 성공한 배포가 표시된 것을 볼 수 있습니다.

  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. 출력 탭을 선택합니다. App Service 앱의 호스트 이름을 사용하는 appServiceAppHostName이라는 출력이 있습니다. 호스트 이름을 클립보드에 복사합니다.

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

  5. 새 브라우저 탭을 열고 복사한 호스트 이름을 붙여 넣습니다. 기본 App Service 홈페이지가 표시됩니다.

    Screenshot of the default App Service welcome page.

축하합니다! 뛰어난 앱을 위한 기초를 성공적으로 배포했습니다.