-
Having the Terraform azure state file under different subscription
I have two subscriptions in Azure. Let’s call them sub-dev and sub-prod. Under sub-dev I have resources for development (in a resource group rg-dev) and under sub-prod resources for production (in a resource group rg-prod).
Now, I would like to have only one state-file for both dev and prod. I can do this as I am using Terraform workspaces (dev and prod). There is a Storage Account under sub-dev (rg-dev) named tfsate. It has a container etc. The Azure backend is configured like this:
terraform { backend "azurerm" { resource_group_name = "rg-dev" storage_account_name = "tfstate" container_name = "tfcontainer" key = "terraform.tfstate" } }
If I want to apply to the dev environment I have to switch Az Cli to the sub-dev. Similarly, for production, I would have to use sub-prod. I switch the default subscription with az cli:
az account set -s sub-prod
Problem is that the state’s storage account is under sub-dev and not sub-prod. I will get access errors when trying to
terraform init
(or apply) when the default subscription is set to sub-prod.Error: Failed to get existing workspaces: Error retrieving keys for Storage Account "tfstate": storage.AccountsClient#ListKeys: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="AuthorizationFailed" Message="The client 'user@example.com' with object id '<redacted>' does not have authorization to perform action 'Microsoft.Storage/storageAccounts/listKeys/action' over scope '/subscriptions/sub-prod/resourceGroups/rg-dev/providers/Microsoft.Storage/storageAccounts/tfstate' or the scope is invalid. If access was recently granted, please refresh your credentials."
I have tried couple of things:
- I added
subscription_id = "sub-dev"
- I generated a SAS token for the tfstate storage account and added the
sas_token
config value (removedresource_group_name
)
but in vain and getting the same error.
I tried to
az logout
but terraform requires me to login first. Do I have to tune the permissions in the Azure end somehow (this is hard as the Azure environment is configured by a 3rd party) or does Terraform support this kind of having your state file under different subscription setup at all? - I added
Log in to reply.