Releases: vegazbabz/azure-demo-environment
Releases · vegazbabz/azure-demo-environment
Release list
Release v2.2.1
[2.2.1] - 2026-07-18
Documentation
README.md: corrected the Pester test count (650 -> 678) and the PowerShell minimum (7.0, matching#Requiresand the module manifest; 7.4+ recommended); PowerShell Gallery badges and install instructions; a note that all./scripts/...examples map one-to-one to the exported module commands; mermaid architecture diagram in place of the ASCII flow; compliance-scan section now lists the companionCISAzureFoundationsBenchmarkmodule with a benchmark-version clarification (ADE templates authored against CIS v5.0.0, the companion audits v6.0.0 — pick one scanner for both runs)docs/usage.md: cost table had drifted from the README (minimal~$80-120 vs ~$15-30) — replaced with a pointer to the README's cost guidance as the single source of truth; hardened example now uses the canonical-Profile hardened -Mode hardenedpairing; prerequisites aligned (Azure CLI 2.60+, PowerShell 7.0+)- Documentation-only patch: refreshes the README bundled in the Gallery package; no script or template changes
Release v2.2.0
[2.2.0] - 2026-07-17
Added
- PowerShell Gallery packaging: the repo now ships as the
AzureDemoEnvironmentmodule (Install-PSResource AzureDemoEnvironment).AzureDemoEnvironment.psd1/.psm1at the repo root export four wrapper commands —Deploy-AdeEnvironment,Remove-AdeEnvironment,Initialize-AdeSeedData,Get-AdeCostDashboard— that mirror the entry scripts' parameters exactly and forward only bound arguments, so script defaults stay single-sourced. The package bundlesscripts/,bicep/,config/anddata/unchanged (all path resolution is$PSScriptRoot-relative, so installed and cloned layouts behave identically) tools/Build-ModulePackage.ps1: whitelist-stages the publishable module folder and validates it (manifest, standalone import, required assets), stripping compiled ARM JSON,.gitkeepplaceholders and logs so local and CI builds produce identical packagesrelease.yml: newpublish-psgalleryjob on version tags — verifies the manifest version matches the tag, builds the staged package and runsPublish-PSResource; skips with a notice when thePSGALLERY_API_KEYsecret is not configuredtests/module.Tests.ps1: manifest metadata checks, wrapper↔script parameter parity (names and types), and staged-package layout assertionsREADME.md: PowerShell Gallery badges and install instructions alongside the existing clone-based workflow
Release v2.1.0
[2.1.0] - 2026-07-15
Changed
Invoke-AzCmd: the string-Argumentsform now throws when the value contains a quote character — it splits on whitespace with no quote handling, so--name "my rg"silently became broken tokens and an opaque az error. Use-ArgumentListfor values with spacesInvoke-AdeBicepDeployment: deployment polling now backs off with age (5s for the first 2 minutes, 15s until 10 minutes, then 30s) — long modules (AKS, APIM, gateways) previously generated thousands of ARM reads per deploy and risked 429 throttlingdeploy.ps1: the jobSchedule GUID is derived with SHA-256 (truncated) instead of MD5 — purely a scanner-noise fix; idempotency is name-based and unaffected, existing schedule links are still detected
Documentation
README.mdhalved (942 -> 443 lines): nine reference-heavy sections moved verbatim todocs/reference.md(feature flags, parameters, custom profiles, scripts, repository structure) anddocs/operations.md(seed data, auto start/stop, cost dashboard, GitHub Actions setup). All README headings and anchors unchanged; each section keeps a summary plus a link
Release v2.0.1
[2.0.1] - 2026-07-14
Fixed
bicep/hardened/databases/databases.bicep: every hardened deployment withsqlDatabase: truefailed ARM preflight on two counts — (1) theAllowAllWindowsAzureIpsfirewall rule is rejected whenpublicNetworkAccessisDisabled(DenyPublicEndpointEnabled); the rule is removed since access is private-endpoint-only, and (2) the classic vulnerability-assessment resource requires a storage container (storageContainerPathcannot be empty); replaced with Defender for SQL express configuration (Microsoft.Sql/servers/sqlVulnerabilityAssessments), which stores scan results in the database and needs no storage account
Release v2.0.0
[2.0.0] - 2026-07-14
Security
- Per-service admin passwords stored in Key Vault:
deploy.ps1now generates a separate cryptographically random password for each service (VM/VMSS/DC, SQL, PostgreSQL, MySQL, Synapse) and stores them in the environment Key Vault (vm-admin-password,sql-admin-password,postgres-admin-password,mysql-admin-password,synapse-admin-password) instead of one shared password printed to the terminal. Existing secrets are reused on redeploy (no rotation); unreadable secrets fail closed.seed-data.ps1fetches passwords from Key Vault automatically —-DatabaseAdminPasswordis now an optional override.-AdminPasswordkeeps its legacy meaning (one value for all services) and is also synced to Key Vault. Profiles without a Key Vault fall back to the previous single-password console-banner behavior datamodule (default mode): the predictableSynapseDemo#<uniqueString>fallback password is replaced by the storedsynapse-admin-passwordsecret whenever the synapse feature is enableddatabasesmodule: the internet-wideAllowAllSQL firewall rule (0.0.0.0–255.255.255.255) is no longer created by default — now opt-in viadatabases.features.allowAllSqlIngress(kept for reproducing the CIS 4.1.2 baseline finding). The default firewall is scoped to Azure services plus a single-IPAllowDeployerIprule detected at deploy time (Get-AdeDeployerPublicIp), soseed-data.ps1keeps working.deploy.ps1also removes a staleAllowAllrule left by deployments made before this changedeploy.ps1: irreversible pre-flight operations (Failed-state Container Apps Environment delete, ML workspace permanent delete) now require interactive confirmation viaConfirm-AdeDestructiveAction(default No); auto-approved under-Force/CI with a logged warning
Changed
- CI workflows (
deploy.yml,lint.yml): Bicep CLI pinned to v0.44.1 instead of installing the latest release on every run — reproducible lint/deploy results, no unreviewed-release drift
Fixed
deploy.yml: the seed step passed aSecureStringintoseed-data.ps1's[string]$DatabaseAdminPasswordparameter, which binds as the literal textSystem.Security.SecureString— CI database seeding never actually authenticated. The seed step now takes no password and reads the per-service secrets from Key Vaultbicep/hardened/monitoring/monitoring.bicep: the data collection rule used theMicrosoft-SecurityEventstream, which ARM only accepts in DCRs created by the Sentinel 'Windows Security Events via AMA' connector — every hardened-mode deployment failed in the monitoring module withInvalidPayload: Data collection rule is invalid. Security-channel events now use the standardMicrosoft-Eventstream with the same xPath filterbicep/hardened/networking/networking.bicep: removed the explicit NetworkWatcher resource — Azure auto-creates one per region (quota = 1), so hardened networking always failed withResourceCountExceedsLimitDueToTemplateon subscriptions that already had the platform-managed watcher. Same fix as the default module (PR #114)bicep/hardened/security/security.bicep: declared the missingdeployerPrincipalTypeparameter (deploy.ps1 passes it in both modes — hardened security deployments failed with an undeclared-parameter error) and the Key Vault Secrets Officer role assignment no longer hard-codesprincipalType: 'User', fixing service-principal (CI/OIDC) hardened deploysdeploy.ps1:allowedCidrRanges/aksAuthorizedIpRangeswith exactly one entry crashed withThe property 'Count' cannot be found on this object— PowerShell unwraps single-element JSON arrays to scalars and.Counton a string throws under StrictMode; values are now normalized with@()so Bicep also always receives an arraydeploy.ps1: the ML workspace pre-flight permanent-delete no longer runs whenai.features.machineLearningis disabled — previously it could permanently destroy an existing workspace without recreating itdeploy.ps1:-WhatIfno longer performs destructive pre-flight operations (Container Apps Environment delete, ML workspace delete, Cognitive Services purge) — aWhat if: would ...line is logged insteadseed-data.ps1: replaced removedaz postgres/mysql flexible-server executecommands (removed in Azure CLI 2.85.0) with nativepsql/mysqlCLI calls; seeding is skipped automatically with an informational message when the client tool is not installedseed-data.ps1: strippedUSE <db>;statement before SQL batch execution to prevent Azure SQL parse errorspostgresqlfeature flag set tofalseby default in all profiles (full,hardened,databases-only) — now consistent withmysql(opt-in only)destroy.ps1:-WhatIfno longer deletes real resources —Remove-AdeResourceGroupnow wrapsaz group deleteand lock removal in$PSCmdlet.ShouldProcess()guardsdeploy.ps1:-EnableModulesno longer creates empty resource groups — allfalseboolean features in a previously-disabled module are auto-enabled when the module is force-enabled via-EnableModulesdeploy.ps1: interactive prompt added whenbudget: truebutbudgetAlertEmailis not set and running outside CI
Documentation
deploy.ps1help block: correcteddatabases-onlyprofile description (SQL + Cosmos DB, notSQL, Cosmos, PostgreSQL, MySQL, Redis)README.md: correcteddatamodule default resources column — all features are opt-in (matchesaimodule)README.md: updated test count to 577README.md: documentedbastionSku: "None"as valid value to skip Bastion deploymentREADME.md: added cost warning for-EnableModules data(auto-enables Synapse, Databricks, Purview)config/schema.json: added missing feature properties (alertEmail,allowedCidrRanges,domainController,domainName,sqlVm,aksAuthorizedIpRanges,budgetAlertEmail,autoShutdownTime,autoShutdownTimezone,autoStartEnabled,apimPublisherEmail,apimPublisherName) so the schema accurately reflects all valid profile properties
Release v1.0.0
[1.0.0] - 2026-04-09
Added
- Full Bicep module library:
ai,appservices,compute,containers,data,databases,governance,integration,monitoring,networking,security,storage - Hardened mode (
bicep/hardened/) with private endpoints, managed identities, AKS RBAC, and Policy assignments - Deployment profiles:
minimal,full,compute-only,databases-only,networking-only,security-focus,hardened deploy.ps1anddestroy.ps1orchestration scripts with WhatIf, profile, and skip-module supportseed-data.ps1for populating Storage, Cosmos DB, Azure SQL, PostgreSQL, MySQL, Redis, and Key Vault- Automation runbooks:
Start-AdeResources.ps1,Stop-AdeResources.ps1 - Cost dashboard script
Get-AdeCostDashboard.ps1 - Azure Policy definitions and initiative (
ade-governance-initiative) - CI pipeline: Bicep lint, JSON validation, PSScriptAnalyzer, Pester unit tests (544 passing)
- Deploy and Destroy GitHub Actions workflows with OIDC authentication
- Managed identity role assignments for Function App and Logic App
- Domain Controller VM support in compute and networking modules
- Hardened Cosmos DB:
disableLocalAuthcheck before key-based seeding - AKS authorized IP ranges wired through to
apiServerAccessProfile - File share private endpoint and DNS zone group in hardened storage
- GitHub repository hardening: SHA-pinned actions, input validation, concurrency groups, Dependabot
LICENSE(MIT),SECURITY.md,CONTRIBUTING.md- Pre-release manual test checklist (
docs/pre-release-checklist.md) covering all 12 modules and CIS v5.0.0 spot checks
Fixed
fileDnsZoneIdoutput propagated from hardened networking to storage- Admin username no longer hardcoded in
seed-data.ps1 - Spurious parameters removed from
deploy.ps1 - Stale section comment in
governance.bicep PSAvoidGlobalVarslint warnings in test suite —$global:replaced with$script:in all test filesGetNewClosuremissing from external-script Pester mocks causing variable scope leaksNew-AdeResourceGroupnow detects location conflicts on existing resource groups and throws a clear error instead of silently using the wrong regiondestroy.ps1silent failure bugs:$LASTEXITCODEnot checked afteraz group delete; failure tracking added; deploy what-if steps now tag RGs withmanagedBy=ade- Dead-code audit: removed phantom parameters, wired unconnected feature flags, documented integration/ai/data Public-access limitations
- Role check false-positive:
az role assignment list --include-inheriteddoes not traverse management group boundaries or expand group membership — replaced with multi-principal × multi-scope check covering MG ancestry and transitive group memberships - Hydration hang in
Initialize-AdeState: Azure CLI default 300 s timeout on non-existent resources — capped with--request-timeout 30 - Verbose logging:
Write-AdeLognow emits on PowerShell information stream (6) in addition to host, enabling*>&1 | Tee-Objectcapture;azcalls in key functions now log at Debug level