# Creating Automated Microsoft Bicep Application Infrastructure from GitHub in the Azure Cloud
## 2 Background and Related Work  
### Infrastructure as Code Concepts  
Infrastructure as code is a fundamental practice in modern cloud engineering that enables teams to define and provision infrastructure through machine-readable definition files, rather than performing manual configurations. By treating automated infrastructure provisioning, organizations can achieve consistent, repeatable, and auditable deployments across different environments. This approach is central to DevOps methodologies, where automation, collaboration, and rapid iteration are essential for delivering software reliably and at scale. IaC has emerged as a core DevOps practice through which to address these challenges. In its early stages, infrastructure provisioning was a manual, time-consuming task heavily reliant on system administrators configuring servers and networks by hand. This process was not only error-prone but also challenging to document and reproduce. Over time, the industry began shifting toward automation with the introduction of scripting and configuration management tools. These solutions allow teams to version-control infrastructure code, manage it as part of the application lifecycle, and fully integrate with CI/CD pipelines, thus significantly improving reliability, security, and scalability.  
Automation tools generally fall into two paradigms: declarative and imperative. In a declarative approach, the desired end state of the infrastructure is described without specifying the exact sequence of steps needed to achieve it. Tools such as Azure Bicep, Terraform, and AWS CloudFormation enable users to define the resources they want and their properties. At the same time, the underlying deployment engine determines how to reconcile the current state with the target state. Declarative is particularly valued for its idempotency, ensuring that applying the same configuration multiple times yields the same result each time [4; 5].  
By contrast, imperative software-defined infrastructure specifies the exact commands or steps required to provision resources. While this approach offers fine-grained control, it can lead to more brittle, complex, and error-prone deployments, especially at scale. Scripting tools like Ansible (in specific modes) or custom shell scripts exemplify this approach. In practice, the declarative model has become the preferred strategy for defining cloud infrastructure, as it simplifies management and reduces human error.  
The benefits of adopting IaC in a DevOps context are substantial. The programmable infrastructure promotes consistency and repeatability, ensuring that resources are provisioned in the same way across development, QA, and production environments. It enables version control of infrastructure definitions, facilitating code reviews, change tracking, and rollback in case of issues. Collaboration between developers and operations teams improves when infrastructure is represented as code, reducing silos and miscommunication. Automation through CI/CD pipelines further enhances reliability by eliminating manual steps and integrating infrastructure deployment into the overall delivery process. Finally, automated infrastructure provisioning improves compliance and security by providing a clear, auditable trail of changes and configurations, making it easier to enforce policies and detect drift over time [6; 7; 8].