Aracılığıyla paylaş


Öğretici: OpenTelemetry dağıtılmış izleme ile Azure İşlevlerini izleme

Bu makalede, tümleşik Application Insights ve OpenTelemetry desteği kullanılarak birden çok işlev çağrısı arasında dağıtılmış izleme sağlayan Azure İşlevi'nde OpenTelemetry desteği gösterilmektedir. Başlamanıza yardımcı olması için, kod projenizi ve uygulamanızın çalıştırıldığı Azure dağıtımını oluşturmak için bir Azure Geliştirici CLI (azd) şablonu kullanılır.

Bu öğreticide azd aracını şu amaçlarla kullanırsınız:

  • Bir şablondan OpenTelemetry özellikli bir proje başlatın.
  • OpenTelemetry tümleştirmesini etkinleştiren kodu gözden geçirin.
  • OpenTelemetry özellikli uygulamanızı yerel olarak çalıştırın ve doğrulayın.
  • Azure'da bir işlev uygulaması ve ilgili kaynaklar oluşturun.
  • Kod projenizi Azure'daki işlev uygulamasına dağıtın.
  • Application Insights'ta dağıtılmış izlemeyi doğrulayın.

Bu şablon tarafından oluşturulan gerekli Azure kaynakları, Azure'da güvenli ve ölçeklenebilir işlev uygulaması dağıtımları için geçerli en iyi yöntemleri izler. Aynı azd komut, kod projenizi Azure'daki yeni işlev uygulamanıza da dağıtır.

Flex Tüketim planı varsayılan olarak kullandıkça öde faturalama modelini takip eder; yani bu hızlı başlangıcı tamamlamak Azure hesabınızda birkaç Amerikan doları veya daha az bir maliyete neden olur.

Önemli

Bu makale şu anda yalnızca C#, Python ve TypeScript'i desteklemektedir. Hızlı başlangıcı tamamlamak için makalenin üst kısmındaki desteklenen dillerden birini seçin.

Önkoşullar

  • .NET 8.0 SDK

Projeyi başlatma

OpenTelemetry dağıtılmış izlemesini içeren bir şablondan yerel bir Azure Functions kod projesi oluşturmak için azd init komutunu kullanın.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu boş bir klasörde çalıştırın:

    azd init --template functions-quickstart-python-azd-otel -e flexquickstart-otel
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ortam adı, Azure'da oluşturduğunuz kaynak grubunun adında da görünür.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu boş bir klasörde çalıştırın:

    azd init --template functions-quickstart-typescript-azd-otel -e flexquickstart-otel
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ortam adı, Azure'da oluşturduğunuz kaynak grubunun adında da görünür.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu boş bir klasörde çalıştırın:

    azd init --template functions-quickstart-dotnet-azd-otel -e flexquickstart-otel
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ortam adı, Azure'da oluşturduğunuz kaynak grubunun adında da görünür.

Kodu gözden geçirin

Şablon, birlikte çalışan üç işlevle eksiksiz bir dağıtılmış izleme senaryosu oluşturur. OpenTelemetry ile ilgili temel özellikleri gözden geçirelim:

OpenTelemetry yapılandırması

Dosya, src/otel-sample/host.json İşlevler konağı için OpenTelemetry'yi etkinleştirir:

{
  "version": "2.0",
  "telemetryMode": "OpenTelemetry",
  "extensions": {
    "serviceBus": {
        "maxConcurrentCalls": 10
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 5.0.0)"
  }
}

Anahtar ayarı "telemetryMode": "OpenTelemetry" , işlev çağrıları arasında dağıtılmış izlemeyi etkinleştirir.

Dosya, src/OTelSample/host.json İşlevler konağı için OpenTelemetry'yi etkinleştirir:

{
  "version": "2.0",
  "telemetryMode": "OpenTelemetry",
  "logging": {
    "OpenTelemetry": {
      "logLevel": {
        "Host.General": "Warning"
      }
    }
  }
}

Anahtar ayarı "telemetryMode": "OpenTelemetry" , işlev çağrıları arasında dağıtılmış izlemeyi etkinleştirir.

OpenTelemetry bağımlılıkları

Dosya, src/otel-sample/requirements.txt OpenTelemetry tümleştirmesi için gerekli paketleri içerir:

azure-functions
azure-monitor-opentelemetry
requests

Application Insights ile OpenTelemetry entegrasyonunu azure-monitor-opentelemetry paketi sağlar.

Dosya, src/otel-sample/package.json OpenTelemetry tümleştirmesi için gerekli paketleri içerir:

{
  "dependencies": {
    "@azure/functions": "^4.0.0",
    "@azure/functions-opentelemetry-instrumentation": "^0.1.0",
    "@azure/monitor-opentelemetry-exporter": "^1.0.0",
    "axios": "^1.6.0"
  }
}

@azure/functions-opentelemetry-instrumentation ve @azure/monitor-opentelemetry-exporter paketleri, OpenTelemetry'yi Application Insights ile entegre eder.

Dosya, .csproj OpenTelemetry tümleştirmesi için gerekli paketleri içerir:

<PackageReference Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.4.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.OpenTelemetry" Version="1.4.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />

Bu paketler, dağıtılmış izleme için Application Insights ve HTTP enstrümantasyonu ile OpenTelemetry tümleştirmesi sağlar.

İşlev uygulaması

içindeki src/otel-sample/function_app.py işlevler dağıtılmış izleme akışını gösterir:

İlk HTTP İşlevi

@app.function_name("first_http_function")
@app.route(route="first_http_function", auth_level=func.AuthLevel.ANONYMOUS)
def first_http_function(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function (first) processed a request.')

    # Call the second function
    base_url = f"{req.url.split('/api/')[0]}/api"
    second_function_url = f"{base_url}/second_http_function"

    response = requests.get(second_function_url)
    second_function_result = response.text

    result = {
        "message": "Hello from the first function!",
        "second_function_response": second_function_result
    }

    return func.HttpResponse(
        json.dumps(result),
        status_code=200,
        mimetype="application/json"
    )

İkinci HTTP İşlevi

@app.function_name("second_http_function")
@app.route(route="second_http_function", auth_level=func.AuthLevel.ANONYMOUS)
@app.service_bus_queue_output(arg_name="outputsbmsg", queue_name="%ServiceBusQueueName%",
                              connection="ServiceBusConnection")
def second_http_function(req: func.HttpRequest, outputsbmsg: func.Out[str]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function (second) processed a request.')

    message = "This is the second function responding."

    # Send a message to the Service Bus queue
    queue_message = "Message from second HTTP function to trigger ServiceBus queue processing"
    outputsbmsg.set(queue_message)
    logging.info('Sent message to ServiceBus queue: %s', queue_message)

    return func.HttpResponse(
        message,
        status_code=200
    )

Service Bus Kuyruğu Tetikleyicisi

@app.service_bus_queue_trigger(arg_name="azservicebus", queue_name="%ServiceBusQueueName%",
                               connection="ServiceBusConnection") 
def servicebus_queue_trigger(azservicebus: func.ServiceBusMessage):
    logging.info('Python ServiceBus Queue trigger start processing a message: %s',
                azservicebus.get_body().decode('utf-8'))
    time.sleep(5)  # Simulate processing work
    logging.info('Python ServiceBus Queue trigger end processing a message')

OpenTelemetry yapılandırması src/otel-sample/index.ts içinde yapılandırılır:

import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation';
import { AzureMonitorTraceExporter, AzureMonitorLogExporter } from '@azure/monitor-opentelemetry-exporter';
import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { detectResources } from '@opentelemetry/resources';
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
import { NodeTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node';

const resource = detectResources({ detectors: getResourceDetectors() });

const tracerProvider = new NodeTracerProvider({ 
  resource, 
  spanProcessors: [new SimpleSpanProcessor(new AzureMonitorTraceExporter())] 
});
tracerProvider.register();

const loggerProvider = new LoggerProvider({
  resource,
  processors: [new SimpleLogRecordProcessor(new AzureMonitorLogExporter())],
});

registerInstrumentations({
    tracerProvider,
    loggerProvider,
    instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()],
});

İşlevler şu klasörde tanımlanır src/otel-sample/src/functions :

İlk HTTP İşlevi

export async function firstHttpFunction(
  request: HttpRequest,
  context: InvocationContext
): Promise<HttpResponseInit> {
  context.log("TypeScript HTTP trigger function (first) processed a request.");

  try {
    // Call the second function
    const baseUrl = request.url.split("/api/")[0];
    const secondFunctionUrl = `${baseUrl}/api/second_http_function`;

    const response = await axios.get(secondFunctionUrl);
    const secondFunctionResult = response.data;

    const result = {
      message: "Hello from the first function!",
      second_function_response: secondFunctionResult,
    };

    return {
      status: 200,
      body: JSON.stringify(result),
      headers: { "Content-Type": "application/json" },
    };
  } catch (error) {
    return {
      status: 500,
      body: JSON.stringify({ error: "Failed to process request" }),
    };
  }
}

İkinci HTTP İşlevi

export async function secondHttpFunction(
  request: HttpRequest,
  context: InvocationContext
): Promise<HttpResponseInit> {
  context.log("TypeScript HTTP trigger function (second) processed a request.");

  const message = "This is the second function responding.";

  // Send a message to the Service Bus queue
  const queueMessage =
    "Message from second HTTP function to trigger ServiceBus queue processing";

  context.extraOutputs.set(serviceBusOutput, queueMessage);
  context.log("Sent message to ServiceBus queue:", queueMessage);

  return {
    status: 200,
    body: message,
  };
}

Service Bus Kuyruğu Tetikleyicisi

export async function serviceBusQueueTrigger(
  message: unknown,
  context: InvocationContext
): Promise<void> {
  context.log("TypeScript ServiceBus Queue trigger start processing a message:", message);

  // Simulate processing time
  await new Promise((resolve) => setTimeout(resolve, 5000));

  context.log("TypeScript ServiceBus Queue trigger end processing a message");
}

OpenTelemetry yapılandırması src/OTelSample/Program.cs içinde kurulur:

using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.OpenTelemetry;
using OpenTelemetry.Trace;

var builder = FunctionsApplication.CreateBuilder(args);

builder.ConfigureFunctionsWebApplication();

builder.Logging.AddOpenTelemetry(logging =>
{
    logging.IncludeFormattedMessage = true;
    logging.IncludeScopes = true;
});

builder.Services.AddOpenTelemetry()    
    .WithTracing(tracing =>
    {
        tracing.AddHttpClientInstrumentation();
    });

builder.Services.AddOpenTelemetry().UseAzureMonitorExporter();
builder.Services.AddOpenTelemetry().UseFunctionsWorkerDefaults();

builder.Services.AddHttpClient();

builder.Build().Run();

İşlevler ayrı sınıf dosyalarında tanımlanır:

İlk HTTP İşlevi

public class FirstHttpTrigger
{
    private readonly ILogger<FirstHttpTrigger> _logger;
    private readonly IHttpClientFactory _httpClientFactory;

    public FirstHttpTrigger(ILogger<FirstHttpTrigger> logger, IHttpClientFactory httpClientFactory)
    {
        _logger = logger;
        _httpClientFactory = httpClientFactory;
    }

    [Function("first_http_function")]
    public async Task<IActionResult> Run(
         [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
    {
        _logger.LogInformation("first_http_function function processed a request.");

        var baseUrl = $"{req.Url.AbsoluteUri.Split("/api/")[0]}/api";
        var targetUri = $"{baseUrl}/second_http_function";

        var client = _httpClientFactory.CreateClient();
        var response = await client.GetAsync(targetUri);
        var content = await response.Content.ReadAsStringAsync();

        return new OkObjectResult($"Called second_http_function, status: {response.StatusCode}, content: {content}");
    }
}

İkinci HTTP İşlevi

public class SecondHttpTrigger
{
    private readonly ILogger<SecondHttpTrigger> _logger;

    public SecondHttpTrigger(ILogger<SecondHttpTrigger> logger)
    {
        _logger = logger;
    }

    [Function("second_http_function")]
    public MultiResponse Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
    {
        _logger.LogInformation("second_http_function function processed a request.");

        return new MultiResponse
        {
            Messages = new string[] { "Hello" },
            HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.OK)
        };
    }
}

public class MultiResponse
{
    [ServiceBusOutput("%ServiceBusQueueName%", Connection = "ServiceBusConnection")]
    public string[]? Messages { get; set; }

    [HttpResult]
    public HttpResponseData? HttpResponse { get; set; }
}

Service Bus Kuyruğu Tetikleyicisi

public class ServiceBusQueueTrigger
{
    private readonly ILogger<ServiceBusQueueTrigger> _logger;

    public ServiceBusQueueTrigger(ILogger<ServiceBusQueueTrigger> logger)
    {
        _logger = logger;
    }

    [Function("servicebus_queue_trigger")]
    public async Task Run(
        [ServiceBusTrigger("%ServiceBusQueueName%", Connection = "ServiceBusConnection")]
        ServiceBusReceivedMessage message,
        ServiceBusMessageActions messageActions)
    {
        _logger.LogInformation("Message ID: {id}", message.MessageId);
        _logger.LogInformation("Message Body: {body}", message.Body);

        // Complete the message
        await messageActions.CompleteMessageAsync(message);
    }
}

Dağıtılmış izleme akışı

Bu mimari, şu davranışla eksiksiz bir dağıtılmış izleme senaryosu oluşturur:

  1. İlk HTTP işlevi bir HTTP isteği alır ve ikinci HTTP işlevini çağırır
  2. İkinci HTTP işlevi yanıt verir ve Service Bus'a bir ileti gönderir
  3. Service Bus tetikleyicisi , işleme işinin benzetimini yapmak için iletiyi gecikmeli olarak işler

OpenTelemetry uygulamasının önemli yönleri:

  • OpenTelemetry tümleştirmesi: host.json dosyası OpenTelemetry'yi etkinleştirir "telemetryMode": "OpenTelemetry"
  • İşlev zinciri: İlk işlev HTTP isteklerini kullanarak ikincisini çağırarak bağıntılı izlemeler oluşturur
  • Service Bus tümleştirmesi: İkinci işlev, üçüncü işlevi tetikleyen Service Bus'a çıkış sağlar
  • Anonim kimlik doğrulaması: HTTP işlevleri kullanır auth_level=func.AuthLevel.ANONYMOUS, bu nedenle işlev anahtarı gerekmez

Şablon projesinin tamamını burada gözden geçirebilirsiniz.

  • OpenTelemetry tümleştirmesi: index.ts dosyası, izlemeler ve günlükler için Azure Monitor dışa aktarıcılarını kullanarak OpenTelemetry'yi yapılandırır.
  • İşlev zincirleme: İlk işlev, otomatik izleme yayma özelliğine sahip axios kullanarak ikincisini çağırır
  • Service Bus tümleştirmesi: İkinci işlev, üçüncü işlevi tetikleyen çıkış bağlamalarını kullanarak Service Bus'a çıkış oluşturur
  • Yönetilen kimlik: Tüm Service Bus bağlantıları bağlantı dizeleri yerine yönetilen kimlik kullanır
  • İşlem benzetimi: Service Bus tetikleyicisindeki 5 saniyelik gecikme, ileti işleme işinin simülasyonunu oluşturur

Şablon projesinin tamamını burada gözden geçirebilirsiniz.

  • OpenTelemetry tümleştirmesi: Dosya, Program.cs OpenTelemetry'yi Azure İzleyici dışarı aktarıcısıyla yapılandırıyor
  • İşlev zincirleme: Birinci işlev, OpenTelemetry araçlandırması ile HttpClient kullanarak ikinci işlevi çağırır.
  • Service Bus tümleştirmesi: İkinci işlev, üçüncü işlevi tetikleyen çıkış bağlamalarını kullanarak Service Bus'a çıkış oluşturur
  • Yönetilen kimlik: Tüm Service Bus bağlantıları bağlantı dizeleri yerine yönetilen kimlik kullanır
  • .NET 8 Yalıtılmış Çalışan: Daha iyi performans ve esneklik için en son Azure İşlevleri .NET Yalıtılmış Çalışan modelini kullanır

Şablon projesinin tamamını burada gözden geçirebilirsiniz.

İşlevlerinizi yerel olarak doğruladıktan sonra, bunları Azure'da yayımlamanın zamanı geldi.

Azure’a dağıtın

Bu proje, OpenTelemetry desteğiyle Azure'daki Flex Consumption planında yeni bir işlev uygulamasına bu projeyi dağıtmak için azd up komutunu kullanacak şekilde yapılandırılmıştır.

Tavsiye

Bu proje, yönetilen kimlik bağlantılarını da içeren en iyi yöntemleri izleyerek Flex tüketim planına güvenli bir dağıtım oluşturmak için kullanılan bir Bicep dosyaları kümesini içerir.

  1. Azure'da azd gerekli Azure kaynaklarını oluşturmak ve kod projenizi yeni işlev uygulamasına dağıtmak için şu komutu çalıştırın:

    azd up
    

    Kök klasör, için azure.yamlgereken tanım dosyasını içerirazd.

    Henüz oturum açmadıysanız Azure hesabınızla kimlik doğrulaması yapmanız istenir.

  2. İstendiğinde şu gerekli dağıtım parametrelerini sağlayın:

    Parametre Description
    Azure aboneliği Kaynaklarınızın oluşturulduğu abonelik.
    Azure veri merkezi konumu Yeni Azure kaynaklarını içeren kaynak grubunun oluşturulacağı Azure bölgesi. Yalnızca şu anda Esnek Tüketim planını destekleyen bölgeler gösterilir.

    Komut, azd up bu dağıtım görevlerini tamamlamak için Bicep yapılandırma dosyalarıyla bu istemlere yanıtınızı kullanır:

    • Bu gerekli Azure kaynaklarını oluşturun ve yapılandırın (eşdeğeri azd provision):

      • OpenTelemetry'nin etkinleştirildiği Azure Functions Esnek Tüketim planı ve işlev uygulaması
      • Azure Depolama (gerekli) ve Application Insights (önerilir)
      • Dağıtılmış izleme gösterimi için Service Bus ad alanı ve kuyruğu
      • Hesabınız için ilkelere ve rollere erişme
      • Yönetilen kimlikleri kullanan hizmet-hizmet bağlantıları (depolanan bağlantı dizesi yerine)
    • Kodunuzu paketleyin ve dağıtım kapsayıcısına dağıtın (eşdeğeri azd deploy). Ardından uygulama başlatılır ve dağıtılan pakette çalıştırılır.

    Komut başarıyla tamamlandıktan sonra, oluşturduğunuz kaynakların bağlantılarını görürsünüz.

Dağıtılmış izlemeyi test edin

Artık Dağıtılan işlevlerinizi çağırarak ve Application Insights'ta telemetriyi gözlemleyerek OpenTelemetry dağıtılmış izleme işlevini test edebilirsiniz.

İşlevi Azure'da çağırma

URL'lerine HTTP isteklerinde bulunarak Azure'daki işlev uç noktalarınızı çağırabilirsiniz. Bu şablondaki HTTP işlevleri anonim erişimle yapılandırıldığından işlev anahtarı gerekmez.

  1. Yerel terminalinizde veya komut isteminizde, işlev uygulamasının adını almak ve URL'yi oluşturmak için şu komutu çalıştırın:

    APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME)
    echo "Function URL: https://$APP_NAME.azurewebsites.net/api/first_http_function"
    

    komut, azd env get-value işlev uygulamanızın adını yerel ortamdan alır.

  2. URL'ye giderek işlevi tarayıcınızda test edin:

    https://your-function-app.azurewebsites.net/api/first_http_function
    

    your-function-app öğesini önceki adımdaki gerçek işlev uygulama adınızla değiştirin. Bu tek istek, üç işlevde de akan dağıtılmış bir izleme oluşturur.

Application Insights'ta dağıtılmış izlemeyi görüntüleme

İşlevi çağırdıktan sonra Application Insights'ta dağıtılmış izlemenin tamamını gözlemleyebilirsiniz:

Uyarı

telemetri verilerinin işlevinizi çağırdıktan sonra Application Insights'ta görünmesi birkaç dakika sürebilir. Verileri hemen görmüyorsanız, birkaç dakika bekleyin ve görünümü yenileyin.

  1. Azure portalında Application Insights kaynağınıza gidin (bunu işlev uygulamanızla aynı kaynak grubunda bulabilirsiniz).

  2. Üç işlevin de dağıtılmış izlemesini görmek için Uygulama eşlemesini açın. İşlevleriniz aracılığıyla HTTP isteğinden Service Bus'a giden akışı görmeniz gerekir.

  3. İsteğinizi bulmak için İşlem aramasına bakın ve izleme zaman çizelgesinin tamamını görün. İşlev uygulamanızdaki işlemleri arayın.

  4. Aşağıdakileri gösteren uçtan uca izlemeyi görmek için belirli bir işlemi seçin:

    • HTTP isteği first_http_function
    • second_http_function için iç HTTP çağrısı
    • Gönderilmekte olan Service Bus iletisi
    • servicebus_queue_trigger Service Bus'tan gelen iletiyi işleme
  5. İzleme ayrıntılarında şunları görebilirsiniz:

    • Zamanlama bilgileri: Her adımın ne kadar sürdüğü
    • Bağımlılıklar: İşlevler arasındaki bağlantılar
    • Günlükler: İzlemeyle ilişkili uygulama günlükleri
    • Performans ölçümleri: Yanıt süreleri ve aktarım hızı

Bu örnek, OpenTelemetry tümleştirmesi ile birden çok Azure İşlevi arasında uçtan uca dağıtılmış izlemeyi gösterir ve uygulamanızın davranışı ve performansı hakkında tam görünürlük sağlar.

Kodunuzu yeniden dağıtma

azd up Komutunu hem Azure kaynaklarınızı sağlamak hem de işlev uygulamanıza kod güncelleştirmeleri dağıtmak için gerektiği kadar çalıştırın.

Uyarı

En son dağıtım paketi her zaman dağıtılan kod dosyalarının üzerine yazar.

İstemlere ve tarafından azd oluşturulan tüm ortam değişkenlerine azd yönelik ilk yanıtlarınız adlandırılmış ortamınızda yerel olarak depolanır. azd env get-values Komutunu kullanarak ortamınızda Azure kaynakları oluştururken komutunun kullandığı tüm değişkenleri gözden geçirin.

Kaynakları temizle

İşlev uygulamanızla ve ilgili kaynaklarla çalışmayı bitirdiğinizde, işlev uygulamasını ve ilgili kaynaklarını Azure'dan silmek ve başka maliyetlerle karşılaşmamak için bu komutu kullanın:

azd down --no-prompt

Uyarı

seçeneği, --no-prompt sizden onay almadan kaynak grubunuzu silmenizi belirtir azd .

Bu komut yerel kod projenizi etkilemez.