(cloud-azure)=
# The Microsoft Azure cloud and Juju
This document describes details specific to using your existing Microsoft Azure cloud with Juju.
> See more: [Microsoft Azure](https://azure.microsoft.com/en-us)
When using this cloud with Juju, it is important to keep in mind that it is a (1) machine cloud and (2) not some other cloud.
> See more: {ref}`cloud-differences`
As the differences related to (1) are already documented generically in the rest of the docs, here we record just those that follow from (2).
## Requirements
**If you're in a locked-down environment:**
Permissions:
- `Microsoft.Compute/skus (read)`
- `Microsoft.Resources/subscriptions/resourceGroups (read, write, delete)`
- `Microsoft.Resources/deployments/ (write/read/delete/cancel/validate)`
- `Microsoft.Network/networkSecurityGroups (write, read, delete, other - join)`
- `Microsoft.Network/virtualNetworks/ (write, read, delete)`
- `Microsoft.Compute/virtualMachineScaleSets/ (write, read, delete, other - start action, other - deallocate action, other - restart action, other powerOff action)`
- `Microsoft.Network/virtualNetworks/subnets/ (read, write, delete, other - join)`
- `Microsoft.Compute/availabilitySets (write, read, delete)`
- `Microsoft.Network/publicIPAddresses (write, read, delete, other - join - optional for public services)`
- `Microsoft.Network/networkInterfaces (write, read, delete, other - join)`
- `Microsoft.Compute/virtualMachines (write, read, delete, other - start, power off, restart, deallocate)`
- `Microsoft.Compute/disks (write, read, delete)`
## Notes on `juju add-cloud`
Type in Juju: `azure`.
Name in Juju: `azure`.
## Notes on `juju add-credential`
```{note}
Credentials for the `azure` cloud have been reported to occasionally stop working over time. If this happens, try `juju update-credential` (passing as an argument the same credential) or `juju add-credential` (passing as an argument a new credential) + `juju default-credential`.
```
```{note}
See Appendix: Example authentication workflows.
```
### Authentication types
#### `managed-identity` (preferred)
> *Requirements:*
> - Juju 3.6+.
> - A managed identity. See more: Appendix: How to create a managed identity.
> - The managed identity and the Juju resources must be created on the same subscription.
> - The `add-credential` steps must be run from either [the Azure Cloud Shell^](https://shell.azure.com/) or a jump host running in Azure in order to allow the cloud metadata endpoint to be reached.
This is the recommended way to authenticate with Azure as this way you are never touching your cloud credentials directly.
> See more: {ref}`azure-appendix-workflow-1`
#### `interactive` = "service-principal-secret-via-browser"
This is the recommended way to authenticate with Azure if you want to use a service principal secret.
When you add the credential in this way and provide the subscription ID, Juju will open up a browser and you’ll be prompted to log in to Azure.
Note: If you are using the unconfined `juju` snap `/snap/juju/current/bin/juju add-credential azure` and have the `azure` CLI and you are logged in and you want to use the currently logged in user: You may leave the subscription ID empty -- Juju will fill it in for you.
Caution: If you decide to fill in the optional fields as well: Make sure to set them to unique values (i.e., the `application-name` and `role-definition-name` fields cannot be the same).
Tip: Starting with Juju 3.6, you can also combine this authentication type with a managed identity by bootstrapping with the `instance-role` constraint.
> See more: {ref}`azure-appendix-workflow-2`, {ref}`azure-appendix-workflow-3`
#### `service-principal-secret` (dispreferred)
Starting with Juju 3.6, you can also combine this with a managed identity by bootstrapping with the `instance-role` constraint.
> See more: {ref}`azure-appendix-workflow-2`, {ref}`azure-appendix-workflow-3`
## Notes on `juju bootstrap`
If during `juju add-credential` you chose `interactive` (= "service-principal-secret-via-browser") or `service-principal-secret`: You can still combine this with a managed identity by running `juju bootstrap` with `--constraints instance-role=...`.
> See more: {ref}`azure-appendix-workflow-1`, Supported constraints
## Cloud-specific model configuration keys
### `load-balancer-sku-name`
Mirrors the LoadBalancerSkuName type in the Azure SDK.
| | |
|-|-|
| type | string |
| default value | "Standard" |
| immutable | false |
| mandatory | true |
### `resource-group-name`
If set, use the specified resource group for all model artefacts instead of creating one based on the model UUID.
| | |
|-|-|
| type | string |
| default value | schema.omit{} |
| immutable | true |
| mandatory | false |
### `network`
If set, use the specified virtual network for all model machines instead of creating one.
| | |
|-|-|
| type | string |
| default value | schema.omit{} |
| immutable | true |
| mandatory | false |
## Supported constraints
| {ref}`CONSTRAINT Valid values: `auto` (Juju creates a managed identity for you) or a [managed identity^](https://www.google.com/url?q=https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview&sa=D&source=docs&ust=1720105912478784&usg=AOvVaw2eioSYvtSn1pn-BWstI6AU) name in one of the following formats: - **If the managed identity is created in a resource group on the same subscription:** - **If the managed identity is created in a resource group on a different subscription:** - **If the managed identity is created in a resource group and that resource group is used to host the controller model:** Note: If you want your controller to be in the same resource group as the one used for the managed identity, during bootstrap also specify `--config resource-group-name= > See more: Appendix: Supported authentication types: Example workflows. |
| - {ref}`constraint-instance-type` | ✓
Valid values: `amd64` |
| - {ref}`constraint-container` | ✓ |
| - {ref}`constraint-cores` | ✓ |
| - {ref}`constraint-cpu-power` | ✕ |
| - {ref}`constraint-image-id` | ✕ |
| - {ref}`constraint-instance-role` | *Starting with Juju 3.6:* ✓
`
`
`
e.g., `juju bootstrap azure --config resource-group-name=
Valid values: See cloud provider. |
| - {ref}`constraint-mem` | ✓ |
| - {ref}`constraint-root-disk` | ✓ |
| - {ref}`constraint-root-disk-source` | ✓
Represents the juju {ref}`storage pool