Azure Functions is a powerful serverless compute service that enables organizations to build event-driven applications with minimal infrastructure management. While its scalability and flexibility make it an attractive choice for modern cloud applications, managing costs effectively is essential to avoid unexpected expenses.

This article explores the key factors influencing Azure Functions pricing and provides a comprehensive guide to optimizing costs. From understanding different pricing models—Consumption Plan, Premium Plan, and Dedicated Plan—to analyzing cost drivers such as execution time, memory allocation, function invocations, and outbound network traffic, we break down strategies to minimize expenses while maintaining performance.

Through best practices such as optimizing function execution time, batching events, right-sizing memory allocation, and reducing cold starts, developers can fine-tune their Azure Functions workloads for cost efficiency. Additionally, we cover hidden costs, including storage, monitoring, and external API dependencies, to help organizations achieve a transparent and predictable cost structure.

To support cost estimation and budgeting, we also delve into Azure’s built-in tools like Azure Cost Management + Billing, Pricing Calculator, and budget alerts. By leveraging these tools and applying optimization techniques, organizations can maintain cost-effective, scalable, and high-performance Azure Functions deployments.

Let’s explore the detailed cost considerations and strategies to ensure you’re getting the most out of Azure Functions without breaking your budget. 🚀

Pricing Models for Azure Functions

Azure Functions offers a serverless compute model where organizations can run code in response to events without provisioning or managing servers. However, the cost of running functions can vary significantly depending on the selected pricing plan.

Understanding the pricing models available in Azure Functions is crucial for optimizing costs while maintaining performance. The right plan depends on factors such as workload predictability, execution frequency, cold start tolerance, and networking needs.

Azure provides three primary pricing models for Azure Functions:

  1. Consumption Plan – Pay only for actual execution time and resources consumed.
  2. Premium Plan – Offers pre-warmed instances for better performance and reduced cold starts.
  3. Dedicated (App Service) Plan – Runs functions on reserved infrastructure, ideal for consistent workloads.

Each pricing model has unique advantages and trade-offs. Selecting the optimal plan requires evaluating execution time, memory allocation, scaling needs, and networking costs.

Azure Functions offer multiple pricing models, each with different cost structures:

PlanDescriptionBest Use Case
Consumption PlanPay-per-use; costs depend on execution time and resource consumption.Best for irregular workloads with unpredictable usage.
Premium PlanPre-warmed instances to reduce cold starts, automatic scaling, and VNET integration.Ideal for high-performance needs with better control over execution latency.
Dedicated Plan (App Service Plan)Fixed compute resources with predictable costs.Suitable for consistent, always-on workloads that require reserved resources.

The Consumption Plan is the most cost-effective when function invocations are sporadic. However, for high-traffic scenarios, the Premium Plan or Dedicated Plan can be more cost-efficient due to reduced cold start times.


Factors Affecting Azure Functions Cost

Azure Functions follows a pay-as-you-go pricing model, where costs are determined by several key factors, including execution time, memory allocation, number of executions, and outbound network traffic. While serverless computing eliminates infrastructure management overhead, inefficient function design and misconfigured triggers can lead to unexpected expenses.

Understanding the primary cost drivers is crucial for optimizing Azure Functions for cost-efficiency. Factors such as long-running executions, frequent invocations, excessive memory consumption, and unnecessary data transfers can significantly impact your Azure bill. Additionally, hidden costs from monitoring, logging, and external dependencies can accumulate over time.

By identifying these cost factors and implementing optimization strategies, organizations can minimize expenses while maintaining performance and scalability. In this section, we explore the key factors that influence Azure Functions costs and provide best practices to optimize serverless workloads effectively.


Execution Time (GB-Seconds)

Execution time, measured in GB-seconds, is a fundamental cost driver for Azure Functions. Since Azure bills based on the duration of function execution combined with allocated memory, longer-running functions result in higher compute costs.

Here’s the formula for calculating cost:

Cost = Memory (GB) × Execution Time (Seconds) × Price per GB-second

Several factors can contribute to prolonged execution times, including inefficient code, excessive API calls, slow database queries, and blocking operations. Additionally, cold starts can increase execution time in serverless environments, further impacting cost.

To optimize execution time and reduce expenses, developers should focus on writing efficient code, using asynchronous programming, reducing dependencies, and optimizing database interactions.

How It Impacts Cost

  • The longer a function runs, the more it costs.
  • Higher memory allocation increases the GB-seconds metric.
  • Cold starts can prolong execution time, leading to higher costs.

Optimization Strategies

  • Use asynchronous programming (async/await) to avoid blocking operations.
  • Streamline database queries by selecting only necessary fields.
  • Cache frequently used data instead of reloading it in every function invocation.

Example: Optimize Function Execution Time Instead of fetching all records from a database:

// Inefficient query fetching all fields
var results = await cosmosContainer.GetItemQueryIterator<MyItem>(
    new QueryDefinition("SELECT * FROM c")
).ReadNextAsync();

Use projection to fetch only required fields:

// Optimized query with selective fields
var results = await cosmosContainer.GetItemQueryIterator<MyItem>(
    new QueryDefinition("SELECT c.id, c.name FROM c WHERE c.status = 'Active'")
).ReadNextAsync();

Handling Execution Time Limit in Azure Functions

Azure Functions, particularly when using the Consumption Plan, have a default execution time limit of 5 minutes. This means that if a function runs beyond this duration, Azure will automatically terminate the execution, potentially leading to incomplete operations or failures in long-running workloads.

For scenarios that require longer execution times, Azure offers alternative pricing plans with extended timeout capabilities:

  • Consumption Plan – 5-minute maximum execution time (can be increased to 10 minutes with host.json configuration).
  • Premium Plan – Supports function execution for unlimited duration, making it ideal for workloads that require extended processing times.
  • Dedicated (App Service) Plan – Allows functions to run without execution time restrictions, as they operate within a fully provisioned App Service environment.

To learn more about how to extend execution timeout limits in Azure Functions and configure these settings for your workloads, check out the Azure Functions: Extend Execution Timeout Past 5 Minutes article written by Chris Pietschmann.

By selecting the right pricing plan and optimizing function execution, you can ensure that long-running processes complete successfully while managing costs effectively.


Number of Executions

The number of function executions is a major cost factor in Azure Functions, as each invocation contributes to the overall usage and billing. While Azure’s serverless model allows for automatic scaling, frequent or unnecessary executions can lead to unexpected costs, especially in high-traffic applications.

Functions triggered by HTTP requests, timers, queues, or event hubs may run more often than needed due to misconfigured triggers, excessive retries, or inefficient event handling. For example, a function that processes a queue message one at a time instead of batching multiple messages can significantly increase execution counts and costs.

To reduce execution costs, it’s essential to optimize event triggers, implement batching, debounce unnecessary executions, and handle failures efficiently.

How It Impacts Cost

  • Frequent invocations due to polling-based triggers (e.g., HTTP, timer triggers) increase costs.
  • Unnecessary retries on failures lead to repeated executions.
  • High-frequency event triggers, such as queues or event hubs, can cause a rapid cost buildup.

Optimization Strategies

  • Use batching to process multiple messages in one function execution.
  • Debounce events to prevent unnecessary function triggers.
  • Implement error handling to avoid excessive retries.

Example: Using Queue Trigger Batching Instead of processing each queue message individually:

[FunctionName("ProcessQueue")]
public static async Task Run(
    [QueueTrigger("myqueue", Connection = "AzureWebJobsStorage")] string message,
    ILogger log)
{
    log.LogInformation($"Processing: {message}");
}

Process messages in batches to reduce execution count:

[FunctionName("BatchProcessQueue")]
public static async Task Run(
    [QueueTrigger("myqueue", Connection = "AzureWebJobsStorage", MaxBatchSize = 10)] string[] messages,
    ILogger log)
{
    foreach (var message in messages)
    {
        log.LogInformation($"Processing: {message}");
    }
}

Result: Reduces function invocations by up to 10x, leading to lower costs.


Memory Allocation

Memory allocation plays a crucial role in both performance and cost when running Azure Functions. Since Azure Functions pricing is based on GB-seconds (the combination of memory size and execution duration), allocating more memory than necessary can lead to higher costs without improving efficiency. Conversely, under-allocating memory can cause longer execution times, increasing overall compute usage.

Functions that process large objects in memory, handle complex computations, or execute inefficient loops may consume excessive memory. Additionally, unoptimized code and improper data handling can lead to memory leaks, further escalating resource consumption and costs.

To achieve an optimal balance between performance and cost, it is important to profile memory usage, right-size allocations, and optimize function execution logic.

How It Impacts Cost

  • More memory leads to higher per-execution costs.
  • Excessive memory allocation for simple tasks results in unnecessary expenses.
  • Under-allocated memory can increase execution time, leading to higher GB-seconds consumption.

Optimization Strategies

  • Profile memory usage to allocate the optimal amount.
  • Avoid processing large objects in memory—use Azure Blob Storage instead.
  • Use streams instead of loading entire files into memory.

Example: Memory Profiling in C#

long before = GC.GetTotalMemory(true);

// Function logic...

long after = GC.GetTotalMemory(true);
Console.WriteLine($"Memory used: {after - before} bytes");

Adjust memory allocation dynamically based on profiling results.


Outbound Network Traffic (Egress)

Outbound network traffic, also known as egress, refers to data leaving the Azure network—whether it’s sent to the public internet, another cloud provider, or even across Azure regions. While function execution itself is a key cost factor, network egress charges can silently contribute to rising expenses, especially for API calls, data transfers, and external integrations.

Every time an Azure Function retrieves data from an external service, sends HTTP responses, transfers files, or communicates across Azure regions, egress fees apply. These costs can scale rapidly, particularly in data-intensive workloads like real-time streaming, IoT processing, and file processing applications.

To minimize egress costs, it’s essential to optimize API usage, leverage caching, compress outbound data, and utilize Azure networking best practices.

How It Impacts Cost

  • Frequent HTTP API calls increase outbound data transfer.
  • Large HTTP responses and file downloads/uploads raise costs.
  • Cross-region Azure Storage access results in additional egress fees.

Optimization Strategies

  • Minimize HTTP response sizes (use compression).
  • Cache API responses to avoid redundant calls.
  • Use Azure VNET Peering to reduce egress charges for cross-region data transfers.

Example: Compressing HTTP Responses

[FunctionName("CompressedResponse")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req,
    ILogger log)
{
    string responseBody = "This is a sample response";

    using (var memoryStream = new MemoryStream())
    using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress))
    using (var writer = new StreamWriter(gzipStream))
    {
        await writer.WriteAsync(responseBody);
        await writer.FlushAsync();
        gzipStream.Close();
        return new FileContentResult(memoryStream.ToArray(), "application/gzip");
    }
}

Result: Reduces outbound data size, lowering egress costs.


Cold Starts

Cold starts are a common challenge in serverless architectures, including Azure Functions. They occur when a function has been idle for a period of time and needs to be reloaded into an execution environment before running. This delay increases execution time, leading to higher costs and degraded performance, especially for latency-sensitive applications like APIs, chatbots, and real-time processing systems.

Cold starts primarily affect Consumption Plan functions since Azure dynamically allocates resources only when needed. While Premium and Dedicated Plans offer pre-warmed instances to mitigate this issue, cold starts can still impact cost and user experience if not handled properly.

How It Impacts Cost

  • Increases execution duration, leading to higher GB-seconds usage.
  • Can affect user experience in latency-sensitive applications.

Optimization Strategies

  • Use Premium Plan to keep pre-warmed instances.
  • Implement queue-based triggers instead of frequent HTTP triggers.
  • Use Azure Durable Functions for stateful workflows.

Example: Keeping a Function Warm Using Timer Trigger

[FunctionName("KeepFunctionWarm")]
public static async Task Run(
    [TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
    ILogger log)
{
    log.LogInformation($"Keeping function warm at: {DateTime.UtcNow}");
}

Result: Prevents cold starts by invoking the function every 5 minutes.


Hidden Costs in Azure Functions (Storage Monitoring, and Dependencies

While Azure Functions follow a pay-per-use pricing model, there are several hidden costs that can accumulate unexpectedly. These costs often stem from dependent Azure services, such as storage, monitoring, networking, and security features, which are essential for function execution but not always accounted for in initial cost estimates.

For example, Azure Storage is used for function state management and logging, Application Insights incurs charges for telemetry data collection, and Azure Key Vault calls can add extra API request costs. Additionally, excessive outbound network traffic and cross-region data transfers can contribute to increased expenses.

Understanding these hidden costs is crucial for effective budget management and cost optimization.

How It Impacts Cost

Beyond direct execution costs, there are hidden costs associated with supporting services:

Cost FactorCost ImpactOptimization Tips
Azure Storage CostsAzure Functions use Azure Blob Storage for logging and state management.Optimize log retention periods and configure log level settings.
Application InsightsMonitoring and diagnostics use Application Insights, which incurs data ingestion charges.Reduce telemetry sampling rate, filter logs to essential data only.
Outbound API CallsCalling third-party APIs or other Azure services can generate unexpected costs.Cache API responses, batch requests to reduce invocations.
Azure Key Vault AccessIf functions frequently fetch secrets from Azure Key Vault, egress costs can add up.Cache secrets locally within the function.

Optimization Strategies

  • Reduce logging levels to avoid excessive storage usage.
  • Use log sampling in Application Insights.
  • Cache secrets locally to minimize Key Vault API calls.

Example: Optimizing Application Insights Logging Modify the host.json file to reduce telemetry sampling:

{
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "maxTelemetryItemsPerSecond": 5
      }
    }
  }
}

Result: Limits the number of logs sent, reducing monitoring costs.

Summary of Cost Optimization Strategies

Optimizing Azure Functions for cost-efficiency requires a strategic approach that targets key cost drivers such as execution time, function invocations, memory allocation, and outbound data transfer. Without proper optimization, costs can quickly escalate due to unnecessary function executions, excessive resource consumption, and inefficient workflows.

By implementing the right coding techniques, scaling strategies, and monitoring tools, organizations can minimize expenses while maintaining high performance and reliability. The following summary highlights the most effective cost optimization strategies, providing a quick reference for reducing Azure Functions costs in real-world scenarios.

FactorOptimization Strategy
Execution TimeOptimize queries, avoid blocking calls, use async programming
Number of ExecutionsBatch processing, debounce events, minimize retries
Memory AllocationProfile memory usage, avoid large in-memory objects
Outbound TrafficUse compression, cache responses, optimize cross-region data transfer
Cold StartsUse Premium Plan, keep functions warm, avoid frequent HTTP triggers
Hidden CostsReduce log verbosity, enable log sampling, cache secrets locally

By optimizing these cost drivers, organizations can significantly reduce Azure Function expenses while maintaining performance and scalability. 🚀


Cost Estimation and Budgeting

Effectively managing costs in Azure Functions requires accurate cost estimation, continuous monitoring, and proactive budgeting. While the serverless pay-as-you-go model provides flexibility, unexpected usage patterns can lead to overruns and unplanned expenses. By leveraging Azure’s cost management tools and best practices, you can track function usage, set spending limits, and optimize resource allocation to ensure cost efficiency.


Use Azure Cost Management for Function Cost Tracking

Effective cost tracking is essential for managing and optimizing Azure Functions expenses. Azure Cost Management + Billing provides built-in tools to monitor, analyze, and optimize function-related costs in real-time. By leveraging cost breakdown reports, budgeting tools, and forecasting features, organizations can gain greater visibility into their Azure Functions usage and prevent unexpected billing surprises.

Tracking costs at the function level helps identify high-cost operations, optimize execution time and memory allocation, and ensure efficient resource utilization. Azure’s cost analysis tools allow users to filter expenses by service, region, and resource group, making it easier to pinpoint cost optimization opportunities.

Key Features of Azure Cost Management:

  • Analyze Cost by Service – View detailed cost breakdowns for Azure Functions, Storage, Application Insights, etc.
  • Cost Alerts and Budgets – Set spending thresholds to avoid unexpected charges.
  • Forecasting – Predict future costs based on historical usage trends.
  • Reserved Instance Insights – Identify opportunities for savings with pre-purchased compute plans.

Viewing Function Costs in Azure Portal:

  1. Navigate to Azure Cost Management:
    • Go to Azure Portal → Search for Cost Management + Billing.
    • Click on Cost Analysis.
  2. Filter by Service:
    • Select Azure Functions under Scope.
    • Analyze cost trends and identify high-cost functions.
  3. Generate Reports:
    • Customize reports to track costs by function, region, or resource group.
    • Export cost data for deeper analysis.

Using Azure CLI for Cost Queries

Azure CLI allows you to fetch real-time cost data using the following command:

az costmanagement query --timeframe "LastMonth" --dataset-grouping "ResourceGroup"

This provides insights into cost distribution across different functions and services.


Estimating Azure Functions Costs with Pricing Calculator

Accurately estimating the cost of Azure Functions before deployment is crucial for budget planning and cost control. The Azure Pricing Calculator is a powerful tool that allows organizations to simulate function execution scenarios, calculate expected expenses based on usage parameters, and compare costs across different pricing plans (Consumption, Premium, and Dedicated Plans).

By inputting details such as execution time, memory allocation, number of invocations, and outbound data transfer, users can obtain a detailed cost estimate tailored to their specific workload. Additionally, incorporating related expenses such as Azure Storage, Application Insights, and networking costs ensures a comprehensive financial projection.

Steps to Estimate Function Costs:

  1. Visit the Azure Pricing Calculator
  2. Select Azure Functions and enter:
    • Execution time per request (in seconds)
    • Memory allocation per request (in MB)
    • Number of executions per month
  3. Include Additional Costs:
    • Storage (for logs, queue messages, and durable function state)
    • Application Insights (for monitoring and telemetry)
    • Outbound networking (data transfer costs)
  4. Review Total Cost Estimate:
    • Compare costs across different pricing plans (Consumption vs. Premium vs. Dedicated Plan).
    • Adjust memory allocation and execution count to find an optimal cost-performance balance.

Example Cost Estimation

Scenario: Processing 1 Million Requests Per Month
MetricValue
Execution Time2 seconds
Memory Allocation512MB
Number of Executions1,000,000
Estimated Cost$16/month (Consumption Plan)

If outbound data transfer is 50GB, the additional cost would be:

50GB × $0.087/GB = $4.35
Total Monthly Cost = $16 + $4.35 = $20.35

Setting Budgets and Alerts for Cost Control

To prevent unexpected cost overruns in Azure Functions, it’s essential to implement budgeting and alert mechanisms. Azure provides Cost Management + Billing tools that allow organizations to set spending limits, track real-time usage, and receive notifications when costs approach predefined thresholds.

By creating budget alerts, teams can proactively monitor Azure Function expenses, ensuring that costs remain within the allocated budget. These alerts help detect unexpected spikes in usage, allowing for immediate corrective actions such as optimizing function execution, adjusting scaling policies, or reducing unnecessary invocations.

Creating a Budget in Azure Cost Management:

  1. Go to Azure Portal → Cost Management + Billing → Budgets.
  2. Click “Create Budget” and enter:
    • Scope: Select the Subscription or Resource Group.
    • Budget Amount: Set a monthly spending limit (e.g., $100).
    • Notification Thresholds: Set alerts at 50%, 80%, and 100% of budget usage.
  3. Enable Email Alerts:
    • Notify stakeholders when costs exceed predefined limits.

Creating Budget Alerts via Azure CLI

az consumption budget create --amount 100 --timeframe "Month" --resource-group "MyResourceGroup"

This ensures real-time alerts before exceeding the budget.


Predicting Future Costs Using Historical Data

Predicting future costs is essential for long-term budget planning and resource optimization in Azure Functions. By analyzing historical usage data, organizations can identify trends, seasonal fluctuations, and workload patterns, allowing them to make data-driven cost forecasts.

Azure provides Cost Management + Billing tools that enable businesses to review past expenses, detect cost anomalies, and estimate future spending based on previous consumption. Leveraging these insights, teams can adjust scaling strategies, optimize function execution, and implement proactive budget controls to prevent cost overruns.

Cost Forecasting Strategies

  • Analyze past usage to predict function growth over time.
  • Identify seasonal patterns (e.g., traffic spikes during holidays).
  • Use trend analysis to adjust budgets proactively.

Using Azure Advisor for Cost Recommendations

Azure Advisor provides cost-saving recommendations, such as:

  • Optimizing memory allocation to reduce GB-seconds.
  • Switching from Consumption Plan to Premium Plan for cost efficiency.
  • Reducing Application Insights telemetry data ingestion.

Optimizing Azure Functions to Stay Within Budget

Keeping Azure Functions costs under control requires a proactive optimization strategy that balances performance, scalability, and cost efficiency. Without proper management, excessive execution time, memory allocation, frequent invocations, and outbound data transfer can lead to unexpected expenses that exceed the allocated budget.

By implementing best practices such as batch processing, efficient memory management, minimizing unnecessary executions, and reducing logging overhead, organizations can maximize cost savings while maintaining function performance. Additionally, leveraging budget alerts and continuous cost monitoring helps ensure that expenses remain within defined financial limits.

Practical Cost Optimization Strategies

Optimizing Azure Functions for cost efficiency requires a combination of technical best practices and strategic resource management. By addressing key cost drivers—such as execution time, memory allocation, function invocations, and outbound data transfer—organizations can minimize expenses without compromising performance.

Optimization StrategyCost Savings Impact
Reduce execution timeLowers GB-seconds usage
Batch processingReduces function invocations
Optimize memory allocationPrevents over-provisioning
Minimize logging and telemetryLowers Application Insights costs
Monitor and adjust budgetsPrevents unexpected overages
Use storage tiers efficientlyReduces Azure Storage costs

Example: Cost Reduction from $500 → $200 per Month

A company was running real-time event processing using Azure Functions (Consumption Plan) and noticed unexpectedly high costs.

Optimization Steps Taken:
  1. Implemented batching for queue processing (reduced function executions by 80%).
  2. Reduced logging verbosity to minimize Application Insights costs.
  3. Switched from Consumption to Premium Plan for pre-warmed instances, reducing cold start delays and execution times.
Resuls:
Before OptimizationAfter Optimization
10 million executions2 million executions
1GB memory allocation512MB memory allocation
$500/month$200/month

Monitoring and Continuous Cost Optimization

Cost optimization for Azure Functions is not a one-time task—it requires ongoing monitoring and adjustments to ensure expenses remain under control as workloads evolve. Without continuous oversight, unexpected usage spikes, inefficient function execution, or unoptimized resource allocation can lead to unnecessary costs.

By leveraging Azure Cost Management, Application Insights, and Azure Monitor, organizations can track function performance, analyze cost trends, and proactively identify areas for improvement. Implementing automated alerts and periodic cost reviews ensures that functions are always operating at peak efficiency with minimal waste.

Automating Cost Monitoring

Use Azure Monitor to track function costs automatically:

az monitor metrics list --resource "MyFunctionApp" --metric "FunctionExecutionCount"

Key Metrics to Track:

  • Execution Count – Helps identify over-invoked functions.
  • Memory Usage – Avoids excessive allocation.
  • Outbound Data Transfer – Monitors egress costs.

Conclusion

Optimizing the cost of Azure Functions requires a strategic approach that balances performance, scalability, and efficiency. While the serverless model provides a flexible and cost-effective way to run event-driven applications, unoptimized usage can lead to unnecessary expenses. By understanding the key cost factors—execution time, memory allocation, number of invocations, outbound network traffic, and hidden dependencies—organizations can take a proactive approach to cost management.

The best practices outlined in this article, including optimizing execution time, batching events, reducing cold starts, and leveraging Azure’s monitoring and budgeting tools, can significantly reduce overall costs. Choosing the right pricing model—whether the Consumption Plan for sporadic workloads, the Premium Plan for reduced latency, or the Dedicated Plan for consistent workloads—ensures cost alignment with business needs.

Additionally, continuous monitoring and optimization are essential to maintaining cost efficiency. Azure Cost Management + Billing, budget alerts, and the Pricing Calculator provide valuable insights into function expenses, enabling organizations to make data-driven decisions.

By implementing these strategies, organizations can harness the full power of Azure Functions while maintaining control over their cloud spending. With careful planning and ongoing cost optimization, businesses can achieve scalable, resilient, and cost-effective serverless architectures, maximizing the value of their Azure investments. 🚀

Chris Pietschmann is a Microsoft MVP, HashiCorp Ambassador, and Microsoft Certified Trainer (MCT) with 20+ years of experience designing and building Cloud & Enterprise systems. He has worked with companies of all sizes from startups to large enterprises. He has a passion for technology and sharing what he learns with others to help enable them to learn faster and be more productive.
Microsoft MVP HashiCorp Ambassador

Discover more from Build5Nines

Subscribe now to keep reading and get access to the full archive.

Continue reading