كيفية ترجمة البنية الأساسية الخاصة بك إلى قالب IaC

تساعد خدمة الاتصال or المستخدمين على توصيل خدمات الحوسبة الخاصة بهم باستهداف خدمات الدعم ببضع نقرات أو أوامر فقط. عند الانتقال من البدء إلى مرحلة الإنتاج، يحتاج المستخدمون أيضا إلى الانتقال من استخدام التكوينات اليدوية إلى استخدام قوالب البنية الأساسية كتعليق برمجي (IaC) في مسارات CI/CD الخاصة بهم. في هذا الدليل، نعرض كيفية ترجمة خدمات Azure المتصلة إلى قوالب IaC.

المتطلبات الأساسية

  • يفترض هذا الدليل أنك على علم بقيود الخدمة الاتصال أو IaC.

نظرة عامة على الحل

عادة ما تتضمن ترجمة البنية الأساسية إلى قوالب IaC جزأين رئيسيين: منطق توفير خدمات المصدر والهدف، ومنطق بناء الاتصالات. لتنفيذ المنطق لتوفير خدمات المصدر والهدف، هناك خياران:

  • تأليف القالب من البداية
  • تصدير القالب من Azure وتلميعه

لتنفيذ المنطق لبناء الاتصالات، هناك ثلاثة خيارات:

  • استخدام خدمة الاتصال أو وتخزين التكوين في تكوين التطبيق
  • استخدام خدمة الاتصال أو في القالب
  • استخدام منطق القالب لتكوين خدمات المصدر والهدف مباشرة

يمكن أن تنتج مجموعات من هذه الخيارات المختلفة حلولا مختلفة. نظرا لقيود IaC في خدمة الاتصال أو، نوصي بتنفيذ الحلول التالية بالترتيب المعروض أدناه. لتطبيق هذه الحلول، يجب أن تفهم أدوات IaC والتدقيق النحوي لتأليف القالب.

حل مصدر التوفير والهدف إنشاء اتصال السيناريو القابل للتطبيق المزايا العيوب
1 التأليف من البداية استخدام خدمة الاتصال أو وتخزين التكوين في تكوين التطبيق التحقق من الحياة على موارد السحابة قبل السماح بنسبة استخدام الشبكة المباشرة - القالب بسيط وقابل للقراءة
- خدمة الاتصال أو يجلب قيمة إضافية
- لم يتم تقديم أي مشكلة IaC بواسطة خدمة الاتصال or
- تحتاج إلى تبعية إضافية لقراءة التكوين من App Configuration
- تكلفة التحقق من فعالية موارد السحابة
2 التأليف من البداية استخدام الاتصال الخدمة التحقق من الحياة على موارد السحابة قبل السماح بنسبة استخدام الشبكة المباشرة - القالب بسيط وقابل للقراءة
- خدمة الاتصال أو يجلب قيمة إضافية
- تكلفة التحقق من فعالية موارد السحابة
3 التأليف من البداية تكوين خدمات المصدر والهدف مباشرة في القالب لا يوجد فحص للحيوية على موارد السحابة - القالب بسيط وقابل للقراءة - ميزات الاتصال أو الخدمة غير متوفرة
4 التصدير والبولندية استخدام خدمة الاتصال أو وتخزين التكوين في تكوين التطبيق التحقق من الحياة على موارد السحابة قبل السماح بنسبة استخدام الشبكة المباشرة - الموارد هي نفسها تماما كما هو الحال في السحابة
- خدمة الاتصال أو يجلب قيمة إضافية
- لم يتم تقديم أي مشكلة IaC بواسطة خدمة الاتصال or
- تحتاج إلى تبعية إضافية لقراءة التكوين من App Configuration
- تكلفة التحقق من فعالية موارد السحابة
- يدعم قوالب ARM فقط
- الجهود المطلوبة لفهم القالب وتلميعه
5 التصدير والبولندية استخدام الاتصال الخدمة التحقق من الحياة على موارد السحابة قبل السماح بنسبة استخدام الشبكة المباشرة - الموارد هي نفسها تماما كما هو الحال في السحابة
- خدمة الاتصال أو يجلب قيمة إضافية
- تكلفة التحقق من فعالية موارد السحابة
- يدعم قوالب ARM فقط
- الجهود المطلوبة لفهم القالب وتلميعه
6 التصدير والبولندية تكوين خدمات المصدر والهدف مباشرة في القالب لا يوجد فحص للحيوية على موارد السحابة - الموارد هي نفسها تماما كما هو الحال على السحابة - دعم قالب ARM فقط
- الجهود المبذولة لفهم القالب وتلميعه
- ميزات الاتصال أو الخدمة غير متوفرة

قوالب التأليف

توضح الأقسام التالية كيفية إنشاء تطبيق ويب وحساب تخزين وتوصيلهما بهوية معينة من قبل النظام باستخدام Bicep. يوضح كيفية القيام بذلك باستخدام Service الاتصال or واستخدام منطق القالب.

توفير خدمات المصدر والهدف

التأليف من البداية

يعد تأليف القالب من البداية الطريقة المفضلة والموصى بها لتوفير خدمات المصدر والهدف، حيث إنه من السهل البدء ويجعل القالب بسيطا وقابلا للقراءة. فيما يلي مثال، باستخدام الحد الأدنى من مجموعة المعلمات لإنشاء تطبيق ويب وحساب تخزين.

// This template creates a webapp and a storage account.
// In order to make it more readable, we use only the mininal set of parameters to create the resources.

param location string = resourceGroup().location
// App Service plan parameters
param planName string = 'plan_${uniqueString(resourceGroup().id)}'
param kind string = 'linux'
param reserved bool = true
param sku string = 'B1'
// Webapp parameters
param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param linuxFxVersion string = 'PYTHON|3.8'
param identityType string = 'SystemAssigned'
param appSettings array = []
// Storage account parameters
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'


// Create an app service plan 
resource appServicePlan 'Microsoft.Web/serverfarms@2022-09-01' = {
  name: planName
  location: location
  kind: kind
  sku: {
    name: sku
  }
  properties: {
    reserved: reserved
  }
}


// Create a web app
resource appService 'Microsoft.Web/sites@2022-09-01' = {
  name: webAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    siteConfig: {
      linuxFxVersion: linuxFxVersion
      appSettings: appSettings
    }
  }
  identity: {
    type: identityType
  }
}


// Create a storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

التصدير والبولندية

إذا كانت الموارد التي تقوم بتوفيرها هي بالضبط نفس الموارد الموجودة لديك في السحابة، فقد يكون تصدير القالب من Azure خيارا آخر. الفرضيتان لهذا الأسلوب هما: الموارد موجودة في Azure وأنت تستخدم قوالب ARM ل IaC الخاص بك. Export template عادة ما يكون الزر في أسفل الشريط الجانبي على مدخل Microsoft Azure. يعكس قالب ARM المصدر الحالات الحالية للمورد، بما في ذلك الإعدادات التي تم تكوينها بواسطة Service الاتصال or. تحتاج عادة إلى معرفة خصائص المورد لتلميع القالب المصدر.

لقطة شاشة لمدخل Azure، تصدير قالب ذراع لتطبيق ويب.

بناء منطق الاتصال

استخدام خدمة الاتصال أو وتخزين التكوين في تكوين التطبيق

استخدام App Configuration لتخزين التكوين بشكل طبيعي يدعم سيناريوهات IaC. لذلك نوصي باستخدام هذا الأسلوب لإنشاء قالب IaC الخاص بك إذا كان ذلك ممكنا.

للحصول على إرشادات المدخل البسيطة، يمكنك الرجوع إلى هذا البرنامج التعليمي لتكوين التطبيق. لإضافة هذه الميزة إلى ملف bicep، أضف معرف تكوين التطبيق في حمولة Service الاتصال or.

resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: storageAccountName
}

resource appConfiguration 'Microsoft.AppConfiguration/configurationStores@2023-03-01' existing = {
  name: appConfigurationName
}

resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
  name: connectorName
  scope: webApp
  properties: {
    clientType: 'python'
    targetService: {
      type: 'AzureResource'
      id: storageAccount.id
    }
    authInfo: {
      authType: 'systemAssignedIdentity'
    }
    configurationInfo: {
      configurationStore: {
        appConfigurationId: appConfiguration.id
      }
    }
  }
}

استخدام خدمة الاتصال أو

يعد إنشاء اتصالات بين الخدمة المصدر والهدف باستخدام خدمة الاتصال أو الطريقة المفضلة والموصى بها إذا كان قيد الخدمة الاتصال أو IaC لا يهم للسيناريو الخاص بك. يجعل service الاتصال or القالب أبسط ويوفر أيضا عناصر إضافية، مثل التحقق من صحة الاتصال، والذي لن يكون لديك إذا كنت تنشئ اتصالات من خلال منطق القالب مباشرة.

// The template builds a connection between a webapp and a storage account 
// with a system-assigned identity using Service Connector

param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param connectorName string = 'connector_${uniqueString(resourceGroup().id)}'

// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

// Get an existig storage
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: storageAccountName
}

// Create a Service Connector resource for the webapp 
// to connect to a storage account using system identity
resource serviceConnector 'Microsoft.ServiceLinker/linkers@2022-05-01' = {
  name: connectorName
  scope: webApp
  properties: {
    clientType: 'python'
    targetService: {
      type: 'AzureResource'
      id: storageAccount.id
    }
    authInfo: {
      authType: 'systemAssignedIdentity'
    }
  }
}

للحصول على تنسيقات الخصائص والقيم المطلوبة عند إنشاء مورد خدمة الاتصال أو، تحقق من كيفية توفير المعلمات الصحيحة. يمكنك أيضا معاينة وتنزيل قالب ARM للرجوع إليه عند إنشاء مورد Service الاتصال or في مدخل Microsoft Azure.

لقطة شاشة لمدخل Azure، وتصدير قالب ذراع مورد موصل الخدمة.

استخدام منطق القالب

بالنسبة للسيناريوهات التي تتعلق فيها قيود الخدمة الاتصال أو IaC، ضع في اعتبارك إنشاء الاتصالات باستخدام منطق القالب مباشرة. القالب التالي هو مثال يوضح كيفية توصيل حساب تخزين بتطبيق ويب باستخدام هوية معينة من قبل النظام.

// The template builds a connection between a webapp and a storage account 
// with a system-assigned identity without using Service Connector

param webAppName string = 'webapp-${uniqueString(resourceGroup().id)}'
param storageAccountName string = 'account${uniqueString(resourceGroup().id)}'
param storageBlobDataContributorRole string  = 'ba92f5b4-2d11-453d-a403-e96b0029c9fe'

// Get an existing webapp
resource webApp 'Microsoft.Web/sites@2022-09-01' existing = {
  name: webAppName
}

// Get an existing storage account
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' existing = {
  name: storageAccountName
}

// Operation: Enable system-assigned identity on the source service
// No action needed as this is enabled when creating the webapp

// Operation: Configure the target service's endpoint on the source service's app settings
resource appSettings 'Microsoft.Web/sites/config@2022-09-01' = {
  name: 'appsettings'
  parent: webApp
  properties: {
    AZURE_STORAGEBLOB_RESOURCEENDPOINT: storageAccount.properties.primaryEndpoints.blob
  }
}

// Operation: Configure firewall on the target service to allow the source service's outbound IPs
// No action needed as storage account allows all IPs by default

// Operation: Create role assignment for the source service's identity on the target service
resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(resourceGroup().id, storageBlobDataContributorRole)
  properties: {
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', storageBlobDataContributorRole)
    principalId: webApp.identity.principalId
  }
}

عند إنشاء اتصالات باستخدام منطق القالب مباشرة، من المهم فهم ما تفعله الخدمة الاتصال or لكل نوع من أنواع المصادقة، حيث أن منطق القالب يعادل عمليات الواجهة الخلفية للخدمة الاتصال أو. يعرض الجدول التالي تفاصيل العملية التي تحتاج إلى ترجمتها إلى منطق القالب لكل نوع من أنواع المصادقة.

نوع المصادقة عمليات الاتصال أو الخدمة
بيانات سرية / سلسلة الاتصال - تكوين سلسلة الاتصال الخدمة الهدف على إعدادات تطبيق الخدمة المصدر
- تكوين جدار الحماية على الخدمة الهدف للسماح ب IPs الصادرة للخدمة المصدر
الهوية المُدارة التي يُعيّنها النظام - تكوين نقطة نهاية الخدمة الهدف على إعدادات تطبيق الخدمة المصدر
- تكوين جدار الحماية على الخدمة الهدف للسماح ب IPs الصادرة للخدمة المصدر
- تمكين الهوية المعينة من قبل النظام على الخدمة المصدر
- إنشاء تعيين دور لهوية الخدمة المصدر على الخدمة الهدف
الهوية المُدارة التي يعيّنها المُستخدم - تكوين نقطة نهاية الخدمة الهدف على إعدادات تطبيق الخدمة المصدر
- تكوين جدار الحماية على الخدمة الهدف للسماح ب IPs الصادرة للخدمة المصدر
- ربط الهوية المعينة للمستخدم بالخدمة المصدر
- إنشاء تعيين دور للهوية المعينة للمستخدم على الخدمة الهدف
كيان الخدمة - تكوين نقطة نهاية الخدمة الهدف على إعدادات تطبيق الخدمة المصدر
- تكوين appId الخاص بكيان الخدمة والسر على إعدادات تطبيق الخدمة المصدر
- تكوين جدار الحماية على الخدمة الهدف للسماح ب IPs الصادرة للخدمة المصدر
- إنشاء تعيين دور لمدير الخدمة على الخدمة الهدف