Skip to content

Commit b3b9f91

Browse files
Merge pull request #307508 from MicrosoftDocs/main
Auto Publish – main to live - 2025-10-29 11:00 UTC
2 parents fb3ffb5 + 5b1cdeb commit b3b9f91

25 files changed

Lines changed: 327 additions & 85 deletions

articles/azure-compute-fleet/overview.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ ms.topic: overview
77
ms.service: azure-compute-fleet
88
ms.custom:
99
- ignite-2024
10-
ms.date: 04/21/2025
10+
ms.date: 10/29/2025
1111
ms.reviewer: jushiman
1212
# Customer intent: As a cloud administrator, I want to deploy and manage multiple virtual machines efficiently using an automated compute resource management tool, so that I can optimize resource allocation based on cost and capacity while ensuring high availability for my workloads.
1313
---
@@ -32,7 +32,6 @@ Using Azure Compute Fleet, you can:
3232
## Features and benefits
3333

3434
- **Multiple VM series:** Compute Fleet launches multiple VM series within a given fleet. Overall availability in the fleet is enhanced by ensuring it isn't reliant on any single VM type.
35-
- **Distributing VMs across Availability Zones:** Compute Fleet automatically distributes VMs across multiple Availability Zones to ensure high availability and resilience against potential zone failures.
3635
- **Diverse pricing models:** Compute Fleet leverages various purchasing options, including Spot VMs for cost savings and standard pay-as-you-go VMs. You can also integrate Azure Reserved Instances and Savings Plans to optimize costs while ensuring consistent capacity. There's no extra charge for using Azure Compute Fleet. You're only charged for the VMs your Compute Fleet launches per hour. For more information, see [states and billing status of Azure VMs](/azure/virtual-machines/states-billing).
3736
- **Automated Replacement of Spot VMs:** When using Spot VMs, Compute Fleet can automatically replace Spot VMs when evicted due to price fluctuations or capacity constraints.
3837
- **Multi-Region deployment:** Compute Fleet allows you to dynamically distribute workloads across multiple regions. For more information, see [Multi-Region Compute Fleet (Preview)](multi-region-compute-fleet.md).

articles/azure-functions/dotnet-aspire-integration.md

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,155 @@ By default, when you publish an Azure Functions project to Azure, it's deployed
180180

181181
During the preview period, the container app resources don't support event-driven scaling. Azure Functions support is not available for apps deployed in this mode. If you need to open a support ticket, select the Azure Container Apps resource type.
182182

183+
### Access keys
184+
185+
Several Azure Functions scenarios use access keys to provide a basic mitigation against unwanted access. For example, HTTP trigger functions by default require an access key to be invoked, though this requirement can be disabled using the [`AuthLevel` property](./functions-bindings-http-webhook-trigger.md#attributes). See [Work with access keys in Azure Functions](./function-keys-how-to.md) for scenarios which may require a key.
186+
187+
When you deploy a Functions project using Aspire to Azure Container Apps, the system doesn't automatically create or manage Functions access keys. If you need to use access keys, you can manage them as part of your App Host setup. This section shows you how to create an extension method that you can call from your app host's `Program.cs` file to create and manage access keys. This approach uses Azure Key Vault to store the keys and mounts them into the container app as secrets.
188+
189+
> [!NOTE]
190+
> The behavior here relies on the `ContainerApps` secret provider, which is only available starting with Functions host version `4.1044.0`. This version is not yet available in all regions, and until it is, when you publish your Aspire project, the base image used for the Functions project may not include the necessary changes.
191+
192+
These steps require Bicep version `0.38.3` or later. You can check your Bicep version by running `bicep --version` from a command prompt. If you have the Azure CLI installed, you can use `az bicep upgrade` to quickly update Bicep to the latest version.
193+
194+
Add the following NuGet packages to your app host project:
195+
- [Aspire.Hosting.Azure.AppContainers](https://www.nuget.org/packages/Aspire.Hosting.Azure.AppContainers)
196+
- [Aspire.Hosting.Azure.KeyVault](https://www.nuget.org/packages/Aspire.Hosting.Azure.KeyVault)
197+
198+
Create a new class in your app host project and include the following code:
199+
200+
```csharp
201+
using Aspire.Hosting.Azure;
202+
using Azure.Provisioning.AppContainers;
203+
204+
namespace Aspire.Hosting;
205+
206+
internal static class Extensions
207+
{
208+
private record SecretMapping(string OriginalName, IAzureKeyVaultSecretReference Reference);
209+
210+
public static IResourceBuilder<T> PublishWithContainerAppSecrets<T>(
211+
this IResourceBuilder<T> builder,
212+
IResourceBuilder<AzureKeyVaultResource>? keyVault = null,
213+
string[]? hostKeyNames = null,
214+
string[]? systemKeyExtensionNames = null)
215+
where T : AzureFunctionsProjectResource
216+
{
217+
if (!builder.ApplicationBuilder.ExecutionContext.IsPublishMode)
218+
{
219+
return builder;
220+
}
221+
222+
keyVault ??= builder.ApplicationBuilder.AddAzureKeyVault("functions-keys");
223+
224+
var hostKeysToAdd = (hostKeyNames ?? []).Append("default").Select(k => $"host-function-{k}");
225+
var systemKeysToAdd = systemKeyExtensionNames?.Select(k => $"host-systemKey-{k}_extension") ?? [];
226+
var secrets = hostKeysToAdd.Union(systemKeysToAdd)
227+
.Select(secretName => new SecretMapping(
228+
secretName,
229+
CreateSecretIfNotExists(builder.ApplicationBuilder, keyVault, secretName.Replace("_", "-"))
230+
)).ToList();
231+
232+
return builder
233+
.WithReference(keyVault)
234+
.WithEnvironment("AzureWebJobsSecretStorageType", "ContainerApps")
235+
.PublishAsAzureContainerApp((infra, app) => ConfigureFunctionsContainerApp(infra, app, builder.Resource, secrets));
236+
}
237+
238+
private static void ConfigureFunctionsContainerApp(
239+
AzureResourceInfrastructure infrastructure,
240+
ContainerApp containerApp,
241+
IResource resource,
242+
List<SecretMapping> secrets)
243+
{
244+
const string volumeName = "functions-keys";
245+
const string mountPath = "/run/secrets/functions-keys";
246+
247+
var appIdentityAnnotation = resource.Annotations.OfType<AppIdentityAnnotation>().Last();
248+
var containerAppIdentityId = appIdentityAnnotation.IdentityResource.Id.AsProvisioningParameter(infrastructure);
249+
250+
var containerAppSecretsVolume = new ContainerAppVolume
251+
{
252+
Name = volumeName,
253+
StorageType = ContainerAppStorageType.Secret
254+
};
255+
256+
foreach (var mapping in secrets)
257+
{
258+
var secret = mapping.Reference.AsKeyVaultSecret(infrastructure);
259+
260+
containerApp.Configuration.Secrets.Add(new ContainerAppWritableSecret()
261+
{
262+
Name = mapping.Reference.SecretName.ToLowerInvariant(),
263+
KeyVaultUri = secret.Properties.SecretUri,
264+
Identity = containerAppIdentityId
265+
});
266+
267+
containerAppSecretsVolume.Secrets.Add(new SecretVolumeItem
268+
{
269+
Path = mapping.OriginalName.Replace("-", "."),
270+
SecretRef = mapping.Reference.SecretName.ToLowerInvariant()
271+
});
272+
}
273+
274+
containerApp.Template.Containers[0].Value!.VolumeMounts.Add(new ContainerAppVolumeMount
275+
{
276+
VolumeName = volumeName,
277+
MountPath = mountPath
278+
});
279+
containerApp.Template.Volumes.Add(containerAppSecretsVolume);
280+
}
281+
282+
public static IAzureKeyVaultSecretReference CreateSecretIfNotExists(
283+
IDistributedApplicationBuilder builder,
284+
IResourceBuilder<AzureKeyVaultResource> keyVault,
285+
string secretName)
286+
{
287+
var secretParameter = ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder, $"param-{secretName}", special: false);
288+
builder.AddBicepTemplateString($"key-vault-key-{secretName}", """
289+
param location string = resourceGroup().location
290+
param keyVaultName string
291+
param secretName string
292+
@secure()
293+
param secretValue string
294+
295+
// Reference the existing Key Vault
296+
resource keyVault 'Microsoft.KeyVault/vaults@2023-07-01' existing = {
297+
name: keyVaultName
298+
}
299+
300+
// Deploy the secret only if it does not already exist
301+
@onlyIfNotExists()
302+
resource newSecret 'Microsoft.KeyVault/vaults/secrets@2023-07-01' = {
303+
parent: keyVault
304+
name: secretName
305+
properties: {
306+
value: secretValue
307+
}
308+
}
309+
""")
310+
.WithParameter("keyVaultName", keyVault.GetOutput("name"))
311+
.WithParameter("secretName", secretName)
312+
.WithParameter("secretValue", secretParameter);
313+
314+
return keyVault.GetSecret(secretName);
315+
}
316+
}
317+
```
318+
319+
You can then use this method in your app host's `Program.cs` file:
320+
321+
```csharp
322+
builder.AddAzureFunctionsProject<Projects.MyFunctionsProject>("MyFunctionsProject")
323+
.WithHostStorage(storage)
324+
.WithExternalHttpEndpoints()
325+
.PublishWithContainerAppSecrets(systemKeyExtensionNames: ["mcp"]);
326+
```
327+
328+
This example uses a default key vault created by the extension method. It results in a default key and a system key for use with the [Model Context Protocol extension](./functions-bindings-mcp.md#connect-to-your-mcp-server).
329+
330+
To use these keys from clients, you need to retrieve them from the key vault.
331+
183332
## Considerations and best practices
184333

185334
Consider the following points when you're evaluating the integration of Azure Functions with Aspire:

articles/azure-functions/function-keys-how-to.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ Keys are stored as part of your function app in Azure and are encrypted at rest.
6363
| A second storage account | `blob` | Stores keys in Blob storage in a storage account that's different than the one used by the Functions runtime. The specific account and container used are defined by a shared access signature (SAS) URL set in the [`AzureWebJobsSecretStorageSas`](functions-app-settings.md#azurewebjobssecretstoragesas) setting. You must maintain the `AzureWebJobsSecretStorageSas` setting when the SAS URL changes. |
6464
| [Azure Key Vault](/azure/key-vault/general/overview) | `keyvault` | The key vault set in [`AzureWebJobsSecretStorageKeyVaultUri`](functions-app-settings.md#azurewebjobssecretstoragekeyvaulturi) is used to store keys. |
6565
| File system | `files` | Keys are persisted on the local file system, which is the default in Functions v1.x. File system storage isn't recommended. |
66-
| Kubernetes Secrets |`kubernetes` | The resource set in [AzureWebJobsKubernetesSecretName](functions-app-settings.md#azurewebjobskubernetessecretname) is used to store keys. Supported only when your function app is deployed to Kubernetes. The [Azure Functions Core Tools](functions-run-local.md) generates the values automatically when you use it to deploy your app to a Kubernetes cluster. [Immutable secrets](https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable) aren't supported. |
66+
| Kubernetes Secrets |`kubernetes` | The resource set in [AzureWebJobsKubernetesSecretName](functions-app-settings.md#azurewebjobskubernetessecretname) is used to store keys. Supported only when your function app is deployed to Kubernetes. The [Azure Functions Core Tools](functions-run-local.md) generates the values automatically when you use it to deploy your app to a Kubernetes cluster. [Immutable secrets](https://kubernetes.io/docs/concepts/configuration/secret/#secret-immutable) aren't supported. |
67+
| Azure Container Apps secrets | `ContainerApps` | Keys are stored in the Azure Container Apps secrets store. Supported only when your function app is deployed to Azure Container Apps. |
6768

6869
When you use Key Vault for key storage, the app settings you need depend on the managed identity type, either system-assigned or user-assigned.
6970

articles/azure-netapp-files/azure-netapp-files-metrics.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,22 +287,22 @@ Azure NetApp Files provides metrics on allocated storage, actual storage usage,
287287
Whether the status of the volume replication is transferring.
288288
289289
- *Volume replication lag time* <br>
290-
Lag time is the actual amount of time the replication lags behind the source. It indicates the age of the replicated data in the destination volume relative to the source volume.
290+
The delay between when data is written to the source volume and when it’s available on the destination volume.
291291
292292
> [!NOTE]
293293
> When assessing the health status of the volume replication, consider the volume replication lag time. If the lag time is greater than the replication schedule, the replication volume won't catch up to the source. To resolve this issue, adjust the replication speed or the replication schedule.
294294
295295
- *Volume replication last transfer duration*
296-
The amount of time in seconds it took for the last transfer to complete.
296+
The time taken for the most recent replication session to transfer all changed data (example: blocks, snapshots) from the source volume to the destination volume.
297297
298298
- *Volume replication last transfer size*
299-
The total number of bytes transferred as part of the last transfer.
300-
299+
The total amount of data transferred during the most recent replication session from a source volume to its destination volume.
300+
301301
- *Volume replication progress*
302302
The total amount of data in bytes transferred for the current transfer operation.
303303
304304
- *Volume replication total transfer*
305-
The cumulative bytes transferred for the relationship.
305+
The cumulative volume of data transferred from the source volume to the destination volume throughout the entire lifetime of the replication relationship.
306306
307307
## Throughput metrics for capacity pools
308308

articles/azure-vmware/configure-azure-elastic-san.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ The following prerequisites are required to continue.
2727

2828
> [!IMPORTANT]
2929
> As of November 2025, creating and deleting an Azure Elastic SAN based datastore in Azure VMware Solution requires appropriate permissions. If you're using built-in roles such as Owner and Contributor across the these two services, no changes are necessary. If you're using custom roles, ensure you have the correct permissions configured.
30-
> <details><summary>For a complete list of required permissions, expand this section.</summary>
31-
> > To create an Elastic SAN datastore, you must have the following permissions:
32-
- `Microsoft.AVS/privateClouds/clusters/datastores/write`
33-
- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/write`
34-
- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/read`
35-
36-
> To delete an Elastic SAN datastore, you must have the following permissions:
37-
- `Microsoft.AVS/privateClouds/clusters/datastores/write`
38-
- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/write`
39-
- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/read`
40-
41-
> For information about creating and modifying custom roles, see [create or update Azure custom roles using the Azure portal](../role-based-access-control/custom-roles-portal.md).
42-
30+
><details><summary>For a complete list of required permissions, expand this section.</summary>
31+
>
32+
>To create an Elastic SAN datastore, you must have the following permissions:
33+
>- `Microsoft.AVS/privateClouds/clusters/datastores/write`
34+
>- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/write`
35+
>- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/read`
36+
>
37+
>To delete an Elastic SAN datastore, you must have the following permissions:
38+
>- `Microsoft.AVS/privateClouds/clusters/datastores/write`
39+
>- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/write`
40+
>- `Microsoft.ElasticSan/elasticSans/volumeGroups/volumes/read`
41+
>
42+
>For information about creating and modifying custom roles, see [create or update Azure custom roles using the Azure portal](../role-based-access-control/custom-roles-portal.md).
4343
</details>
4444
4545
- Have a fully configured Azure VMware solution private cloud in a [region that Elastic SAN is available in](../storage/elastic-san/elastic-san-create.md).

0 commit comments

Comments
 (0)