ARM şablonu en iyi yöntemleri

Bu makalede, uygulama şablonlarınızı (ARM şablonu) oluşturmada Azure Resource Manager yöntemlerin nasıl kullanacağız? Bu öneriler, çözüm dağıtmak için ARM şablonu kullanırken sık karşılaşılan sorunları önlemeye yardımcı olur.

Şablon sınırları

Şablon boyutunu 4 MB ile sınırla. 4 MB'lık sınır, yineli kaynak tanımları ve değişkenler ve parametreler için değerler ile genişletilen şablonun son durumu için geçerlidir. Parametre dosyası da 4 MB ile sınırlıdır. İsteğin toplam boyutu çok büyükse 4 MB'ın altında bir şablon veya parametre dosyasıyla hata alabilirsiniz. Büyük bir istekten kaçınmak için şablonunuzu basitleştirme hakkında daha fazla bilgi için bkz. İş boyutunun aşılmasıyla ilgili hataları düzeltme.

Ayrıca şu sınırlara da sahipsin:

  • 256 parametre
  • 256 değişken
  • 800 kaynak (kopyalama sayısı dahil)
  • 64 çıkış değeri
  • Şablon ifadesinde 24.576 karakter

İç içe geçmiş bir şablon kullanarak bazı şablon sınırlarını aşabilirsiniz. Daha fazla bilgi için bkz. Azure kaynaklarını dağıtırken bağlantılı ve iç içe şablonları kullanma. Parametre, değişken veya çıkış sayısını azaltmak için birkaç değeri bir nesnede birleştirebilirsiniz. Daha fazla bilgi için bkz. Parametre olarak nesneler.

Kaynak grubu

Kaynakları bir kaynak grubuna dağıtınca, kaynak grubu kaynaklarla ilgili meta verileri depolar. Meta veriler kaynak grubunun bulunduğu konumda depolanır.

Kaynak grubunun bölgesi geçici olarak kullanılamıyorsa, meta veriler kullanılamay olduğundan kaynak grubunda kaynakları güncelleştiresiniz. Diğer bölgelerdeki kaynaklar yine de beklendiği gibi işlev gösterir, ancak bunları güncelleştiresiniz. Riski en aza indirmek için kaynak grubu ve kaynaklarınızı aynı bölgede bulun.

Parametreler

Bu bölümdeki bilgiler, parametreleriyle çalışabilirsiniz.

Parametreler için genel öneriler

  • Parametre kullanımınızı en aza indirme. Bunun yerine, dağıtım sırasında belirtilmemiş özellikler için değişkenleri veya değişmez değerleri kullanın.

  • Parametre adları için büyük/büyük harf kullanın.

  • Ortama göre değişen SKU, boyut veya kapasite gibi ayarlar için parametreleri kullanın.

  • Kolay tanımlama için belirtmek istediğiniz kaynak adları için parametreleri kullanın.

  • Meta verilerde yer alan her parametrenin açıklamasını girin.

    "parameters": {
      "storageAccountType": {
        "type": "string",
        "metadata": {
          "description": "The type of the new storage account created to store the VM disks."
        }
      }
    }
    
  • Hassas olmayan parametreler için varsayılan değerleri tanımlayın. Varsayılan bir değer belirterek şablonu dağıtmak daha kolaydır ve şablon kullanıcılarının uygun bir değer örneğini görmeleri gerekir. Bir parametrenin tüm varsayılan değerleri, varsayılan dağıtım yapılandırmasında tüm kullanıcılar için geçerli olmalıdır.

    "parameters": {
      "storageAccountType": {
        "type": "string",
        "defaultValue": "Standard_GRS",
        "metadata": {
          "description": "The type of the new storage account created to store the VM disks."
        }
      }
    }
    
  • İsteğe bağlı bir parametre belirtmek için boş bir dizeyi varsayılan değer olarak kullanma. Bunun yerine, bir değer oluşturmak için değişmez değer veya dil ifadesi kullanın.

    "storageAccountName": {
       "type": "string",
       "defaultValue": "[concat('storage', uniqueString(resourceGroup().id))]",
       "metadata": {
         "description": "Name of the storage account"
       }
    }
    
  • Fazla allowedValues kullanın. Bunu yalnızca bazı değerlerin izin verilen seçeneklere dahil edilmediğini emin olmak istediğiniz durumlarda kullanın. Çok geniş allowedValues kapsamlı kullanırsanız, listenizi güncel tutmaarak geçerli dağıtımları engelleyebilirsiniz.

  • Şablonunuzdaki bir parametre adı PowerShell dağıtım komutunda bir parametreyle eşlemezse, Resource Manager fromTemplate son ekini şablon parametresine ekleyerek bu adlandırma çakışmasını çözer. Örneğin, şablonunuza ResourceGroupName adlı bir parametre dahil ediyorsanız, new-AzResourceGroupDeployment cmdlet'inde ResourceGroupName parametresiyle çakışıyor. Dağıtım sırasında ResourceGroupNameFromTemplate için bir değer girmeniz istenir.

Parametreler için güvenlik önerileri

  • Kullanıcı adları ve parolalar (veya gizli diziler) için her zaman parametreleri kullanın.

  • Tüm securestring parolalar ve gizli diziler için kullanın. Hassas verileri bir JSON nesnesine iletirsiniz, türünü secureObject kullanın. Güvenli dize veya güvenli nesne türlerine sahip şablon parametreleri, kaynak dağıtımı sonrasında okunamadı.

    "parameters": {
      "secretValue": {
        "type": "securestring",
        "metadata": {
          "description": "The value of the secret to store in the vault."
        }
      }
    }
    
  • Kullanıcı adları, parolalar veya tür gerektiren herhangi bir değer için varsayılan değerler secureString sağlamayın.

  • Uygulamanın saldırı yüzeyini artıran özellikler için varsayılan değerler sağlamayın.

Parametreler için konum önerileri

  • Kaynakların konumunu belirtmek için bir parametre kullanın ve varsayılan değeri olarak resourceGroup().location ayarlayın. Konum parametresi sağlamak, şablonun kullanıcılarının kaynakları dağıtma iznine sahip olduğu bir konum belirtmesini sağlar.

    "parameters": {
       "location": {
         "type": "string",
         "defaultValue": "[resourceGroup().location]",
         "metadata": {
           "description": "The location in which the resources should be deployed."
         }
       }
    }
    
  • Konum parametresi allowedValues için belirtme. Belirttiğiniz konumlar tüm bulutlarda kullanılamıyor olabilir.

  • Aynı konumda olma olasılığı olan kaynaklar için konum parametresi değerini kullanın. Bu yaklaşım, kullanıcıların konum bilgilerini sağlamaları istenecek sayısını en aza indirger.

  • Tüm konumlarda kullanılabilir olmayan kaynaklar için ayrı bir parametre kullanın veya sabit konum değeri belirtin.

Değişkenler

Aşağıdaki bilgiler, değişkenleriyle birlikte çalışıyorken yararlı olabilir:

  • Değişken adları için büyük/büyük harf kullanın.

  • Şablonda birden çok kez kullanmak istediğiniz değerler için değişkenleri kullanın. Bir değer yalnızca bir kez kullanılıyorsa, sabit kodlu değer şablon okumanızı kolaylaştırır.

  • Şablon işlevlerinin karmaşık bir düzeninden oluşturursanız değerler için değişkenleri kullanın. Karmaşık ifade yalnızca değişkenlerde görüntülendiğinde şablonunuz daha kolay okunur.

  • Şablonun bölümünde başvuru işlevini variables kullanasınız. işlevi, reference değerini kaynağın çalışma zamanı durumundan türetmektedir. Ancak değişkenler, şablonun ilk ayrıştırması sırasında çözümlenir. Doğrudan şablonun reference veya bölümünde resources işlevine outputs ihtiyaç olan değerler oluşturun.

  • Benzersiz olması gereken kaynak adları için değişkenleri dahil etmek.

  • JSON nesnelerinin yinelenen bir desenini oluşturmak için değişkenlerde bir kopyalama döngüsü kullanın.

  • Kullanılmayan değişkenleri kaldırın.

API sürümü

özelliğini apiVersion kaynak türü için sabit kodlu API sürümüne ayarlayın. Yeni şablon oluştururken, bir kaynak türü için en son API sürümünü kullanmanız önerilir. Kullanılabilir değerleri belirlemek için bkz. şablon başvurusu.

Şablonunuz beklendiği gibi çalışıyorsa aynı API sürümünü kullanmaya devam edin. Aynı API sürümünü kullanarak, sonraki sürümlerde tanıtılana yeni değişiklikler konusunda endişelenmeniz gerek değildir.

API sürümü için parametre kullanma. Kaynak özellikleri ve değerleri API sürümüne göre değişiklik gösterebilir. Kod düzenleyicisinde IntelliSense, API sürümü bir parametreye ayarlanırken doğru şemayı belirleye değildir. Şablonun özellikleriyle eşleşmez bir API sürümü iletirsiniz, dağıtım başarısız olur.

API sürümü için değişkenleri kullanma.

Kaynak bağımlılıkları

Hangi bağımlılıkları ayarlaycazına karar verirken aşağıdaki yönergeleri kullanın:

  • işlevini kullanın ve bir özelliği paylaşması gereken kaynaklar arasında örtülü bir bağımlılık reference ayarlamak için kaynak adını girin. Zaten örtülü bir bağımlılık dependsOn tanımlamışken açık bir öğe eklemeyebilirsiniz. Bu yaklaşım gereksiz bağımlılıklara sahip olmak riskini azaltır. Örtülü bağımlılık ayarlama örneği için bkz. başvuru ve liste işlevleri.

  • Alt kaynağı üst kaynağına bağımlı olarak ayarlayın.

  • Condition öğesi false olarak ayarlanmış kaynaklar bağımlılık sırasından otomatik olarak kaldırılır. Bağımlılıkları kaynak her zaman dağıtılmış gibi ayarlayın.

  • Bağımlılıkları açıkça ayarlamadan basamaklı olarak bırakın. Örneğin, sanal makineniz bir sanal ağ arabirimine, sanal ağ arabirimi ise bir sanal ağa ve genel IP adreslerine bağlıdır. Bu nedenle, sanal makine üç kaynağın da ardından dağıtılır, ancak sanal makineyi açıkça üç kaynağın üçüne de bağımlı olarak ayarlamayın. Bu yaklaşım bağımlılık sırasını açıklar ve şablonu daha sonra değiştirmeyi kolaylaştırır.

  • Dağıtım öncesinde bir değer belirlenebileceği takdirde, kaynağı bir bağımlılık olmadan dağıtmaya çalışın. Örneğin, bir yapılandırma değeri başka bir kaynağın adına ihtiyaç duyuyorsa, bağımlılığa gerek duymayabilir. Bazı kaynaklar diğer kaynağın varlığını doğrulamadığı için bu kılavuz her zaman çalışmaz. Bir hata alırsanız, bir bağımlılık ekleyin.

Kaynaklar

Kaynaklarlaçalışırken aşağıdaki bilgiler yararlı olabilir:

  • Diğer katkı sağlayanlar kaynağın amacını anlamalarına yardımcı olmak için comments şablondaki her kaynak için belirtin.

    "resources": [
      {
        "name": "[variables('storageAccountName')]",
        "type": "Microsoft.Storage/storageAccounts",
        "apiVersion": "2019-06-01",
        "location": "[resourceGroup().location]",
        "comments": "This storage account is used to store the VM disks.",
          ...
      }
    ]
    
  • Şablonunuzda ortak bir uç nokta (Azure Blob depolama genel uç noktası gibi) kullanıyorsanız, ad alanını sabit bir şekilde kodmayın . referenceAd alanını dinamik olarak almak için işlevini kullanın. Şablonu şablondaki uç noktayı el ile değiştirmeden farklı genel ad alanı ortamlarına dağıtmak için bu yaklaşımı kullanabilirsiniz. API sürümünü, şablonunuzda depolama hesabı için kullandığınız sürüme ayarlayın.

    "diagnosticsProfile": {
      "bootDiagnostics": {
        "enabled": "true",
        "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"
      }
    }
    

    Depolama hesabı oluşturmakta olduğunuz şablona dağıtılmışsa ve depolama hesabının adı şablondaki başka bir kaynakla paylaşılmamışsa, sağlayıcı ad alanını belirtmeniz veya kaynağa başvurduğunuzda emin olmanız gerekmez apiVersion . Aşağıdaki örnek basitleştirilmiş söz dizimini gösterir.

    "diagnosticsProfile": {
      "bootDiagnostics": {
        "enabled": "true",
        "storageUri": "[reference(variables('storageAccountName')).primaryEndpoints.blob]"
      }
    }
    

    Ayrıca, farklı bir kaynak grubunda bulunan mevcut bir depolama hesabına de başvurabilirsiniz.

    "diagnosticsProfile": {
      "bootDiagnostics": {
        "enabled": "true",
        "storageUri": "[reference(resourceId(parameters('existingResourceGroup'), 'Microsoft.Storage/storageAccounts', parameters('existingStorageAccountName')), '2019-06-01').primaryEndpoints.blob]"
      }
    }
    
  • Bir sanal makineye yalnızca bir uygulama gerektirdiğinde genel IP adresleri atayın. Hata ayıklama için bir sanal makineye (VM) bağlanmak veya yönetim veya yönetim amaçlarıyla, gelen NAT kuralları, bir sanal ağ geçidi veya bir atlama kutusu kullanın.

    Sanal makinelere bağlanma hakkında daha fazla bilgi için bkz.:

  • domainNameLabelGenel IP adresleri özelliği benzersiz olmalıdır. domainNameLabelDeğer 3 ila 63 karakter uzunluğunda olmalı ve bu normal ifade tarafından belirtilen kuralları izlemelidir: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$ . uniqueStringİşlevi 13 karakter uzunluğunda bir dize oluşturduğundan, dnsPrefixString parametre 50 karakterle sınırlıdır.

    "parameters": {
      "dnsPrefixString": {
        "type": "string",
        "maxLength": 50,
        "metadata": {
          "description": "The DNS label for the public IP address. It must be lowercase. It should match the following regular expression, or it will raise an error: ^[a-z][a-z0-9-]{1,61}[a-z0-9]$"
        }
      }
    },
    "variables": {
      "dnsPrefix": "[concat(parameters('dnsPrefixString'),uniquestring(resourceGroup().id))]"
    }
    
  • Özel bir betik uzantısına bir parola eklediğinizde, özelliğindeki commandToExecute özelliğini kullanın protectedSettings .

    "properties": {
      "publisher": "Microsoft.Azure.Extensions",
      "type": "CustomScript",
      "typeHandlerVersion": "2.0",
      "autoUpgradeMinorVersion": true,
      "settings": {
        "fileUris": [
          "[concat(variables('template').assets, '/lamp-app/install_lamp.sh')]"
        ]
      },
      "protectedSettings": {
        "commandToExecute": "[concat('sh install_lamp.sh ', parameters('mySqlPassword'))]"
      }
    }
    

    Not

    VM 'Ler ve uzantılara parametre olarak geçirildiğinde gizli dizi şifrelendiğinden emin olmak için protectedSettings ilgili uzantıların özelliğini kullanın.

  • Zaman içinde değişebilir varsayılan değerlere sahip özellikler için açık değerler belirtin. Örneğin, bir AKS kümesi dağıtıyorsanız, özelliği belirtebilir ya da atlayabilirsiniz kubernetesVersion . Bunu belirtmezseniz, küme varsayılan olarak N-1 alt sürüm ve en son düzeltme eki olarak ayarlanır. Bir ARM şablonu kullanarak kümeyi dağıttığınızda, bu varsayılan davranış beklediğiniz gibi olmayabilir. Şablonunuzun yeniden dağıtılması, kümenin yeni bir Kubernetes sürümüne beklenmedik bir şekilde yükseltilmesinden kaynaklanabilir. Bunun yerine, bir açık sürüm numarası belirtmeyi ve sonra kümenizi yükseltmeye hazırsanız el ile değiştirmeyi düşünün.

Test araç setini kullanma

ARM şablonu test araç seti, şablonunuzun önerilen uygulamalar kullanıp kullanmadığını denetleyen bir betiktir. Şablonunuz Önerilen uygulamalarla uyumlu olmadığında, önerilen değişikliklerle ilgili uyarıların bir listesini döndürür. Test araç seti, şablonunuzda en iyi uygulamaların nasıl uygulanacağını öğrenmenize yardımcı olabilir.

Şablonunuzu tamamladıktan sonra, uygulamayı iyileştirebileceğinizi görmek için test araç setini çalıştırın. Daha fazla bilgi için bkz. ARM şablonu test araç seti kullanma.

Sonraki adımlar