نشر خدمة السحابة (الدعم الموسع) باستخدام قوالب ARM

يشرح هذا البرنامج التعليمي كيفية إنشاء نشر خدمة سحابية (الدعم الموسع) باستخدام قوالب ARM.

قبل أن تبدأ

  1. راجع متطلبات النشر للخدمات السحابية (الدعم الموسع) وإنشاء الموارد المقترنة.

  2. إنشاء مورد جديد باستخدام مدخل Microsoft Azure أو PowerShell. هذه الخطوة اختيارية إذا كنت تستخدم مجموعة موارد موجودة.

  3. إنشاء حساب تخزين جديد باستخدام مدخل Microsoft Azure أو PowerShell. هذه الخطوة اختيارية إذا كنت تستخدم حساب تخزين موجود.

  4. تحميل الحزمة (.cspkg) وملفات تكوين الخدمة (.cscfg) إلى حساب التخزين باستخدام مدخل Microsoft Azure، أو PowerShell. الحصول على عناوين توقيعات الوصول المشترك (SAS URLs) من كلا الملفين لإضافتها إلى قالب ARM لاحقا في هذا البرنامج التعليمي.

  5. (اختياري) إنشاء key vault، وتحميل الشهادات.

    • يمكن إرفاق الشهادات بخدمات السحابة لتمكين الاتصال الآمن من وإلى الخدمة. لاستخدام الشهادات، يجب تحديد بصمات الإبهام في ملف تكوين الخدمة (.cscfg) وتحميلها إلى key vault. يمكن إنشاء key vault من خلال مدخل Microsoft Azure أو PowerShell.
    • يجب أن يكون key vault المقترن موجودًا في المنطقة ذاتها والاشتراك كخدمة سحابية.
    • يجب تمكين key vault المقترن للأذونات المناسبة حتى يتمكن مورد خدمات السحابة (الدعم الموسع) من استرداد الشهادات من Key Vault. لمزيد من المعلومات، راجع الشهادات وKey Vault
    • يجب الرجوع إلى مخزن المفاتيح في قسم OsProfile من قالب ARM الموضح في الخطوات أدناه.

نشر خدمة السحابة (الدعم الموسع)

ملاحظة

طريقة أسهل وأسرع لإنشاء قالب ARM وملف المعلمة من خلال مدخل Microsoft Azure. يمكنك تنزيل قالب ARM الذي تم إنشاؤه عبر المدخل لإنشاء خدمة السحابة عبر PowerShell

  1. إنشاء شبكة ظاهرية. يجب أن يتطابق اسم الشبكة الظاهرية مع المراجع في ملف تكوين الخدمة (.cscfg). إذا كنت تستخدم شبكة ظاهرية موجودة، فاحذف هذا القسم من قالب ARM.

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/virtualNetworks", 
          "name": "[parameters('vnetName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "addressSpace": { 
              "addressPrefixes": [ 
                "10.0.0.0/16" 
              ] 
            }, 
            "subnets": [ 
              { 
                "name": "WebTier", 
                "properties": { 
                  "addressPrefix": "10.0.0.0/24" 
                } 
              } 
            ] 
          } 
        } 
    ] 
    

    في حال إنشاء شبكة ظاهرية جديدة، أضف ما يلي إلى القسم dependsOn لضمان إنشاء النظام الأساسي للشبكة الظاهرية قبل إنشاء خدمة السحابة.

    "dependsOn": [ 
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]" 
     ] 
    
  2. إنشاء عنوان IP عام و (اختياريا) تعيين الخاصية تسمية DNS لعنوان IP العمومي. إذا كنت تستخدم عنوان IP ثابت، فستحتاج إلى إدراجه كعنوان IP محجوز في ملف تكوين الخدمة (.cscfg). إذا كنت تستخدم عنوان IP موجود، فتخطى هذه الخطوة وأضف معلومات عنوان IP مباشرة إلى إعدادات تكوين موازن التحميل في قالب ARM.

    "resources": [ 
        { 
          "apiVersion": "2019-08-01", 
          "type": "Microsoft.Network/publicIPAddresses", 
          "name": "[parameters('publicIPName')]", 
          "location": "[parameters('location')]", 
          "properties": { 
            "publicIPAllocationMethod": "Dynamic", 
            "idleTimeoutInMinutes": 10, 
            "publicIPAddressVersion": "IPv4", 
            "dnsSettings": { 
              "domainNameLabel": "[variables('dnsName')]" 
            } 
          }, 
          "sku": { 
            "name": "Basic" 
          } 
        } 
    ] 
    

    في حال إنشاء شبكة ظاهرية جديدة، أضف ما يلي إلى القسم dependsOn لضمان إنشاء النظام الأساسي لعنوان IP قبل إنشاء خدمة السحابة.

    "dependsOn": [ 
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
          ] 
    
  3. إنشاء كائن خدمة السحابة (الدعم الموسع)، إضافة مراجع dependsOn مناسبة إذا كنت تقوم بنشر الشبكات الظاهرية أو عناوين IP العامة داخل القالب الخاص بك.

    {
      "apiVersion": "2021-03-01",
      "type": "Microsoft.Compute/cloudServices",
      "name": "[variables('cloudServiceName')]",
      "location": "[parameters('location')]",
      "tags": {
        "DeploymentLabel": "[parameters('deploymentLabel')]",
        "DeployFromVisualStudio": "true"
      },
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
        "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
      ],
      "properties": {
        "packageUrl": "[parameters('packageSasUri')]",
        "configurationUrl": "[parameters('configurationSasUri')]",
        "upgradeMode": "[parameters('upgradeMode')]"
      }
    }
    
  4. إنشاء كائن ملف تعريف شبكة الاتصال لخدمة السحابة الخاصة بك وربط عنوان IP العام إلى الواجهة الأمامية لموازن التحميل. يتم إنشاء موازن التحميل تلقائيا بواسطة النظام الأساسي.

    "networkProfile": { 
        "loadBalancerConfigurations": [ 
          { 
            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]", 
            "name": "[variables('lbName')]", 
            "properties": { 
              "frontendIPConfigurations": [ 
                { 
                  "name": "[variables('lbFEName')]", 
                  "properties": { 
                    "publicIPAddress": { 
                      "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]" 
                    } 
                  } 
                } 
              ] 
            } 
          } 
        ] 
      } 
    
  5. أضف مرجع مخزن المفاتيح الخاص بك في OsProfile قسم من قالب ARM. يتم استخدام key vault لتخزين الشهادات المقترنة بالخدمات السحابية (الدعم الموسع). إضافة الشهادات إلى key vault، ثم إدراج بصمة الشهادة في ملف تكوين الخدمة (.cscfg). تحتاج أيضا إلى تمكين "نهج وصول" Key Vault "للأجهزة الظاهرية Azure للنشر" (على المدخل) حتى يتمكن مورد خدمات السحابة (الدعم الموسع) من استرداد الشهادة المخزنة كأسرار من Key Vault. يجب أن يكون key vault المقترن موجودًا في المنطقة ذاتها والاشتراك كخدمة سحابية ويحمل اسمًا فريدًا. لمزيد من المعلومات، راجع استخدام الشهادات باستخدام الخدمات السحابية (الدعم الموسع).

    "osProfile": { 
          "secrets": [ 
            { 
              "sourceVault": { 
                "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}" 
              }, 
              "vaultCertificates": [ 
                { 
                  "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}" 
                } 
              ] 
            } 
          ] 
        } 
    

    ملاحظة

     SourceVault هو معرف مورد ARM إلى مخزن المفاتيح الخاص بك. يمكنك العثور على هذه المعلومات عن طريق تحديد موقع معرف المورد في قسم الخصائص في مخزن المفاتيح الخاص بك.

    • يمكن العثور على certificateUrl عن طريق التنقل إلى الشهادة في key vault المسمى "المعرّف السري" . 
    • يجب أن يكون certificateUrl مثل https://{keyvault-endpoin}/secrets/{secretname}/{secret-id}
  6. إنشاء ملف تعريف دور. تأكد من أن عدد الأدوار وأسماء الأدوار وعدد المثيلات في كل دور وحجمها هي ذاتها عبر تكوين الخدمة (.cscfg) وتعريف الخدمة (.csdef) وقسم ملف تعريف الدور في قالب ARM.

    "roleProfile": {
      "roles": {
        "value": [
          {
            "name": "WebRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            }
          },
          {
            "name": "WorkerRole1",
            "sku": {
              "name": "Standard_D1_v2",
              "capacity": "1"
            } 
          } 
        ]
      }
    }   
    
  7. (اختياري) أنشئ ملف تعريف ملحق لإضافة إضافات إلى خدمة السحابة. من أجل هذا المثال، سنضيف سطح المكتب البعيد و ملحق تشخيصات Windows Azure.

    ملاحظة

    يجب أن تكون كلمة المرور لسطح المكتب البعيد بين 8-123 حرفا ويجب أن تفي على الأقل 3 متطلبات تعقيد كلمة المرور من التالي: 1) أن تحتوي على حرف كبير 2) أن تحتوي على حرف صغير 3) أن تحتوي على رقم 4) أن تحتوي على حرف خاص 5) ولا يُسمح باستخدام أحرف التحكم

        "extensionProfile": {
          "extensions": [
            {
              "name": "RDPExtension",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Windows.Azure.Extensions",
                "type": "RDP",
                "typeHandlerVersion": "1.2.1",
                "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
              }
            },
            {
              "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
              "properties": {
                "autoUpgradeMinorVersion": true,
                "publisher": "Microsoft.Azure.Diagnostics",
                "type": "PaaSDiagnostics",
                "typeHandlerVersion": "1.5",
                "settings": "[parameters('wadPublicConfig_WebRole1')]",
                "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                "rolesAppliedTo": [
                  "WebRole1"
                ]
              }
            }
          ]
        }
    
  8. مراجعة القالب بالكامل.

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "cloudServiceName": {
          "type": "string",
          "metadata": {
            "description": "Name of the cloud service"
          }
        },
        "location": {
          "type": "string",
          "metadata": {
            "description": "Location of the cloud service"
          }
        },
        "deploymentLabel": {
          "type": "string",
          "metadata": {
            "description": "Label of the deployment"
          }
        },
        "packageSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS Uri of the CSPKG file to deploy"
          }
        },
        "configurationSasUri": {
          "type": "securestring",
          "metadata": {
            "description": "SAS Uri of the service configuration (.cscfg)"
          }
        },
        "roles": {
          "type": "array",
          "metadata": {
            "description": "Roles created in the cloud service application"
          }
        },
        "wadPublicConfig_WebRole1": {
          "type": "string",
          "metadata": {
             "description": "Public configuration of Windows Azure Diagnostics extension"
          }
        },
        "wadPrivateConfig_WebRole1": {
          "type": "securestring",
          "metadata": {
            "description": "Private configuration of Windows Azure Diagnostics extension"
          }
        },
        "vnetName": {
          "type": "string",
          "defaultValue": "[concat(parameters('cloudServiceName'), 'VNet')]",
          "metadata": {
            "description": "Name of vitual network"
          }
        },
        "publicIPName": {
          "type": "string",
          "defaultValue": "contosocsIP",
          "metadata": {
            "description": "Name of public IP address"
          }
        },
        "upgradeMode": {
          "type": "string",
          "defaultValue": "Auto",
          "metadata": {
            "UpgradeMode": "UpgradeMode of the CloudService"
          }
        }
      },
      "variables": {
        "cloudServiceName": "[parameters('cloudServiceName')]",
        "subscriptionID": "[subscription().subscriptionId]",
        "dnsName": "[variables('cloudServiceName')]",
        "lbName": "[concat(variables('cloudServiceName'), 'LB')]",
        "lbFEName": "[concat(variables('cloudServiceName'), 'LBFE')]",
        "resourcePrefix": "[concat('/subscriptions/', variables('subscriptionID'), '/resourceGroups/', resourceGroup().name, '/providers/')]"
      },
      "resources": [
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/virtualNetworks",
          "name": "[parameters('vnetName')]",
          "location": "[parameters('location')]",
          "properties": {
            "addressSpace": {
              "addressPrefixes": [
                "10.0.0.0/16"
              ]
            },
            "subnets": [
              {
                "name": "WebTier",
                "properties": {
                  "addressPrefix": "10.0.0.0/24"
                }
              }
            ]
          }
        },
        {
          "apiVersion": "2019-08-01",
          "type": "Microsoft.Network/publicIPAddresses",
          "name": "[parameters('publicIPName')]",
          "location": "[parameters('location')]",
          "properties": {
            "publicIPAllocationMethod": "Dynamic",
            "idleTimeoutInMinutes": 10,
            "publicIPAddressVersion": "IPv4",
            "dnsSettings": {
              "domainNameLabel": "[variables('dnsName')]"
            }
          },
          "sku": {
            "name": "Basic"
          }
        },
        {
          "apiVersion": "2021-03-01",
          "type": "Microsoft.Compute/cloudServices",
          "name": "[variables('cloudServiceName')]",
          "location": "[parameters('location')]",
          "tags": {
            "DeploymentLabel": "[parameters('deploymentLabel')]",
            "DeployFromVisualStudio": "true"
          },
          "dependsOn": [
            "[concat('Microsoft.Network/virtualNetworks/', parameters('vnetName'))]",
            "[concat('Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
          ],
          "properties": {
            "packageUrl": "[parameters('packageSasUri')]",
            "configurationUrl": "[parameters('configurationSasUri')]",
            "upgradeMode": "[parameters('upgradeMode')]",
            "roleProfile": {
              "roles": [
                {
                  "name": "WebRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                },
                {
                  "name": "WorkerRole1",
                  "sku": {
                    "name": "Standard_D1_v2",
                    "capacity": "1"
                  }
                }
              ]
            },
            "networkProfile": {
              "loadBalancerConfigurations": [
                {
                  "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/loadBalancers/', variables('lbName'))]",
                  "name": "[variables('lbName')]",
                  "properties": {
                    "frontendIPConfigurations": [
                      {
                        "name": "[variables('lbFEName')]",
                        "properties": {
                          "publicIPAddress": {
                            "id": "[concat(variables('resourcePrefix'), 'Microsoft.Network/publicIPAddresses/', parameters('publicIPName'))]"
                          }
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "osProfile": {
              "secrets": [
                {
                  "sourceVault": {
                    "id": "/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.KeyVault/vaults/{keyvault-name}"
                  },
                  "vaultCertificates": [
                    {
                      "certificateUrl": "https://{keyvault-name}.vault.azure.net:443/secrets/ContosoCertificate/{secret-id}"
                    }
                  ]
                }
              ]
            },
            "extensionProfile": {
              "extensions": [
                {
                  "name": "RDPExtension",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Windows.Azure.Extensions",
                    "type": "RDP",
                    "typeHandlerVersion": "1.2.1",
                    "settings": "<PublicConfig>\r\n <UserName>[Insert Username]</UserName>\r\n <Expiration>1/21/2022 12:00:00 AM</Expiration>\r\n</PublicConfig>",
                    "protectedSettings": "<PrivateConfig>\r\n <Password>[Insert Password]</Password>\r\n</PrivateConfig>"
                  }
                },
                {
                  "name": "Microsoft.Insights.VMDiagnosticsSettings_WebRole1",
                  "properties": {
                    "autoUpgradeMinorVersion": true,
                    "publisher": "Microsoft.Azure.Diagnostics",
                    "type": "PaaSDiagnostics",
                    "typeHandlerVersion": "1.5",
                    "settings": "[parameters('wadPublicConfig_WebRole1')]",
                    "protectedSettings": "[parameters('wadPrivateConfig_WebRole1')]",
                    "rolesAppliedTo": [
                      "WebRole1"
                  ]
                }
              }
            ]
          }
        }
       }
      ]
    }
    
  9. نشر ملف القالب والمعلمة (تعريف المعلمات في ملف القالب) لإنشاء نشر خدمة السحابة (الدعم الموسع). الرجاء الرجوع إلى نماذج القوالب كما هو مطلوب.

    New-AzResourceGroupDeployment -ResourceGroupName "ContosOrg" -TemplateFile "file path to your template file" -TemplateParameterFile "file path to your parameter file"
    

الخطوات التالية