Azure Provider: Authenticating using the Azure CLI
Terraform supports a number of different methods for authenticating to Azure:
- Authenticating to Azure using the Azure CLI (which is covered in this guide)
- Authenticating to Azure using Managed Service Identity
- Authenticating to Azure using a Service Principal and a Client Certificate
- Authenticating to Azure using a Service Principal and a Client Secret
- Authenticating to Azure using a Service Principal and Open ID Connect
We recommend using either a Service Principal or Managed Service Identity when running Terraform non-interactively (such as when running Terraform in a CI server) - and authenticating using the Azure CLI when running Terraform locally.
Important Notes about Authenticating using the Azure CLI
- Prior to version 1.20, the AzureRM Provider used a different method of authorizing via the Azure CLI where credentials reset after an hour - as such, we'd recommend upgrading to version 1.20 or later of the AzureRM Provider.
- Terraform only supports authenticating using the
az
CLI (and this must be available on your PATH) - authenticating using the olderazure
CLI or PowerShell Cmdlets are not supported. - Authenticating via the Azure CLI is only supported when using a User Account. If you're using a Service Principal (for example via
azLoginServicePrincipal
) you should instead authenticate via the Service Principal directly (either using a Client Secret or a Client Certificate).
Logging into the Azure CLI
\~> Note: If you're using the China, German or Government Azure Clouds - you'll need to first configure the Azure CLI to work with that Cloud. You can do this by running:
Firstly, login to the Azure CLI using:
Once logged in - it's possible to list the Subscriptions associated with the account via:
The output (similar to below) will display one or more Subscriptions - with the id
field being the subscriptionId
field referenced above.
[
{
"cloudName": "AzureCloud",
"id": "00000000-0000-0000-0000-000000000000",
"isDefault": true,
"name": "PAYG Subscription",
"state": "Enabled",
"tenantId": "00000000-0000-0000-0000-000000000000",
"user": {
"name": "user@example.com",
"type": "user"
}
}
]
Should you have more than one Subscription, you can specify the Subscription to use via the following command:
Configuring Azure CLI authentication in Terraform
Now that we're logged into the Azure CLI - we can configure Terraform to use these credentials.
To configure Terraform to use the Default Subscription defined in the Azure CLI - we can use the following Provider block:
/*Provider bindings are generated by running cdktf get.
See https://cdk.tf/provider-generation for more details.*/
import * as azurerm from "./.gen/providers/azurerm";
/*The following providers are missing schema information and might need manual adjustments to synthesize correctly: hashicorp/azurerm.
For a more precise conversion please use the --provider flag in convert.*/
new azurerm.provider.AzurermProvider(this, "azurerm", {
features: [{}],
});
More information on the fields supported in the Provider block can be found here.
At this point running either terraformPlan
or terraformApply
should allow Terraform to run using the Azure CLI to authenticate.
It's also possible to configure Terraform to use a specific Subscription - for example:
/*Provider bindings are generated by running cdktf get.
See https://cdk.tf/provider-generation for more details.*/
import * as azurerm from "./.gen/providers/azurerm";
/*The following providers are missing schema information and might need manual adjustments to synthesize correctly: hashicorp/azurerm.
For a more precise conversion please use the --provider flag in convert.*/
new azurerm.provider.AzurermProvider(this, "azurerm", {
features: [{}],
subscription_id: "00000000-0000-0000-0000-000000000000",
});
More information on the fields supported in the Provider block can be found here.
At this point running either terraformPlan
or terraformApply
should allow Terraform to run using the Azure CLI to authenticate.
If you're looking to use Terraform across Tenants - it's possible to do this by configuring the Tenant ID field in the Provider block, as shown below:
/*Provider bindings are generated by running cdktf get.
See https://cdk.tf/provider-generation for more details.*/
import * as azurerm from "./.gen/providers/azurerm";
/*The following providers are missing schema information and might need manual adjustments to synthesize correctly: hashicorp/azurerm.
For a more precise conversion please use the --provider flag in convert.*/
new azurerm.provider.AzurermProvider(this, "azurerm", {
features: [{}],
subscription_id: "00000000-0000-0000-0000-000000000000",
tenant_id: "11111111-1111-1111-1111-111111111111",
});
More information on the fields supported in the Provider block can be found here.
At this point running either terraformPlan
or terraformApply
should allow Terraform to run using the Azure CLI to authenticate.