Start here. This is the direct spoken answer to practice first.
Why this question matters
Infrastructure as code turns cloud configuration into a reviewable and repeatable part of delivery. The difficult parts are ownership, state, permissions, migration from existing resources, and the blast radius of an incorrect change.
I would inventory the current resources and decide clear ownership before writing templates. The desired infrastructure would live in version control as declarative Bicep or Terraform modules, with environment differences supplied through parameters rather than copied templates. Pull requests would validate and preview changes with Bicep what-if or Terraform plan, and a protected pipeline identity would apply the reviewed change. Secrets would be referenced from a secret store instead of committed as parameter values.