演習 - 既存の Bicep テンプレートを確認する
このシナリオでは、品質管理チームの同僚と一緒にテンプレートを確認します。
テンプレートを使用して共同作業をするうちに、同僚からファイルの構造とコンポーネントについて次々と質問が出始めました。 彼らは少々混乱しているようです。 テンプレートにいくつかの改善を加えて、もっと読みやすく、理解しやすくすれば、メリットが得られるのではないでしょうか。
次のテンプレートを見てください。あなたはこれを初めて見ます。 あなたはテンプレートで行われていることをすべて理解できますか。 問題はいくつ見つかりましたか。 テンプレートを改善するにはどうすればよいでしょうか。
param location string = resourceGroup().location
@allowed([
'F1'
'D1'
'B1'
'B2'
'B3'
'S1'
'S2'
'S3'
'P1'
'P2'
'P3'
'P4'
])
param skuName string = 'F1'
@minValue(1)
param skuCapacity int = 1
param sqlAdministratorLogin string
@secure()
param sqlAdministratorLoginPassword string
param managedIdentityName string
param roleDefinitionId string = 'b24988ac-6180-42a0-ab88-20f7382dd24c'
param webSiteName string = 'webSite${uniqueString(resourceGroup().id)}'
param container1Name string = 'productspecs'
param productmanualsName string = 'productmanuals'
var hostingPlanName = 'hostingplan${uniqueString(resourceGroup().id)}'
var sqlserverName = 'toywebsite${uniqueString(resourceGroup().id)}'
var storageAccountName = 'toywebsite${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: storageAccountName
location: 'eastus'
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
resource blobServices 'blobServices' existing = {
name: 'default'
}
}
resource container1 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-05-01' = {
parent: storageAccount::blobServices
name: container1Name
}
resource sqlserver 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlserverName
location: location
properties: {
administratorLogin: sqlAdministratorLogin
administratorLoginPassword: sqlAdministratorLoginPassword
version: '12.0'
}
}
var databaseName = 'ToyCompanyWebsite'
resource sqlserverName_databaseName 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
name: '${sqlserver.name}/${databaseName}'
location: location
sku: {
name: 'Basic'
}
properties: {
collation: 'SQL_Latin1_General_CP1_CI_AS'
maxSizeBytes: 1073741824
}
}
resource sqlserverName_AllowAllAzureIPs 'Microsoft.Sql/servers/firewallRules@2023-08-01-preview' = {
name: '${sqlserver.name}/AllowAllAzureIPs'
properties: {
endIpAddress: '0.0.0.0'
startIpAddress: '0.0.0.0'
}
dependsOn: [
sqlserver
]
}
resource productmanuals 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-05-01' = {
name: '${storageAccount.name}/default/${productmanualsName}'
}
resource hostingPlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: hostingPlanName
location: location
sku: {
name: skuName
capacity: skuCapacity
}
}
resource webSite 'Microsoft.Web/sites@2023-12-01' = {
name: webSiteName
location: location
properties: {
serverFarmId: hostingPlan.id
siteConfig: {
appSettings: [
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: AppInsights_webSiteName.properties.InstrumentationKey
}
{
name: 'StorageAccountConnectionString'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'
}
]
}
}
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
'${msi.id}': {}
}
}
}
// We don't need this anymore. We use a managed identity to access the database instead.
//resource webSiteConnectionStrings 'Microsoft.Web/sites/config@2020-06-01' = {
// name: '${webSite.name}/connectionstrings'
// properties: {
// DefaultConnection: {
// value: 'Data Source=tcp:${sqlserver.properties.fullyQualifiedDomainName},1433;Initial Catalog=${databaseName};User Id=${sqlAdministratorLogin}@${sqlserver.properties.fullyQualifiedDomainName};Password=${sqlAdministratorLoginPassword};'
// type: 'SQLAzure'
// }
// }
//}
resource msi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-07-31-preview' = {
name: managedIdentityName
location: location
}
resource roleassignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
name: guid(roleDefinitionId, resourceGroup().id)
properties: {
principalType: 'ServicePrincipal'
roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', roleDefinitionId)
principalId: msi.properties.principalId
}
}
resource AppInsights_webSiteName 'Microsoft.Insights/components@2020-02-02' = {
name: 'AppInsights'
location: location
kind: 'web'
properties: {
Application_Type: 'web'
}
}
Bicep ファイルを作成して保存する
このモジュール全体を通して、テンプレートを改善する変更を行います。 ベスト プラクティスに従って、より読みやすく理解しやすい、同僚がより簡単に使用できるものにします。
まず、Bicep ファイルを作成し、それを使用できるようにローカルに保存する必要があります。
Visual Studio Code を開きます。
main.bicep という名前の新しいファイルを作成します。
上記の Bicep テンプレートをコピーして、ファイルに貼り付けます。
変更をファイルに保存します。
重要
コードを再編成および名前変更して改善するプロセスは、"リファクタリング" と呼ばれます。 コードをリファクターする場合は、Git などのバージョン管理システムを使用することをお勧めします。 バージョン管理を使用すると、コードに変更を加えて、変更を元に戻すことや、以前のバージョンに戻すことができます。
このモジュールでは、Git を使用してファイルを追跡する必要はありません。 ただし、そうすることをお勧めします。そのため、これはオプションの追加作業と見なしてください。