Serialize changes to state
Use a shared concurrency group with cancel-in-progress disabled.
The tradeoffRuns may wait longer, but a newer run does not deliberately interrupt Terraform while it owns a state lease.
Inspect the decisionEphemeral Azure Platform
A cloud platform should be able to demonstrate its own lifecycle. This project brings provisioning, application delivery, verification, and teardown into one inspectable workflow.
Personal engineering project · Ephemeral Azure environmentThe 60-second overviewd87fd06Refresh Career Atlas after public repository changesTerraform provisions the network, AKS cluster, and Key Vault through GitHub OIDC authentication.
The workflow checks infrastructure, application delivery, admission policy, and secret synchronization before collecting evidence.
Cleanup runs in reverse dependency order. A separate janitor workflow provides a recovery path for tagged resources.
A successful Terraform apply is only one part of a working platform. The cluster also needs ready nodes, a reachable application, functioning policy controls, and a way to clean up after failure. Keeping a demonstration environment running indefinitely also creates an unnecessary cost commitment.
Choose a stage to explore its purpose and supporting source.
The job requests an OIDC identity token and uses configured Azure identity variables. Verification obtains its own Azure login session.
The workflow declares id-token: write and ARM_USE_OIDC, then invokes azure/login for verification.
Read the implementationUse a shared concurrency group with cancel-in-progress disabled.
The tradeoffRuns may wait longer, but a newer run does not deliberately interrupt Terraform while it owns a state lease.
Inspect the decisionCheck Azure provisioning state, Kubernetes readiness, and application behavior separately.
The tradeoffThe lifecycle takes more steps and can fail for more reasons. In exchange, an apply result is not mistaken for an operational service.
Inspect the decisionAttempt teardown after failure and keep a separate sweep for tagged resources.
The tradeoffThe environment is unavailable between runs, and recovery still depends on Azure permissions and working cleanup operations.
Inspect the decisionThe workflow joins infrastructure, GitOps application delivery, policy checks, and secret synchronization in a single ordered sequence.
Supporting sourceArtifact capture and teardown are configured to run after earlier failures. This makes diagnosis and cleanup explicit parts of delivery.
Supporting sourceThe troubleshooting log connects interrupted state leases to serialized runs and unexpected disk cost defaults to pull-request cost review.
Supporting sourceThe useful engineering work is in the boundaries: state dependencies, cloud permissions, default resource settings, and the difference between “created” and “working.” The repository records actual troubleshooting examples. Those lessons explain why the lifecycle has more than an apply and a destroy command.
Reviewed 4 September 2026. These links point to the source revision used for this case study.
Provisioning, verification, evidence capture, and teardown.
.github/workflows/apply-verify-destroy.ymlTag-based cleanup and shared concurrency.
.github/workflows/janitor.ymlOriginal rationale, constraints, and lessons from failures.
README.mdSource revision 4dc36ec · View current workflow history ↗