Administración de grupos de recursos de Azure con TypeScript Function API

En este tutorial, creará una aplicación de función de Azure TypeScript local con API para administrar grupos de recursos de Azure e implementar la aplicación en Azure.

Características y funcionalidades:

  • Creación de un proyecto de aplicación de funciones de Azure TypeScript local en Visual Studio Code
  • Creación de código reutilizable de api de función en Visual Studio Code
  • Implementación en Azure Functions desde Visual Studio Code
  • Creación de una entidad de servicio con la CLI de Azure
  • Configuración de las opciones de aplicación local y remota con Visual Studio Code
  • Uso de DefaultAzureCredential en entornos locales y remotos para conexiones sin contraseña
  • Uso de los SDK de Azure Identity y Azure Resource Management para administrar recursos de Azure
  • Uso de las API locales y en la nube para crear, eliminar y enumerar los grupos de recursos de la suscripción

El código fuente es sencillo aunque se escriba con TypeScript. Si está familiarizado con JavaScript moderno mediante async/await, el código le resultará familiar.

Creación o uso de una suscripción de Azure existente

Necesitará una cuenta de usuario de Azure con una suscripción activa. cree una de forma gratuita.

Requisitos previos

Arquitectura de la aplicación

La aplicación proporciona los siguientes puntos de conexión de API.

Método URL Descripción
POST, DELETE http://localhost:7071/api/resourcegroup Agregue o elimine un grupo de recursos. Al agregar, incluya etiquetas (pares clave-valor) para identificar el propósito del grupo más adelante.
GET http://localhost:7071/api/resourcegroups Enumeración de todos los grupos de recursos en una suscripción.
GET http://localhost:7071/api/resources Enumeración de todos los recursos en una suscripción o grupo de recursos.

Aunque estos puntos de conexión son públicos, debe proteger los puntos de conexión de API con autenticación y autorización antes de implementarlos en el entorno activo.

Esta aplicación está limitada a una suscripción porque es el ámbito especificado al crear la entidad de servicio.

1. Preparación del entorno

Debe preparar los entornos locales y en la nube para usar el SDK de Azure Identity.

Inicio de sesión en la CLI de Azure

En un terminal de Bash, inicie sesión en la CLI de Azure con el comando siguiente:

az login

Obtención del identificador de la suscripción a Azure

  1. En un terminal de Bash, obtenga las suscripciones y busque el identificador de suscripción que desea usar. La consulta siguiente devuelve el identificador de suscripción, el nombre de la suscripción y el identificador de inquilino ordenados por nombre de suscripción.

    az account list --query "sort_by([].{Name:name, SubscriptionId:id, TenantId:tenantId}, &Name)" --output table
    
  2. Copie el identificador de suscripción en el archivo temporal anterior. Necesitará esta configuración más adelante.

Creación de una entidad de servicio de Azure

Una entidad de servicio de Azure proporciona acceso a Azure sin tener que usar sus credenciales de usuario personales. En este tutorial, la entidad de servicio se puede usar tanto en los entornos locales como en la nube. En un entorno empresarial, desearía entidades de servicio independientes para cada entorno.

  1. Determine un formato de nombre de entidad de servicio para que pueda encontrar fácilmente la entidad de servicio más adelante. Por ejemplo, varias ideas de formato son:

    • El proyecto y el propietario: resource-management-john-smith.
    • Su departamento y fecha: IT-2021-September
    • Un identificador único: 00000000-0000-0000-0000-000000000000
  2. En un terminal de Bash, cree la entidad de servicio con az ad sp create-for-rbac. Reemplace <SUBSCRIPTION-ID> con el Id. de suscripción.

    az ad sp create-for-rbac --name YOUR-SERVICE-PRINCIPAL-NAME --role Contributor --scopes /subscriptions/<SUBSCRIPTION-ID>
    
  3. Copie los resultados de salida completos en un archivo temporal. Necesitará esta configuración más adelante.

    {
      "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. Creación de una aplicación de funciones local de Azure en Visual Studio Code

Cree una aplicación de funciones de Azure en Visual Studio Code para administrar grupos de recursos de Azure.

Creación de una instancia de Function App

Use Visual Studio Code para crear una aplicación de funciones local.

  1. En un terminal de Bash, cree un nuevo directorio y cambie a él:

    mkdir my-function-app && cd my-function-app
    
  2. En un terminal de Bash, abra Visual Studio Code:

    code .
    
  3. Abra la paleta de comandos de Visual Studio Code: Ctrl + Mayús + p.

  4. Escriba Azure Functions: create new project. Utilice la siguiente tabla para responder a los mensajes:

    Prompt Valor
    Seleccione la carpeta que contendrá el proyecto de función. Seleccione el directorio predeterminado (actual)
    Selección de un idioma Seleccione TypeScript.
    Selección de un modelo de programación de TypeScript Selección del modelo V4 (versión preliminar)
    Seleccionar una plantilla para la primera función de su proyecto Seleccione Desencadenador HTTP.
    Creación de un desencadenador HTTP Escriba el nombre de la API de resourcegroups.
    Nivel de autorización Seleccione anónimo. Si continúa con este proyecto después de este artículo, cambie el nivel de autorización a la función. Obtenga más información sobre la autorización en el nivel de función.

    El proyecto reutilizable se crea y se instalan las dependencias.

Adición de la configuración de la entidad de servicio al archivo local.settings.json

  1. Abra el ./local.settings.json archivo en el directorio raíz del proyecto y agregue la sección VALUES con las cinco variables de entorno siguientes.

    {
      "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. Consulte la configuración de la sección anterior para agregar los valores. Estas variables de entorno son NECESARIAS para que el contexto use DefaultAzureCredential.

    • AZURE_TENANT_ID: valor de tenant de la salida de la entidad de servicio anterior.
    • AZURE_CLIENT_ID: valor de appId de la salida de la entidad de servicio anterior.
    • AZURE_CLIENT_SECRET: valor de password de la salida de la entidad de servicio anterior.
  3. También debe establecer el identificador de suscripción. Es necesario usar el SDK de Azure para la administración de recursos.

    • AZURE_SUBSCRIPTION_ID: la suscripción predeterminada que contiene los grupos de recursos.

El git local omite este archivo local.settings.json a propósito, para que no lo confirme accidentalmente en el código fuente.

Instalación de dependencias de npm para la administración de recursos e identidades de Azure

En un terminal de Bash integrado de Visual Studio Code, instale las dependencias del SDK de Azure para la administración de recursos e identidades de Azure.

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

Enumeración de todos los grupos de recursos en una suscripción con JavaScript

  1. Abra el archivo ./src/functions/resourcegroups.ts y reemplace el contenido por lo siguiente:

    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
    });
    

    Este archivo responde a las solicitudes de API a /api/resourcegroups y devuelve una lista de todos los grupos de recursos de la suscripción.

  2. Cree un subdirectorio con src nombre lib y cree un nuevo archivo en ese directorio denominado azure-resource-groups.ts.

  3. Copie el código siguiente en el archivo ./src/lib/azure-resource-groups.ts:

    // 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
      );
    };
    

    El archivo hace lo siguiente:

    • Obtiene el identificador de la suscripción.
    • Crea el contexto DefaultAzureCredential.
    • Crea el cliente ResourceManagementClient necesario para usar el SDK de administración de recursos.
    • Obtiene todos los grupos de recursos en la suscripción.
  4. Cree un nuevo archivo en el ./src/lib directorio denominado environment-vars.ts y copie el código siguiente en ese archivo.

    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;
    };
    

    Este archivo comprueba las variables de entorno antes de devolver el identificador de suscripción.

  5. Cree un nuevo archivo en el ./src/lib directorio denominado error.ts y copie el código siguiente en ese archivo.

    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) };
      }
    }
    

    Este archivo devuelve un error 500 con el mensaje de error. La pila se devuelve si la NODE_ENV variable no está establecida productionen .

Prueba de funciones locales

  1. En el terminal integrado de Visual Studio Code, ejecute el proyecto local:

    npm start
    
  2. Espere hasta que el terminal de Bash integrado muestre la dirección URL de la función en ejecución.

    Captura de pantalla parcial del terminal de Bash integrado de Visual Studio Code cuando la función de Azure se ejecuta localmente y muestra la dirección URL local de las API en la aplicación de funciones.

  3. Abra un segundo terminal de Bash integrado en Visual Studio Code, Ctrl + Mayús + 5 y use el siguiente comando GET cURL para usar la API:

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

    Si tiene muchos grupos de recursos en su suscripción, puede que desee canalizar la salida a un archivo para facilitar su revisión.

    curl http://localhost:7071/api/resourcegroups > resourcegroups.json
    
  4. La respuesta incluye subscriptionId y un list de todos los grupos de recursos de esa suscripción.

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

Solución de problemas

Si no pudo completar este artículo, consulte la tabla siguiente para ver si hay problemas. Si el problema no aparece en la tabla, abra una incidencia en esta página de documentación.

Problema Revisión
La aplicación no se inició. Revise los errores. Asegúrese de que ha instalado las dependencias necesarias.
La aplicación se inició, pero no se puede obtener una respuesta 200. Asegúrese de que el comando curl solicita desde la ruta local correcta.
La API devolvió una respuesta 200, pero no devolvió ningún resultado. Use la extensión de Visual Studio Code para recursos de Azure para comprobar que la suscripción tiene grupos de recursos. Si no ve ningún grupo de recursos, no se preocupe. En este tutorial se agrega una API para crear y eliminar grupos de recursos en la suscripción. Esta API se agrega después de la primera implementación del código fuente en Azure, para que aprenda cómo volver a implementar el código.

3. Creación de una aplicación de funciones de Azure basada en la nube

  1. En Visual Studio Code, seleccione el icono de Azure para abrir Azure Explorer.

  2. Seleccione el + icono para crear una nueva aplicación de funciones de Azure en la nube de Azure.

    Captura de pantalla del Explorador de Azure de Visual Studio Code con el icono de la aplicación de funciones de Azure resaltado.

  3. Seleccione Crear aplicación de funciones en Azure.

  4. Escriba un nombre único global para la nueva aplicación de funciones. El nombre debe ser único en todas las funciones de Azure. Por ejemplo, jsmith-rg-management.

  5. Seleccione la misma Node.js tiempo de ejecución de 18+ LTS que seleccionó al crear la aplicación de funciones local.

  6. Seleccione una ubicación geográfica cerca de usted, como Oeste de EE. UU. 3.

  7. Espere hasta que se valide el recurso. Puede ver Azure : Registro de actividad para obtener más información.

    Captura de pantalla del registro de actividad de Azure de Visual Studio Code que muestra el estado de creación de recursos.

4. Configuración de una aplicación de funciones de Azure basada en la nube

Debe configurar las opciones de la aplicación de Azure para conectarse a la aplicación de funciones de Azure. Localmente, esta configuración se encuentra en el archivo local.settings.json. Este proceso agrega esos valores a la aplicación en la nube.

  1. En Visual Studio Code, en el explorador de Azure, en la sección Recursos , expanda Aplicación de funciones y, a continuación, seleccione la aplicación de funciones.

  2. Haga clic con el botón derecho en Configuración de la aplicación y seleccione Agregar nueva configuración.

  3. Agregue los cuatro valores del archivo local.settings.json con el mismo nombre y valores.

    • AZURE_TENANT_ID: valor de tenant de la salida de la entidad de servicio anterior.
    • AZURE_CLIENT_ID: valor de appId de la salida de la entidad de servicio anterior.
    • AZURE_CLIENT_SECRET: valor de password de la salida de la entidad de servicio anterior.
    • AZURE_SUBSCRIPTION_ID: la suscripción predeterminada que contiene los grupos de recursos.
    • AzureWebJobsFeatureFlags:EnableWorkerIndexing

Captura de pantalla parcial del explorador de Azure de Visual Studio Code que muestra la configuración de la aplicación de funciones remota o en la nube.

5. Implementación de la aplicación de funciones de Resource Manager

Implemente una aplicación de funciones de Azure en Visual Studio Code para administrar grupos de recursos de Azure.

Uso de la extensión de Visual Studio Code para la implementación en el entorno de hospedaje

  1. En VS Code, abra el local.settings.json archivo para que esté visible. Esto hará que los pasos siguientes de copiar esos nombres y valores sean más fáciles.

  2. Seleccione el logotipo de Azure para abrir el Explorador de Azure y, después, en Functions, seleccione el icono de nube para implementar la aplicación.

    Captura de pantalla del área de trabajo local de Visual Studio Code con el icono de implementación en la nube resaltado.

    De forma alternativa, puede realizar la implementación abriendo la paleta de comandos con Ctrl + Mayús + p, escribiendo deploy to function app y ejecutando el comando Azure Functions: Deploy to Function App.

  3. Seleccione Implementar en la aplicación de funciones.

  4. Seleccione el nombre de function App que creó en la sección anterior.

  5. Cuando se le pregunte si está seguro de que desea implementar, seleccione Implementar.

  6. En el panel Salida de VS Code para Azure Functions aparece el progreso. En la implementación se implementa toda la aplicación de funciones, por lo que los cambios en todas las funciones individuales se implementan al mismo tiempo.

Comprobación de que la aplicación de funciones está disponible con el explorador

  1. Todavía en Visual Studio Code, use el explorador de Azure Functions, expanda el nodo de la suscripción de Azure, expanda el nodo de la aplicación de funciones y, a continuación, expanda Functions (read only) [Functions (solo lectura)]. Haga clic con el botón derecho en el nombre de la función y seleccione Copy Function Url (Copiar la dirección URL de la función):

    Captura de pantalla parcial del explorador de Azure de Visual Studio Code que muestra dónde copiar la dirección URL de la función.

  2. Pegue la dirección URL en un explorador y presione Entrar para solicitar la lista de grupos de recursos de la API en la nube.

6. Incorporación de API a la aplicación de funciones y reimplementación en Azure

Agregue las SIGUIENTES API y vuelva a implementar la aplicación de funciones de Azure en Visual Studio Code:

  • Adición y eliminación de grupos de recursos
  • Enumera los recursos en el grupo de recursos o la suscripción.

En este punto del tutorial, ha creado una aplicación de funciones local con una API para enumerar los grupos de recursos de la suscripción y ha implementado esa aplicación en Azure. Como desarrollador de Azure, puede crear o eliminar grupos de recursos como parte de la canalización de automatización de procesos.

Creación de una API de grupo de recursos para la aplicación de funciones

Use la extensión de Visual Studio Code para Azure Functions para agregar los archivos TypeScript a la aplicación de funciones para crear y eliminar grupos de recursos.

  1. Abra la paleta de comandos de Visual Studio Code: Ctrl + Mayús + p.

  2. Escriba Azure Functions: Create Function y presione Entrar para comenzar el proceso.

  3. Use la tabla siguiente para crear la API /api/resourcegroup :

    Prompt Value
    Seleccionar una plantilla para la función Desencadenador HTTP
    Proporcionar un nombre de función resourcegroup
    Nivel de autorización Seleccione anónimo. Si continúa con este proyecto, cambie el nivel de autorización a la función. Obtenga más información sobre la autorización en el nivel de función.
  4. ./src/functions/resourcegroup.ts Abra y reemplace todo el archivo por el código fuente siguiente.

    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. El ./src/lib/azure-resource-groups.ts archivo ya contiene el código para agregar y eliminar grupos de recursos.

Creación de la API de recursos para la aplicación de funciones

Use la extensión de Visual Studio Code para Azure Functions para agregar los archivos TypeScript a la aplicación de funciones para enumerar los recursos de un grupo de recursos.

  1. Abra la paleta de comandos de Visual Studio Code: Ctrl + Mayús + p.

  2. Escriba Azure Functions: Create Function y presione Entrar para comenzar el proceso.

  3. Use la tabla siguiente para crear la API /api/resources :

    Prompt Value
    Seleccionar una plantilla para la función Desencadenador HTTP
    Proporcionar un nombre de función resources
    Nivel de autorización Seleccione anónimo. Si continúa con este proyecto, cambie el nivel de autorización a la función. Obtenga más información sobre la autorización en el nivel de función.
  4. ./src/functions/resources.ts Abra y reemplace todo el archivo por el código fuente siguiente.

    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. Cree el archivo y copie el ./src/lib/azure-resource.ts código siguiente en él para enumerar los recursos de un grupo de recursos.

    // 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
      };
    };
    

Inicio de la aplicación de funciones local y prueba de la nueva API

  1. En el terminal integrado de Visual Studio Code, ejecute el proyecto local:

    npm start
    
  2. Espere hasta que el terminal de Bash integrado muestre la dirección URL de la función en ejecución.

    Captura de pantalla parcial del terminal de Bash integrado de Visual Studio Code cuando la función de Azure se ejecuta localmente y muestra la dirección URL local de las API en la aplicación de funciones.

  3. Use los siguientes comandos curl en un terminal de Bash integrado diferente para llamar a la API para agregar un grupo de recursos a la suscripción. Cambie el nombre del grupo de recursos para usar sus propias convenciones de nomenclatura.

    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. Use el siguiente comando curl para ver el nuevo grupo de recursos en la suscripción.

    curl http://localhost:7071/api/resource-groups
    
  5. Use el siguiente comando curl para eliminar el grupo de recursos que acaba de agregar.

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

Reimplementación de la aplicación de funciones con nuevas API en Azure

  1. En VS Code, abra la paleta de comandos con Ctrl + Mayús + p, escriba deploy to function appy ejecute el comando Azure Functions: Deploy to Function App .

  2. Seleccione la aplicación de funciones en la lista de aplicaciones.

  3. Seleccione Implementar en la ventana emergente.

  4. Espere hasta que se complete la implementación.

Comprobación de las API de Functions con el explorador

Use los comandos cURL anteriores, reemplazando la dirección localhost, por el nombre del recurso de Azure Function, http://localhost:7071 como https://myfunction.azurewebsites.net.

7. Visualización y consulta de los registros de la aplicación de funciones

Vea y consulte los registros de la aplicación de funciones de Azure en Azure Portal.

Consulta de los registros de Azure Functions

Use Azure Portal para ver y consultar los registros de la función.

  1. En VS Code, seleccione el logotipo de Azure para abrir Azure Explorer y luego, en Functions, haga clic con el botón derecho en la aplicación de funciones y seleccione Abrir en el portal.

    Así se abre Azure Functions en Azure Portal.

  2. Seleccione Application Insights en Configuración y, después, seleccione Ver datos de Application Insights.

    Captura de pantalla del explorador que muestra las opciones de menú. Seleccione Application Ideas en el Configuración y, a continuación, seleccione View Application Ideas data (Ver datos de Ideas aplicación).

    Este vínculo le lleva a un recurso de métricas independiente creado automáticamente al crear una instancia de Azure Functions con VS Code.

  3. Seleccione Registros en la sección Supervisión. Si aparece la ventana emergente Consultas, seleccione la X en la esquina superior derecha del menú emergente para cerrarlo.

  4. En el panel Esquema y filtro, en la pestaña Tablas, haga doble clic en la tabla Seguimientos.

    Así se especifica la consulta de Kusto, tracesen la ventana de consulta.

  5. Edite la consulta para buscar llamadas API:

    traces 
    | where message startswith "Executing "
    
  6. Seleccione Ejecutar.

    Si el registro no muestra ningún resultado, puede deberse a que hay unos minutos de retraso entre la solicitud HTTP a la función de Azure y la disponibilidad del registro en Kusto. Espere unos minutos y vuelva a ejecutar la consulta.

    Captura de pantalla que muestra el resultado de la tabla Seguimiento de la consulta de Kusto en Azure Portal.

    Dado que se agregó un recurso de Application Ideas automáticamente al crear la aplicación de funciones de Azure, no era necesario hacer nada adicional para obtener esta información de registro:

    • La aplicación de funciones agregó Application Insights automáticamente.
    • La herramienta de consulta está incluida en Azure Portal.
    • Puede seleccionar traces en lugar de tener que aprender a escribir una consulta de Kusto para obtener incluso la información mínima de los registros.

8. Limpieza de recursos de Azure

Eliminar el grupo de recursos

  1. En VS Code, seleccione el logotipo de Azure para abrir Azure Explorer y, después, en Functions, haga clic con el botón derecho en la aplicación de funciones y, a continuación, seleccione Abrir en el portal. Se abrirá Azure Portal en la función de Azure.

  2. En la sección Información general , busque y seleccione el nombre del grupo de recursos. Esta acción le lleva al grupo de recursos en Azure Portal.

  3. En la página del grupo de recursos se enumeran todos los recursos asociados a este tutorial.

  4. En el menú superior, seleccione Eliminar grupo de recursos.

  5. En el menú lateral, escriba el nombre del grupo de recursos y seleccione Eliminar.

Eliminación de la entidad de servicio

Para eliminar la entidad de servicio, ejecute el siguiente comando. Reemplace por <YOUR-SERVICE-PRINCIPAL-NAME> el nombre de la entidad de servicio.

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

Código de ejemplo

Pasos siguientes