Difference between revisions of "Azure/Terraform"
< Azure
		
		
		
		Jump to navigation
		Jump to search
		| Line 43: | Line 43: | ||
   }  |    }  | ||
}  | }  | ||
</source>  | |||
Configure azurerm backend via <code>terraform init</code>  | |||
<source lang=json>  | |||
terraform init -input=false \                                                                         | |||
               -backend=true \                                                                        | |||
               -backend-config="resource_group_name=${LOCATION_STATE_STORAGE_RESOURCE_GROUP_NAME}" \  | |||
               -backend-config="storage_account_name=${LOCATION_STATE_STORAGE_ACCOUNT}" \             | |||
               -backend-config="container_name=${LOCATION_STATE_STORAGE_CONTAINER}" \                 | |||
               -backend-config="key=${LOCATION_STATE_KEY}"                                            | |||
</source>  | </source>  | ||
| Line 49: | Line 59: | ||
<source>  | <source>  | ||
# High Level View  | # High Level View  | ||
#   | # https://<storage_account>.blob.core.windows.net/<container>/<key/tfstate>  | ||
#   | # https://infrarg.blob.core.windows.net/tfstate/tfstate(state_file)  | ||
#   | # https://infrarg.blob.core.windows.net/tfstate/stack  (folder)/terraform.tfstate(state_file)  | ||
#   | # https://infrarg.blob.core.windows.net/tfstate/storage(folder)/terraform.tfstate(state_file)  | ||
</source>  | </source>  | ||
Revision as of 20:48, 3 May 2019
Store Terraform state in Azure Storage
Create blob storage
export ARM_SUBSCRIPTION=aabbccdd-1122-11aa22bb3-11aa22bb33cc
#!/bin/bash
RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate${ARM_SUBSCRIPTION::8}
CONTAINER_NAME=tfstate
REGION=eastus
# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location $REGION
# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME \
                         --sku Standard_LRS --encryption-services blob
# Get storage account key
ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query [0].value -o tsv)
# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --account-key $ACCOUNT_KEY
echo "storage_account_name: $STORAGE_ACCOUNT_NAME"
echo "container_name: $CONTAINER_NAME"
echo "access_key: $ACCOUNT_KEY"
azurerm backend config
terraform {
  required_version = "= 0.11.11"
# backend "local"   {}
  backend "azurerm" {
#                           tfstate<Subscription8chars>
    storage_account_name = "tfstate01234567" #only lowercase letters nad numbers unique across Azure
    container_name       = "infrarg"         #only lowercase letters and numbers
    key                  = "tfstate"         #state file name, when delimited with '/' will create a folder aka prefix in AWS
#   key                  = "stack/tfstate"
#   access_key           = "ARM_ACCESS_KEY"  #optional access_key in plain text it's advised to export variable
  }
}
Configure azurerm backend via terraform init
terraform init -input=false \                                                                       
               -backend=true \                                                                      
               -backend-config="resource_group_name=${LOCATION_STATE_STORAGE_RESOURCE_GROUP_NAME}" \
               -backend-config="storage_account_name=${LOCATION_STATE_STORAGE_ACCOUNT}" \           
               -backend-config="container_name=${LOCATION_STATE_STORAGE_CONTAINER}" \               
               -backend-config="key=${LOCATION_STATE_KEY}"
Using the key argument like in s3 backend you can store state files in hierarchy structure. Eg:
# High Level View # https://<storage_account>.blob.core.windows.net/<container>/<key/tfstate> # https://infrarg.blob.core.windows.net/tfstate/tfstate(state_file) # https://infrarg.blob.core.windows.net/tfstate/stack (folder)/terraform.tfstate(state_file) # https://infrarg.blob.core.windows.net/tfstate/storage(folder)/terraform.tfstate(state_file)
Example changing state from local to azurerm. Note Previous and New temporarly saved state files.
Initializing the backend... Backend configuration changed! Terraform has detected that the configuration specified for the backend has changed. Terraform will now check for existing state in the backends. Terraform detected that the backend type changed from "local" to "azurerm". Do you want to copy existing state to the new backend? Pre-existing state was found while migrating the previous "local" backend to the newly configured "azurerm" backend. An existing non-empty state already exists in the new backend. The two states have been saved to temporary files that will be removed after responding to this query. Previous (type "local"): /tmp/terraform962571048/1-local.tfstate New (type "azurerm"): /tmp/terraform962571048/2-azurerm.tfstate Do you want to overwrite the state in the new backend with the previous state? Enter "yes" to copy and "no" to start with the existing state in the newly configured "azurerm" backend. Enter a value: yes Releasing state lock. This may take a few moments... Successfully configured the backend "azurerm"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... Terraform has been successfully initialized!
Key notes:
- you must create resource_group and storage_account before migrating backend
 - both container and full prefixed path aka folders will be created when needed
 - when moving backend temporarly remove 
-input=falsefrom <terraform init command 
References
- Store Terraform state in Azure Storage official Ms docs
 - azurerm Terraform backend official Terraform doc