Announcing AzAPI 2.0
The AzAPI provider, designed to expedite the integration of new Azure services with HashiCorp Terraform, has now released 2.0. This updated version marks a significant step in our goal to provide launch day support for Azure services using Terraform.
What is the AzAPI Provider?
The AzAPI provider functions as a lightweight layer atop the Azure ARM REST APIs. It is a first class provider experience along with the AzureRM provider. Azure resources that might not yet be or may never be supported in AzureRM can be accessed by this provider, including private/public preview services and features.
Key Features of the AzAPI Provider Include:
- Resource-specific versioning, allowing users to switch to a new API version without altering provider versions.
- Special functions like `azapi_update_resource` and `azapi_resource_action`.
- Immediate Day 0 support for new services.
Ready to see the new updates? Let’s take a look!
No More JSON!
All resource properties, outputs, and state representation are now handled with HashiCorp Configuration Language (HCL) instead of JSON. This change allows the use of all native Terraform HCL functionalities. For more info on scenarios on usage, check out our initial announcement.
Clarity with Outputs
Outputs are now customizable through the `response_export_values` property, which can function as either a list or a map.
For instance, to export response values for an Azure container registry:
- If I set the value to a list, i.e. response_export_values = `["properties.loginServer", "properties.policies.quarantinePolicy.status"]` , I would get the following output:
{
properties = {
loginServer = "registry1.azurecr.io"
policies = {
quarantinePolicy = {
status = "disabled"
}
}
}
}
- If I instead set the value to a map using JMESPath querying, i.e. response_export_values = `{"login_server": "properties.loginServer", "quarantine_status": "properties.policies.quarantinePolicy.status"}`, I would get the following output:
{
"login_server" = "registry1.azurecr.io"
"quarantine_status" = "disabled"
}
This feature uses a key-value configuration, making it easier to specify exact output values. For example, you can set `{"login_server": "properties.loginServer", "quarantine_status": "properties.policies.quarantinePolicy.status"}`.
retry Block
User-defined retriable errors via the retry block help the provider digest errors when expected. For example, if a resource may run into a create timeout issue, the following block of code may help:
resource "azapi_resource" "example" {
# usual properties
retry {
interval_seconds = 5
randomization_factor = 0.5 # adds randomization to retry pattern
multiplier = 2 # if try fails, multiplies time between next try by this much
error_message_regex = ["ResourceNotFound"]
}
timeouts {
create = "10m"
}
Preflight Support
Preflight validation, enabled by a feature flag, will identify errors without deploying resources, providing a quicker feedback loop. For example, in a config with several resources, an invalid network addressPrefix definition will be caught quickly:
provider "azapi" {
enable_preflight = true
}
resource "azapi_resource" "vnet" {
type = "Microsoft.Network/virtualNetworks@2024-01-01"
parent_id = azapi_resource.resourceGroup.id
name = "example-vnet"
location = "westus"
body = {
properties = {
addressSpace = {
addressPrefixes = [
"10.0.0.0/160", # preflight will throw an error here
]
}
}
}
}
Resource Replacement Triggers
Customize specific methods of replacing your resource.
- replace_triggers_external_values: Replaces if specified external values change.
- replace_triggers_refs: Triggers a resource replacement based on changes in specified paths.
Resource Discovery
Discover resources under a parent ID such as a subscription, virtual network, or resource group using the new `azapi_resource_list` data source. You can also filter using query parameters as shown below:
data "azapi_client_config" "current" {}
data "azapi_resource_list" "listPolicyDefinitionsBySubscription" {
type = "Microsoft.Authorization/policyDefinitions@2021-06-01"
parent_id = "/subscriptions/${data.azapi_client_config.current.subscription_id}"
query_parameters = {
"$filter" = ["policyType eq 'BuiltIn'"]
}
response_export_values = ["*"]
}
output "o1" {
value = data.azapi_resource_list.listPolicyDefinitionsBySubscription.output
}
AzAPI Provider Functions
AzAPI now supports several Terraform provider functions:
- build_resource_id: Constructs an Azure resource ID.
- parse_resource_id: Breaks down an Azure resource ID into its components.
- subscription_resource_id: Constructs an Azure subscription scope resource ID.
- tenant_resource_id: Builds an Azure tenant scope resource ID.
- management_group_resource_id: Creates an Azure management group scope resource ID.
- resource_group_resource_id: Forms an Azure resource group scope resource ID.
- extension_resource_id: Generates an Azure extension resource ID with additional names.
To check out the references and examples, visit the Terraform registry.
AzAPI VSCode Extension Improvements
The release coincides with updates to the VSCode extension:
- Code Samples: Quickly insert code samples from our auto-gen pipeline:
- Paste as AzAPI: Convert JSON or ARM templates directly into HCL:
Conclusion
AzAPI 2.0 brings numerous enhancements, promising a better Terraform experience on Azure. With these features, we believe that you can use AzAPI as a standalone provider to meet any of your infrastructure needs. Stay tuned for a blogpost coming on suggestions for when to use each provider. Be sure to explore the new features; we're confident you’ll enjoy them!
If you haven’t yet, check out the provider: https://registry.terraform.io/providers/Azure/azapi/latest/docs
Published on:
Learn moreRelated posts
Unlocking the Best of Azure with AzureRM and AzAPI Providers
With the recent release of AzAPI 2.0, Azure offers two powerful Terraform providers to meet your infrastructure needs: AzureRM and AzAPI. The ...
Azure CLI docker container base Linux image is now Azure Linux
Starting from the version 2.64.0 of Azure CLI, the base Linux distribution of Azure CLI is now Azure Linux. Impact of the change ...
Mastering the Shorthand Syntax in your daily workflow
Introduction In this tech blog, we'll unravel the magic behind Azure CLI shorthand syntax and discover how it can elevate your command-line ex...
Azure Verified Modules - Monthly Update [June]
AVM Module Summary The AVM team are excited that our community have been busy building AVM Modules. As of June 17th, the AVM Footprint curren...
Azure Verified Modules - Monthly Update [May]
Quarterly Community Call This month we held our first community call. Thank you to everyone that attended & contributed. It was amazing t...
Azure CLI and PowerShell Tools Build 2024 Announcement
Microsoft has announced several new capabilities for Azure CLI and Azure PowerShell at the Microsoft Build 2024. The priority remains to provi...
Terraform on Azure May 2024 Update
Welcome to our April 2024 update! These blogposts will be covering everything we've gotten up to recently with Terraform on Azu...
Azure Verified Modules - Monthly Update [April]
In the April edition of the Azure Verified Modules update, the AVM team announces their upcoming quarterly community call scheduled for 21st M...
Announcing AzAPI Dynamic Properties
It’s been almost two years since the announcement of AzAPI, and the provider has eclipsed 20M+ downloads thanks to all of you. We’re ex...
Demystifying Azure CLI pagnination
Introduction Pagination in the context of the command line refers to the process of displaying long lists of information or text i...