Skip to content

Resources

llms.txt lists every page for an agent

Every Azure resource has a type in the format Microsoft.{Provider}/{ResourceType}. The lexicon generates a TypeScript class for each type.

import { StorageAccount, VirtualMachine, WebApp } from "@intentius/chant-lexicon-azure";

Common resource types:

TypeClassDescription
Microsoft.Storage/storageAccountsStorageAccountBlob, file, queue, table storage
Microsoft.Compute/virtualMachinesVirtualMachineIaaS virtual machines
Microsoft.Web/sitesWebAppApp Service web applications
Microsoft.Web/serverfarmsAppServicePlanApp Service plans
Microsoft.Network/virtualNetworksVirtualNetworkVirtual networks
Microsoft.Network/networkSecurityGroupsNetworkSecurityGroupFirewall rules
Microsoft.ContainerService/managedClustersManagedClusterAKS Kubernetes clusters
Microsoft.KeyVault/vaultsKeyVaultSecret and key management
Microsoft.Sql/serversSqlServerAzure SQL logical servers
Microsoft.ContainerRegistry/registriesContainerRegistryDocker container registries

ARM templates have fields that sit at the resource level (outside properties):

The pricing tier or capability level:

export const storage = new StorageAccount({
sku: { name: "Standard_GRS" },
});

Disambiguates resource subtypes:

export const storage = new StorageAccount({
kind: "StorageV2", // or "BlobStorage", "BlockBlobStorage"
});

Managed identity configuration:

export const app = new WebApp({
identity: { type: "SystemAssigned" },
});

Key-value metadata:

export const storage = new StorageAccount({
tags: { environment: "production", team: "platform" },
});

Availability zone placement:

export const vm = new VirtualMachine({
zones: ["1"],
});

Marketplace plan information:

export const vm = new VirtualMachine({
plan: {
name: "my-plan",
publisher: "my-publisher",
product: "my-product",
},
});

Azure region. Defaults to [resourceGroup().location]:

import { Azure } from "@intentius/chant-lexicon-azure";
export const storage = new StorageAccount({
location: Azure.ResourceGroupLocation, // default
// or: location: "eastus2",
});

Everything that isn’t a resource-level field goes under the template’s properties. Pass the fields flat, or pass ARM’s own properties object as the generated types describe it; either way the template has one properties level.

A resource’s name prop is its ARM name, and the export name stands in only when there is no name. A reference to another resource uses the ARM name: .id becomes [resourceId('<type>', '<name>')], any other attribute becomes [reference('<name>').<attribute>], and dependsOn is inferred from both. A child resource named vnet/apps gets one resourceId argument per segment.

Every ARM resource requires an apiVersion. The serializer fills in the latest stable version, so you rarely set it.

The post-synth checks AZR011 and AZR012 validate:

  • AZR011: apiVersion exists and follows YYYY-MM-DD format
  • AZR012: apiVersion is not outdated (older than 2023-01-01)

chant