Aracılığıyla paylaş


TypeScript İşlevi API'siyle Azure kaynak gruplarını yönetme

Bu öğreticide, Azure kaynak gruplarını yönetmek ve uygulamayı Azure'a dağıtmak için API'lerle yerel bir TypeScript Azure İşlevi uygulaması oluşturacaksınız.

Özellikler ve işlevler:

  • Visual Studio Code'da yerel TypeScript Azure İşlevi uygulama projesi oluşturma
  • Visual Studio Code'da işlev API'sinde ortak kod oluşturma
  • Visual Studio Code'dan Azure İşlevleri dağıtma
  • Azure CLI ile hizmet sorumlusu oluşturma
  • Visual Studio Code ile yerel ve uzak uygulama ayarlarını yapılandırma
  • Parolasız bağlantılar için hem yerel hem de uzak ortamlarda DefaultAzureCredential kullanma
  • Azure kaynaklarını yönetmek için Azure Kimliği ve Azure Kaynak Yönetimi SDK'larını kullanma
  • Aboneliğinizde kaynak grupları oluşturmak, silmek ve listelemek için yerel ve bulut API'lerinizi kullanın

Uyarı

Bu öğretici, hızlı benimsemeye yöneliktir ve bu nedenle varsayılan olarak güvenli gereksinimlere uymaz. Varsayılan olarak güvenli hedefle bu senaryo hakkında daha fazla bilgi edinmek için Güvenlikle ilgili dikkat edilmesi gerekenler bölümüne gidin.

Kaynak kodu TypeScript ile yazılmış olsa da, kaynak kodu basittir. Async/await kullanarak modern JavaScript konusunda rahatsanız kod size tanıdık gelecek.

Önkoşullar

Uygulama mimarisi

Uygulama aşağıdaki API uç noktalarını sağlar.

Metot URL Açıklama
GÖNDER,SIL http://localhost:7071/api/resourcegroup Kaynak grubu ekleme veya silme. Eklerken, daha sonra grubun amacını belirlemek için etiketleri (anahtar/değer çiftleri) ekleyin.
GET http://localhost:7071/api/resourcegroups Abonelikteki tüm kaynak gruplarını listeleyin.
GET http://localhost:7071/api/resources Abonelikteki veya kaynak grubundaki tüm kaynakları listeleyin.

Bu uç noktalar genel olsa da, canlı ortamınıza dağıtmadan önce kimlik doğrulaması ve yetkilendirme ile API uç noktalarınızın güvenliğini sağlamalısınız .

Bu uygulama, hizmet sorumlusu oluşturulurken belirtilen kapsam olduğundan bir abonelikle sınırlıdır.

1. Ortamınızı hazırlama

Azure Kimlik SDK'sını kullanmak için yerel ve bulut ortamlarınızı hazırlamanız gerekir.

Azure CLI'da oturum açma

Bash terminalinde aşağıdaki komutu kullanarak Azure CLI'da oturum açın:

az login

Azure abonelik kimliğinizi alma

  1. Bash terminalinde aboneliklerinizi alın ve kullanmak istediğiniz abonelik kimliğini bulun. Aşağıdaki sorgu abonelik adına göre sıralanmış abonelik kimliğini, abonelik adını ve kiracı kimliğini döndürür.

    az account list --query "sort_by([].{Name:name, SubscriptionId:id, TenantId:tenantId}, &Name)" --output table
    
  2. Abonelik kimliğini önceki geçici dosyaya kopyalayın. Bu ayara daha sonra ihtiyacınız olacak.

Azure hizmet sorumlusu oluşturma

Azure hizmet sorumlusu, kişisel kullanıcı kimlik bilgilerinizi kullanmak zorunda kalmadan Azure'a erişim sağlar. Bu öğreticide hizmet sorumlusu hem yerel hem de bulut ortamlarınızda kullanılabilir. Kurumsal bir ortamda, her ortam için ayrı hizmet sorumluları isteyebilirsiniz.

  1. Hizmet sorumlunuzu daha sonra kolayca bulabilmeniz için bir hizmet asıl adı biçimi belirleyin. Örneğin, çeşitli biçim fikirleri şunlardır:

    • Projeniz ve sahibiniz: resource-management-john-smith.
    • Bölümünüz ve tarihiniz: IT-2021-September
  2. Bash terminalinde az ad sp create-for-rbac ile hizmet sorumlunuzu oluşturun. değerini abonelik kimliğiniz ile değiştirin <SUBSCRIPTION-ID> .

    az ad sp create-for-rbac --name YOUR-SERVICE-PRINCIPAL-NAME --role Contributor --scopes /subscriptions/<SUBSCRIPTION-ID>
    
  3. Çıktı sonuçlarının tamamını geçici bir dosyaya kopyalayın. Bu ayarlara daha sonra ihtiyacınız olacak.

    {
      "appId": "YOUR-SERVICE-PRINCIPAL-ID",
      "displayName": "YOUR-SERVICE-PRINCIPAL-NAME",
      "name": "http://YOUR-SERVICE-PRINCIPAL-NAME",
      "password": "YOUR-SERVICE-PRINCIPAL-PASSWORD",
      "tenant": "YOUR-TENANT-ID"
    }
    

2. Visual Studio Code'da yerel Azure İşlevi uygulaması oluşturma

Azure kaynak gruplarını yönetmek için Visual Studio Code'da bir Azure İşlevi uygulaması oluşturun.

İşlev uygulaması oluşturma

Yerel bir İşlev uygulaması oluşturmak için Visual Studio Code'u kullanın.

  1. Bash terminalinde oluşturun ve yeni bir dizine geçin:

    mkdir my-function-app && cd my-function-app
    
  2. Bash terminalinde Visual Studio Code'ı açın:

    code .
    
  3. Visual Studio Code komut paletini açın: Ctrl + Shift + p.

  4. Azure Functions: create new project girin. İstemleri tamamlamak için aşağıdaki tabloyu kullanın:

    İstem Değer
    İşlev projenizi içerecek klasörü seçin Varsayılan (geçerli) dizini seçin
    Dil seçin TypeScript'i seçin.
    TypeScript programlama modeli seçme Model V4 (Önizleme) seçeneğini belirleme
    Projenizin ilk işlevi için bir şablon seçin HTTP tetikleyicisi’ni seçin.
    Yeni HTTP tetikleyicisi oluşturma API adını resourcegroupsgirin.
    Yetkilendirme düzeyi Anonim'i seçin. Bu makaleden sonra bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin.

    Proje ortak öğesi oluşturulur ve bağımlılıklar yüklenir.

local.settings.json dosyasına hizmet sorumlusu ayarları ekleme

  1. ./local.settings.json Dosyayı proje kök dizininde açın ve aşağıdaki beş ortam değişkeniyle DEĞERLER bölümünüzü ekleyin.

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "node",
        "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
        "AZURE_CLIENT_ID": "REPLACE-WITH-SERVICE-PRINCIPAL-APPID",
        "AZURE_CLIENT_SECRET": "REPLACE-WITH-SERVICE-PRINCIPAL-PASSWORD",
        "AZURE_SUBSCRIPTION_ID":"REPLACE-WITH-SUBSCRIPTION-ID",
        "AZURE_TENANT_ID":"REPLACE-WITH-SERVICE-PRINCIPAL-TENANT",
        "NODE_ENV":"development"
      }
    }
    
  2. Değerleri eklemek için önceki bölümde yer alan ayarlarınıza bakın. Bu ortam değişkenleri , bağlamın DefaultAzureCredential kullanması için GEREKLIdir.

    • AZURE_TENANT_ID: tenant yukarıdaki hizmet sorumlusu çıkışından.
    • AZURE_CLIENT_ID: appId yukarıdaki hizmet sorumlusu çıkışından.
    • AZURE_CLIENT_SECRET: password yukarıdaki hizmet sorumlusu çıkışından.
  3. Ayrıca abonelik kimliğini de ayarlamanız gerekir. Kaynak yönetimi için Azure SDK'sını kullanmak gerekir.

    • AZURE_SUBSCRIPTION_ID: Kaynak gruplarınızı içeren varsayılan aboneliğiniz.

Bu local.settings.json dosya, yerel git'iniz tarafından bilerek yoksayılır, böylece dosyayı yanlışlıkla kaynak kodunuzla işlemezsiniz.

Azure Kimlik ve Kaynak yönetimi için npm bağımlılıklarını yükleme

Visual Studio Code tümleşik bash terminalinde, Azure Kimlik ve Kaynak yönetimi için Azure SDK bağımlılıklarını yükleyin.

npm install @azure/identity @azure/arm-resources

JavaScript ile abonelikteki tüm kaynak gruplarını listeleme

  1. ./src/functions/resourcegroups.ts Dosyayı açın ve içeriğini aşağıdakilerle değiştirin:

    import { ResourceGroup } from '@azure/arm-resources';
    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      createResourceGroup,
      deleteResourceGroup
    } from '../lib/azure-resource-groups';
    import { processError } from '../lib/error';
    
    export async function resourcegroup(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        console.log(JSON.stringify(request.query));
        console.log(JSON.stringify(request.params));
    
        const name: string = request.query.get('name');
        const location: string = request.query.get('location');
        console.log(`name: ${name}`);
        console.log(`location: ${location}`);
    
        switch (request.method) {
          case 'POST': // wait for create to complete before returning
            if (!name || !location) {
              return { body: 'Missing required parameters.', status: 400 };
            }
    
            if (request.headers.get('content-type') === 'application/json') {
              // create with tags
    
              const body: Record<string, unknown> =
                (await request.json()) as Record<string, string>;
              const tags: Record<string, string> = body?.tags
                ? (body?.tags as Record<string, string>)
                : null;
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                tags
              );
              return { jsonBody: resourceGroup, status: 200 };
            } else {
              // create without tags
    
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                null
              );
              return { jsonBody: resourceGroup, status: 200 };
            }
    
          case 'DELETE': // wait for delete to complete before returning
            if (!name) {
              return { body: 'Missing required parameters.', status: 400 };
            }
            await deleteResourceGroup(name);
            return { status: 204 };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    
    app.http('resourcegroup', {
      methods: ['DELETE', 'POST'],
      authLevel: 'anonymous',
      handler: resourcegroup
    });
    

    Bu dosya, api isteklerine /api/resourcegroups yanıt verir ve abonelikteki tüm kaynak gruplarının listesini döndürür.

  2. adlı lib dizininde src bir alt dizin oluşturun ve bu dizinde adlı azure-resource-groups.tsyeni bir dosya oluşturun.

  3. Aşağıdaki kodu dosyaya ./src/lib/azure-resource-groups.ts kopyalayın:

    // Include npm dependencies
    import {
      ResourceGroup, ResourceManagementClient
    } from '@azure/arm-resources';
    import { DefaultAzureCredential } from '@azure/identity';
    import { getSubscriptionId } from './environment-vars';
    
    const subscriptionId = getSubscriptionId();
    
    // Create Azure authentication credentials
    const credentials = new DefaultAzureCredential();
    
    // Create Azure SDK client for Resource Management such as resource groups
    const resourceManagement = new ResourceManagementClient(
      credentials,
      subscriptionId
    );
    
    // all resources groups in subscription
    export const listResourceGroups = async (): Promise<{
      list: ResourceGroup[];
      subscriptionId: string;
    }> => {
      const list: ResourceGroup[] = [];
      for await (const resourceGroup of resourceManagement.resourceGroups.list()) {
        list.push(resourceGroup);
      }
      return {
        subscriptionId,
        list
      };
    };
    export const createResourceGroup = async (
      resourceGroupName: string,
      location: string,
      tags: { [propertyName: string]: string }
    ): Promise<ResourceGroup> => {
      const resourceGroupParameters = {
        location: location,
        tags
      };
    
      return await resourceManagement.resourceGroups.createOrUpdate(
        resourceGroupName,
        resourceGroupParameters
      );
    };
    export const deleteResourceGroup = async (
      resourceGroupName: string
    ): Promise<void> => {
      return await resourceManagement.resourceGroups.beginDeleteAndWait(
        resourceGroupName
      );
    };
    

    Bu dosya aşağıdakileri tamamlar:

    • Abonelik kimliğini alır
    • DefaultAzureCredential bağlamını oluşturur
    • Kaynak yönetimi SDK'sını kullanmak için gereken ResourceManagementClient'ı oluşturur.
    • Abonelikteki tüm kaynak gruplarını alır.
  4. adlı environment-vars.ts dizinde ./src/lib yeni bir dosya oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.

    export const checkAzureAuth = () => {
      // The following code is only used to check you have environment
      // variables configured. The DefaultAzureCredential reads your
      // environment - it doesn't read these variables.
      const tenantId = process.env['AZURE_TENANT_ID'];
      if (!tenantId)
        throw Error('AZURE_TENANT_ID is missing from environment variables.');
      const clientId = process.env['AZURE_CLIENT_ID'];
      if (!clientId)
        throw Error('AZURE_CLIENT_ID is missing from environment variables.');
      const secret = process.env['AZURE_CLIENT_SECRET'];
      if (!secret)
        throw Error('AZURE_CLIENT_SECRET is missing from environment variables.');
    };
    
    export const getSubscriptionId = (): string => {
      checkAzureAuth();
    
      // Get subscription from environment variables
      const subscriptionId = process.env['AZURE_SUBSCRIPTION_ID'];
      if (!subscriptionId)
        throw Error('Azure Subscription is missing from environment variables.');
      return subscriptionId;
    };
    

    Bu dosya, abonelik kimliğini döndürmeden önce ortam değişkenlerini denetler.

  5. adlı error.ts dizinde ./src/lib yeni bir dosya oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.

    export function processError(err: unknown): any {
      if (typeof err === 'string') {
        return { body: err.toUpperCase(), status: 500 };
      } else if (
        err['stack'] &&
        process.env.NODE_ENV.toLowerCase() !== 'production'
      ) {
        return { jsonBody: { stack: err['stack'], message: err['message'] } };
      } else if (err instanceof Error) {
        return { body: err.message, status: 500 };
      } else {
        return { body: JSON.stringify(err) };
      }
    }
    

    Bu dosya, hata iletisiyle birlikte 500 hatası döndürür. değişken olarak ayarlı productiondeğilse NODE_ENV yığın döndürülür.

Yerel işlevleri test et

  1. Visual Studio Code tümleşik terminalinde yerel projeyi çalıştırın:

    npm start
    
  2. Tümleşik bash terminali çalışan işlevin URL'sini görüntüleyene kadar bekleyin.

    Azure İşlevi yerel olarak çalışırken ve İşlev uygulamasında API'lerin yerel URL'sini görüntülerken Visual Studio Code'un tümleşik bash terminalinin kısmi ekran görüntüsü.

  3. Visual Studio Code, Ctrl + Shift + 5'te ikinci bir tümleşik bash terminali açın ve API'yi kullanmak için aşağıdaki GET cURL komutunu kullanın:

    curl http://localhost:7071/api/resourcegroups
    

    Aboneliğinizde çok sayıda kaynak grubu varsa, daha kolay gözden geçirmek için çıkışı bir dosyaya yöneltmek isteyebilirsiniz.

    curl http://localhost:7071/api/resourcegroups > resourcegroups.json
    
  4. Yanıt, bu list abonelikteki tüm kaynak gruplarını içerirsubscriptionId.

    {
      "subscriptionId": "ABC123",
      "list": [
            {
              "id": "/subscriptions/ABC123/resourceGroups/vmagelo-cloudshell",
              "name": "jsmith-cloudshell",
              "type": "Microsoft.Resources/resourceGroups",
              "properties": {
                "provisioningState": "Succeeded"
              },
              "location": "westeurope"
            },
            ... REMOVED FOR BREVITY ...
        ]
    }
    

Sorun giderme

Bu makaleyi tamamlayamadıysanız, sorunlar için aşağıdaki tabloya bakın. Sorununuz tabloda listelenmiyorsa, bu belge sayfasında bir sorun açın.

Sorun Düzeltme
Uygulama başlatılmadı. Hataları gözden geçirin. Gerekli bağımlılıkları yüklediğinizden emin olun.
Uygulama başlatıldı ancak 200 yanıt alamazsınız. Curl komutunun doğru yerel yoldan istediğinden emin olun.
API 200 yanıt döndürdü ancak sonuç döndürmedi. Aboneliğinizde herhangi bir kaynak grubu olduğunu doğrulamak için Azure Kaynakları için Visual Studio Code uzantısını kullanın. Herhangi bir kaynak grubu görmüyorsanız endişelenmeyin. Bu öğretici, aboneliğinizde kaynak grupları oluşturmak ve silmek için bir API ekler. Bu API, kaynak kodun Azure'a ilk dağıtımından sonra eklenerek kodunuzun nasıl yeniden dağıtıldığını öğrenmeniz sağlanır.

3. Bulut tabanlı Azure İşlevi uygulaması oluşturma

  1. Visual Studio Code'da Azure simgesini seçerek Azure Gezgini'ni açın.

  2. Simgeyi + seçerek Azure bulutunda yeni bir Azure İşlevi uygulaması oluşturun.

    Visual Studio Code'un Azure Gezgini'nin, Azure İşlevi uygulaması simgesinin vurgulandığı ekran görüntüsü.

  3. Azure'da İşlev Uygulaması Oluştur'u seçin.

  4. Yeni işlev uygulaması için genel olarak benzersiz bir ad girin. Ad tüm Azure işlevlerinde benzersiz olmalıdır. Örneğin, jsmith-rg-management.

  5. Yerel işlev uygulamanızı oluştururken seçtiğiniz Node.js 18+ LTS çalışma zamanını seçin.

  6. Batı ABD 3 gibi size yakın bir coğrafi konum seçin.

  7. Kaynak oluşturulana kadar bekleyin. Ayrıntılar için Azure: Etkinlik Günlüğü'nü izleyebilirsiniz.

    Visual Studio Code'un kaynak oluşturma durumunu gösteren Azure etkinlik günlüğünün ekran görüntüsü.

4. Bulut tabanlı Azure İşlevi uygulamasını yapılandırma

Azure İşlevi uygulamasına bağlanmak için Azure uygulama ayarlarınızı yapılandırmanız gerekir. Yerel olarak, bu ayarlar dosyanızda local.settings.json bulunur. Bu işlem bu değerleri bulut uygulamanıza ekler.

  1. Visual Studio Code'da, Azure gezgininin Kaynaklar bölümünde İşlev Uygulaması'nı genişletin ve işlev uygulamanızı seçin.

  2. Uygulama Ayarları'nı sağ tıklatın ve Yeni Ayar Ekle'yi seçin.

  3. dosyanızdaki local.settings.json dört değeri tam olarak aynı ad ve değerlerle ekleyin.

    • AZURE_TENANT_ID: tenant yukarıdaki hizmet sorumlusu çıkışından.
    • AZURE_CLIENT_ID: appId yukarıdaki hizmet sorumlusu çıkışından.
    • AZURE_CLIENT_SECRET: password yukarıdaki hizmet sorumlusu çıkışından.
    • AZURE_SUBSCRIPTION_ID: Kaynak gruplarınızı içeren varsayılan aboneliğiniz.
    • AzureWebJobsFeatureFlags:EnableWorkerIndexing

Uzak/bulut işlevinin uygulama ayarlarını gösteren Visual Studio Code'un Azure gezgininin kısmi ekran görüntüsü.

5. Resource Manager işlev uygulamasını dağıtma

Azure kaynak gruplarını yönetmek için Visual Studio Code'da bir Azure İşlevi uygulaması dağıtın.

Barındırma ortamına dağıtmak için Visual Studio Code uzantısını kullanma

  1. VS Code'da, görünür olması için dosyayı açın local.settings.json . Bu, bu adları ve değerleri kopyalama işleminin sonraki adımlarını kolaylaştırır.

  2. Azure Gezgini'ni açmak için Azure logosunu seçin, ardından İşlevler'in altında bulut simgesini seçerek uygulamanızı dağıtın.

    Bulut dağıtımı simgesinin vurgulandığı Visual Studio Code'un yerel Çalışma Alanı alanının ekran görüntüsü.

    Alternatif olarak, Komut Paleti'ni Ctrl + Shift + p ile açarak, girin deploy to function appve Azure İşlevleri: İşlev Uygulamasına Dağıt komutunu çalıştırarak dağıtabilirsiniz.

  3. İşlev uygulamasına dağıt'ı seçin.

  4. Önceki bölümde oluşturduğunuz İşlev Uygulaması adını seçin.

  5. Dağıtmak istediğinizden emin olup olmadığınız sorulduğunda Dağıt'ı seçin.

  6. Azure İşlevleri için VS Code Çıktı paneli ilerleme durumunu gösterir. Dağıtım sırasında İşlevler uygulamasının tamamı dağıtılır, bu nedenle tek tek tüm işlevlerde yapılan değişiklikler aynı anda dağıtılır.

İşlevler uygulamasının tarayıcıyla kullanılabilir olduğunu doğrulama

  1. Visual Studio Code'dayken Azure İşlevleri gezginini kullanın, Azure aboneliğinizin düğümünü genişletin, İşlevler uygulamanızın düğümünü genişletin ve ardından İşlevler (salt okunur) seçeneğini genişletin. İşlev adına sağ tıklayın ve İşlev Url'sini Kopyala'yı seçin:

    İşlevin URL'sinin kopyalandığı yeri gösteren Visual Studio Code'un Azure gezgininin kısmi ekran görüntüsü.

  2. URL'yi bir tarayıcıya yapıştırın ve bulut API'sinden kaynak grubu listesini istemek için Enter tuşuna basın.

6. İşlev uygulamasına API ekleme ve Azure'a yeniden dağıtma

Aşağıdaki API'leri ekleyin ve Ardından Visual Studio Code'da Azure İşlevi uygulamanızı yeniden dağıtın:

  • Kaynak grupları ekleme ve silme
  • Kaynak grubu veya abonelikteki kaynakları listeleyin.

Öğreticinin bu noktasında, aboneliğinizin kaynak gruplarını listelemek için bir API ile yerel bir işlev uygulaması oluşturdunuz ve bu uygulamayı Azure'a dağıttınız. Azure geliştiricisi olarak, işlem otomasyonu işlem hattınızın bir parçası olarak kaynak grupları oluşturmak veya silmek isteyebilirsiniz.

İşlev uygulamanız için resourcegroup API'sini oluşturma

Azure İşlevleri için Visual Studio Code uzantısını kullanarak işlev uygulamanıza TypeScript dosyalarını ekleyerek kaynak gruplarını oluşturun ve silin.

  1. Visual Studio Code komut paletini açın: Ctrl + Shift + p.

  2. Enter tuşuna Azure Functions: Create Function basın ve işlemi başlatmak için enter tuşuna basın.

  3. /api/resourcegroup API'sini oluşturmak için aşağıdaki tabloyu kullanın:

    İstem Değer
    İşleviniz için şablon seçme HTTP tetikleyicisi
    İşlev adı belirtin resourcegroup
    Yetkilendirme düzeyi Anonim'i seçin. Bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin.
  4. ./src/functions/resourcegroup.ts dosyasını açın ve dosyasının tamamını aşağıdaki kaynak koduyla değiştirin.

    import { ResourceGroup } from '@azure/arm-resources';
    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      createResourceGroup,
      deleteResourceGroup
    } from '../lib/azure-resource-groups';
    import { processError } from '../lib/error';
    
    export async function resourcegroup(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        console.log(JSON.stringify(request.query));
        console.log(JSON.stringify(request.params));
    
        const name: string = request.query.get('name');
        const location: string = request.query.get('location');
        console.log(`name: ${name}`);
        console.log(`location: ${location}`);
    
        switch (request.method) {
          case 'POST': // wait for create to complete before returning
            if (!name || !location) {
              return { body: 'Missing required parameters.', status: 400 };
            }
    
            if (request.headers.get('content-type') === 'application/json') {
              // create with tags
    
              const body: Record<string, unknown> =
                (await request.json()) as Record<string, string>;
              const tags: Record<string, string> = body?.tags
                ? (body?.tags as Record<string, string>)
                : null;
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                tags
              );
              return { jsonBody: resourceGroup, status: 200 };
            } else {
              // create without tags
    
              const resourceGroup: ResourceGroup = await createResourceGroup(
                name,
                location,
                null
              );
              return { jsonBody: resourceGroup, status: 200 };
            }
    
          case 'DELETE': // wait for delete to complete before returning
            if (!name) {
              return { body: 'Missing required parameters.', status: 400 };
            }
            await deleteResourceGroup(name);
            return { status: 204 };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    
    app.http('resourcegroup', {
      methods: ['DELETE', 'POST'],
      authLevel: 'anonymous',
      handler: resourcegroup
    });
    
  5. Dosya zaten ./src/lib/azure-resource-groups.ts kaynak grupları eklemek ve silmek için gereken kodu içerir.

İşlev uygulamanız için kaynak API'sini oluşturma

Bir kaynak grubundaki kaynakları listelemek üzere işlev uygulamanıza TypeScript dosyalarını eklemek üzere Azure İşlevleri için Visual Studio Code uzantısını kullanın.

  1. Visual Studio Code komut paletini açın: Ctrl + Shift + p.

  2. Enter tuşuna Azure Functions: Create Function basın ve işlemi başlatmak için enter tuşuna basın.

  3. /api/resources API'sini oluşturmak için aşağıdaki tabloyu kullanın:

    İstem Değer
    İşleviniz için şablon seçme HTTP tetikleyicisi
    İşlev adı belirtin resources
    Yetkilendirme düzeyi Anonim'i seçin. Bu projeye devam ederseniz yetkilendirme düzeyini işlev olarak değiştirin. İşlev düzeyinde yetkilendirme hakkında daha fazla bilgi edinin.
  4. ./src/functions/resources.ts dosyasını açın ve dosyasının tamamını aşağıdaki kaynak koduyla değiştirin.

    import {
      app,
      HttpRequest,
      HttpResponseInit,
      InvocationContext
    } from '@azure/functions';
    import {
      listResourceByResourceGroup, listResourceBySubscription
    } from '../lib/azure-resource';
    import { processError } from '../lib/error';
    
    export async function resources(
      request: HttpRequest,
      context: InvocationContext
    ): Promise<HttpResponseInit> {
      try {
        const resourceGroupName: string = request.query.get('resourceGroupName');
        context.log(`resourceGroupName: '${resourceGroupName}'`);
    
        if (resourceGroupName) {
          const resourcesByName = await listResourceByResourceGroup(
            resourceGroupName
          );
          return { jsonBody: resourcesByName };
        } else {
          const resourcesBySubscription = await listResourceBySubscription();
          return { jsonBody: resourcesBySubscription };
        }
      } catch (err: unknown) {
        return processError(err);
      }
    }
    app.http('resources', {
      methods: ['GET'],
      authLevel: 'anonymous',
      handler: resources
    });
    
  5. Bir kaynak grubundaki ./src/lib/azure-resource.ts kaynakları listelemek için dosyayı oluşturun ve aşağıdaki kodu bu dosyaya kopyalayın.

    // Include npm dependencies
    import { Resource, ResourceManagementClient } from '@azure/arm-resources';
    import { DefaultAzureCredential } from '@azure/identity';
    import { getSubscriptionId } from './environment-vars';
    
    const subscriptionId = getSubscriptionId();
    
    // Create Azure authentication credentials
    const credentials = new DefaultAzureCredential();
    
    // Create Azure SDK client for Resource Management such as resource groups
    const resourceManagement = new ResourceManagementClient(
      credentials,
      subscriptionId
    );
    
    // all resources groups in subscription
    export const listResourceBySubscription = async (): Promise<{
      list: Resource[];
      subscriptionId: string;
    }> => {
      const list: Resource[] = [];
    
      for await (const resource of resourceManagement.resources.list()) {
        list.push(resource);
      }
    
      return {
        subscriptionId,
        list
      };
    };
    // all resources groups in resource group
    export const listResourceByResourceGroup = async (
      resourceGroupName: string
    ): Promise<{
      list: Resource[];
      subscriptionId: string;
      resourceGroupName: string;
    }> => {
      const list: Resource[] = [];
    
      for await (const resource of resourceManagement.resources.listByResourceGroup(
        resourceGroupName
      )) {
        list.push(resource);
      }
    
      return {
        subscriptionId,
        resourceGroupName,
        list
      };
    };
    

Yerel işlev uygulamanızı başlatın ve yeni API'yi test edin

  1. Visual Studio Code tümleşik terminalinde yerel projeyi çalıştırın:

    npm start
    
  2. Tümleşik bash terminali çalışan işlevin URL'sini görüntüleyene kadar bekleyin.

    Azure İşlevi yerel olarak çalışırken ve İşlev uygulamasında API'ler için yerel URL'leri görüntülerken Visual Studio Code'un tümleşik bash terminalinin kısmi ekran görüntüsü.

  3. Api'nizi çağırmak ve aboneliğinize bir kaynak grubu eklemek için farklı bir tümleşik bash terminalinde aşağıdaki curl komutlarını kullanın. Kendi adlandırma kurallarınızı kullanmak için kaynak grubunun adını değiştirin.

    curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus'
    
    curl -X POST 'http://localhost:7071/api/resourcegroup?name=my-test-1&location=westus' \
      -H 'content-type: application/json' \
      -d '{"tags": {"a":"b"}}'
    
  4. Aboneliğinizde listelenen yeni kaynak grubunu görmek için aşağıdaki curl komutunu kullanın.

    curl http://localhost:7071/api/resource-groups
    
  5. Yeni eklediğiniz kaynak grubunu silmek için aşağıdaki curl komutunu kullanın.

    curl -X DELETE 'http://localhost:7071/api/resourcegroup?name=my-test-1' \
      -H 'Content-Type: application/json'
    

İşlev uygulamanızı yeni API'lerle Azure'a yeniden dağıtma

  1. VS Code'da, Komut Paleti'ni Ctrl + Shift + p ile açarak, girin deploy to function appve Azure İşlevleri: İşlev Uygulamasına Dağıt komutunu çalıştırarak dağıtın.

  2. Uygulama listesinden işlev uygulamanızı seçin.

  3. Açılır pencerede Dağıt'ı seçin.

  4. Dağıtım tamamlanana kadar bekleyin.

tarayıcı ile İşlev API'lerini doğrulama

Localhost adresini http://localhost:7071 gibi Azure İşlevi kaynak adınızla https://myfunction.azurewebsites.netdeğiştirerek önceki cURL komutlarını kullanın.

7. İşlev uygulaması günlüklerinizi görüntüleme ve sorgulama

Azure portalında Azure İşlevi uygulama günlüklerini görüntüleyin ve sorgular.

Azure İşlevi günlüklerinizi sorgulama

İşlev günlüklerinizi görüntülemek ve sorgulamak için Azure portalını kullanın.

  1. VS Code'da Azure gezginini açmak için Azure logosunu seçin, ardından İşlevler'in altında işlev uygulamanıza sağ tıklayın ve portalda aç'ı seçin.

    Bu, Azure portalını Azure İşlevinize açar.

  2. Ayarlar'dan Application Insights'ı ve ardından Application Insights verilerini görüntüle'yi seçin.

    Menü seçeneklerini gösteren tarayıcı ekran görüntüsü. Ayarlar'dan Application Insights'ı ve ardından Application Insights verilerini görüntüle'yi seçin.

    Bu bağlantı, VS Code ile Azure İşlevinizi oluştururken sizin için oluşturulan ayrı ölçüm kaynağınıza götürür.

  3. İzleme bölümünde Günlükler'i seçin. Sorgular açılır penceresi görüntülenirse, kapatmak için açılır pencerenin sağ üst köşesindeki X işaretini seçin.

  4. Şema ve Filtre bölmesindeki Tablolar sekmesinde izlemeler tablosuna çift tıklayın.

    Bu işlem Kusto traces sorgusunu sorgu penceresine girer.

  5. API çağrılarını aramak için sorguyu düzenleyin:

    traces 
    | where message startswith "Executing "
    
  6. Çalıştır seçin.

    Günlükte herhangi bir sonuç görüntülenmiyorsa bunun nedeni Azure İşlevi'ne http isteği ile Kusto'daki günlük kullanılabilirliği arasında birkaç dakika gecikme olması olabilir. Birkaç dakika bekleyin ve sorguyu yeniden çalıştırın.

    İzleme tablosu için Azure portalı Kusto sorgu sonucunu gösteren tarayıcı ekran görüntüsü.

    Azure İşlevi uygulamasını oluştururken sizin için bir Application Insights kaynağı eklendiğinden, bu günlük bilgilerini almak için ek bir işlem yapmanız gerekmez:

    • İşlev uygulaması sizin için Application Insights ekledi.
    • Sorgu aracı Azure portalına eklenir.
    • Günlüklerinizden minimum bilgileri bile almak için kusto sorgusu yazmayı öğrenmek zorunda kalmadan seçebilirsiniztraces.

8. Azure kaynaklarını temizleme

Kaynak grubunu silme

  1. VS Code'da Azure gezginini açmak için Azure logosunu seçin, ardından İşlevler'in altında işlev uygulamanıza sağ tıklayın ve portalda aç'ı seçin. Bu, Azure portalını Azure İşlevinize açar.

  2. Genel Bakış bölümünde kaynak grubu adını bulun ve seçin. Bu eylem sizi Azure portalındaki kaynak grubuna götürür.

  3. Kaynak grubu sayfasında bu öğreticiyle ilişkili tüm kaynaklar listelenir.

  4. Üstteki menüde Kaynak grubunu sil'i seçin.

  5. Yan menüde kaynak grubunun adını girin ve Sil'i seçin.

Hizmet sorumlusunu silme

Hizmet sorumlusunu silmek için aşağıdaki komutu çalıştırın. değerini hizmet sorumlunuzun adıyla değiştirin <YOUR-SERVICE-PRINCIPAL-NAME> .

az ad sp delete --id <YOUR-SERVICE-PRINCIPAL-NAME>

Örnek kod

Güvenlik konuları

Bu çözüm, başlangıç öğreticisi olarak varsayılan olarak güvenli uygulamaları göstermez. Bu, çözümü dağıtmada başarılı olmanıza olanak sağlamak için bilerek yapılır. Bu başarılı dağıtımdan sonraki adım, kaynakların güvenliğini sağlamaktır. Bu çözüm üç Azure hizmeti kullanır ve her birinin kendi güvenlik özellikleri ve varsayılan olarak güvenli yapılandırma ile ilgili dikkat edilmesi gerekenler vardır:

Sonraki adımlar