diff --git a/src/apphost/Aspire.Dev.AppHost/AppHost.cs b/src/apphost/Aspire.Dev.AppHost/AppHost.cs index 387a35ba3..62ff26e74 100644 --- a/src/apphost/Aspire.Dev.AppHost/AppHost.cs +++ b/src/apphost/Aspire.Dev.AppHost/AppHost.cs @@ -1,14 +1,21 @@ var builder = DistributedApplication.CreateBuilder(args); // For deployment: We want to pick AppService as the environment to publish to. -builder.AddAzureAppServiceEnvironment("production"); +builder.AddAzureAppServiceEnvironment("production") + .WithDashboard(false); var cache = builder.AddAzureManagedRedis("cache") .RunAsContainer(); var staticHostWebsite = builder.AddProject("aspiredev") .WithReference(cache) - .WithExternalHttpEndpoints(); + .WithExternalHttpEndpoints() + .PublishAsAzureAppServiceWebsite((infra, website) => + { + website.IsEndToEndEncryptionEnabled = true; + }); + +var frontDoor = builder.AddAzureFrontDoor(staticHostWebsite); if (builder.ExecutionContext.IsRunMode) { @@ -28,8 +35,10 @@ { var secrets = builder.AddAzureKeyVault("secrets"); staticHostWebsite.WithProductionLiveStatus(builder, secrets); -} -builder.AddAzureFrontDoor(staticHostWebsite); + var logsWorkspace = builder.AddAzureLogAnalyticsWorkspace("workspace-logs"); + frontDoor.WithDiagnostics(logsWorkspace); + cache.WithDiagnostics(logsWorkspace); +} builder.Build().Run(); diff --git a/src/apphost/Aspire.Dev.AppHost/Aspire.Dev.AppHost.csproj b/src/apphost/Aspire.Dev.AppHost/Aspire.Dev.AppHost.csproj index 5f36fa347..35e922318 100644 --- a/src/apphost/Aspire.Dev.AppHost/Aspire.Dev.AppHost.csproj +++ b/src/apphost/Aspire.Dev.AppHost/Aspire.Dev.AppHost.csproj @@ -15,6 +15,7 @@ + diff --git a/src/apphost/Aspire.Dev.AppHost/Extensions/DeploymentExtensions.cs b/src/apphost/Aspire.Dev.AppHost/Extensions/DeploymentExtensions.cs index 26871b58a..1e4c095ab 100644 --- a/src/apphost/Aspire.Dev.AppHost/Extensions/DeploymentExtensions.cs +++ b/src/apphost/Aspire.Dev.AppHost/Extensions/DeploymentExtensions.cs @@ -1,5 +1,7 @@ using Aspire.Hosting.Azure; using Azure.Provisioning.Cdn; +using Azure.Provisioning.Monitor; +using Azure.Provisioning.RedisEnterprise; internal static class DeploymentExtensions { @@ -37,4 +39,65 @@ public static IResourceBuilder AddAzureFrontDoor( }; }); } + + public static IResourceBuilder WithDiagnostics( + this IResourceBuilder builder, + IResourceBuilder workspace) + { + return builder.ConfigureInfrastructure(infra => + { + var profile = infra.GetProvisionableResources().OfType().Single(); + + infra.Add(new DiagnosticSettingsResource("diagnostics") + { + Name = "security-logs", + Scope = profile, + Properties = new DiagnosticSettings + { + WorkspaceId = workspace.Resource.Id.AsProvisioningParameter(infra), + Logs = + { + new DiagnosticsLogSettings + { + Category = "FrontDoorAccessLog", + Enabled = true + }, + new DiagnosticsLogSettings + { + Category = "FrontDoorWebApplicationFirewallLog", + Enabled = true + } + } + } + }); + }); + } + + public static IResourceBuilder WithDiagnostics( + this IResourceBuilder builder, + IResourceBuilder workspace) + { + return builder.ConfigureInfrastructure(infra => + { + var database = infra.GetProvisionableResources().OfType().Single(); + + infra.Add(new DiagnosticSettingsResource("redisConnectionLogs") + { + Name = "redis-connection-logs", + Scope = database, + Properties = new DiagnosticSettings + { + WorkspaceId = workspace.Resource.Id.AsProvisioningParameter(infra), + Logs = + { + new DiagnosticsLogSettings + { + Category = "ConnectionEvents", + Enabled = true + } + } + } + }); + }); + } }