Terraform: Split To Get Values
Description:
As with many languages, you can perform a split function on a string in Terraform. Here is an example of how I can target to get specific values.
To Resolve:
- For example, let’s say I want to get some value from a Storage Account ID, I could do something like the following:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.10.0"
}
}
required_version = "~>1.1.0"
}
provider "azurerm" {
client_id = var.client_id
client_secret = var.client_secret
subscription_id = var.subscription_id
tenant_id = var.tenant_id
skip_provider_registration = true
features {}
}
variable "tenant_id" {
description = "(Required) Service Principal AD Tenant ID - Azure AD for terraform authentication."
type = string
}
variable "subscription_id" {
description = "(Required) Azure Subscription Id used to connect to AzureRM provider."
type = string
}
variable "client_id" {
description = "(Required) Service Principal App ID - Azure AD for terraform authentication."
type = string
}
variable "client_secret" {
description = "(Required) Service Principal Client Secret - Azure AD for terraform authentication."
type = string
}
resource "azurerm_resource_group" "rg" {
name = "tx-storage-rg"
location = "southcentralus"
}
resource "azurerm_storage_account" "example" {
name = "aatxstorage145"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
account_tier = "Standard"
account_replication_type = "LRS"
}
output "data1" {
value = azurerm_storage_account.example.id
}
output "data2" {
value = split("/", azurerm_storage_account.example.id)[2]
}
output "data3" {
value = split("/", azurerm_storage_account.example.id)
}
- When I run an apply, I get the following:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> terraform apply -auto-approve -input=false ./tf.plan
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
data1 = "/subscriptions/xxx-xxxx-xxx/resourceGroups/tx-storage-rg/providers/Microsoft.Storage/storageAccounts/aatxstorage145"
data2 = "xxx-xxxx-xxx"
Changes to Outputs:
+ data3 = [
+ "",
+ "subscriptions",
+ "xxx-xxxx-xxx",
+ "resourceGroups",
+ "tx-storage-rg",
+ "providers",
+ "Microsoft.Storage",
+ "storageAccounts",
+ "aatxstorage145",
]
-
Now that we know the values for each index, we can simply pass them around as needed:
- Using
split("/", azurerm_storage_account.example.id)[2]
will get us the subscription ID the Storage Account is in. - Using
split("/", azurerm_storage_account.example.id)[4]
will get us the Resource Group the Storage Account is in. - Using
split("/", azurerm_storage_account.example.id)[8]
will get us the Storage Account Name.
- Using
-
Commonly, you will use these in locals for a simple value that can be passed to other places as needed:
1
2
3
4
5
locals {
sa_sub_id = split("/", azurerm_storage_account.example.id)[2]
sa_rg = split("/", azurerm_storage_account.example.id)[4]
sa_name = split("/", azurerm_storage_account.example.id)[8]
}
-
Note that it is better and preferred to get the output of a resource instead of relying on parsing the
id
. This was just an example of how you can take a string, split it, and store its values in other variables to be referenced in other places.- For example, sa_rg should be
azurerm_storage_account.resource_group_name
- And sa_name should be
azurerm_storage_account.name
- But where would you get the subscription ID the storage account is deployed to? One option, as listed above, is to parse the
id
property and extract it.
- For example, sa_rg should be
Comments