Deploy Azure Storage Account Con Terraform JSON

En este post quiero explicaros como podemos desplegar Infraestructura como código a través de Terraform, pero en vez de usar la sintaxis nativa usaremos la alternativa que es compatible con JSON.

¿Esto como sucede?

Terraform también soporta una sintaxis alternativa que es compatible con JSON. Esta sintaxis es útil cuando se generan partes de una configuración mediante programación, ya que se pueden utilizar las bibliotecas JSON existentes para preparar los archivos de configuración generados. La sintaxis JSON se define en términos de la sintaxis nativa. Todo lo que se puede expresar en sintaxis nativa también se puede expresar en sintaxis JSON, pero algunas construcciones son más complejas de representar en JSON debido a las limitaciones de la gramática JSON. Terraform espera la sintaxis nativa para los archivos nombrados con un sufijo .tf, y la sintaxis JSON para los archivos nombrados con un sufijo .tf.json.

¿Qué son los Azure Storage Accounts?

Azure Storage Account contiene todos los objetos de datos de Azure Storage, incluidos blobs, recursos compartidos de archivos, colas, tablas y discos. La cuenta de almacenamiento (Storage Accounts) proporciona un espacio de nombres único para los datos de Azure Storage que es accesible desde cualquier lugar del mundo mediante HTTP o HTTPS. Los datos de la cuenta de almacenamiento son duraderos y altamente disponibles, seguros y escalables a gran escala. Una vez que tenemos esto, vamos a desplegar un Storage Account a través de Terraform usando la sintaxis alternativa:

main.tf.json

 1{
 2	"data": {
 3		"azurerm_subscription": {
 4			"current": {}
 5		},
 6		"azurerm_client_config": {
 7			"current": {}
 8		},
 9		"azuread_domains": {
10			"aad_domains": {
11				"only_default": "true"
12			}
13		}
14	},
15	"resource": {
16		"azurerm_resource_group": {
17			"rg": {
18				"name": "${var.resource_group_name}",
19				"location": "${var.location}",
20				"tags": "${var.tags}"
21			}
22		}
23	}
24}

providers.tf.json

 1{
 2	"data": {
 3		"azurerm_subscription": {
 4			"current": {}
 5		},
 6		"azurerm_client_config": {
 7			"current": {}
 8		},
 9		"azuread_domains": {
10			"aad_domains": {
11				"only_default": "true"
12			}
13		}
14	},
15	"resource": {
16		"azurerm_resource_group": {
17			"rg": {
18				"name": "${var.resource_group_name}",
19				"location": "${var.location}",
20				"tags": "${var.tags}"
21			}
22		}
23	}
24}

sta.tf.json

 1{
 2    "resource": {
 3        "azurerm_storage_account": {
 4            "sta": {
 5                "name": "${var.name-sta}",
 6                "resource_group_name": "${azurerm_resource_group.rg.name}",
 7                "location": "${var.location}",
 8                "account_tier": "${var.sku-sta}",
 9                "account_replication_type": "${var.replication-type-sta}",
10                "enable_https_traffic_only": "${var.http-traffic-only-sta}",
11                "tags": "${var.tags}"
12            }
13        },
14        "azurerm_storage_container": {
15            "sta_container": {
16                "name": "${var.name-sta-container}",
17                "storage_account_name": "${azurerm_storage_account.sta.name}",
18                "container_access_type": "${var.access-type-sta-container}"
19            }
20        }
21    }
22}

variable.tf

 1#Commons
 2variable "location" {
 3  description = "(Required) Location of the all services to be created"
 4  default="westeurope"
 5}
 6
 7variable "resource_group_name" {
 8  description = "(Required) Resource group name of the all services to be created"
 9  default= "TestTF"
10}
11
12variable "tags" {
13  description = "(Required) Tags to be applied to the all services to be created"
14  default = { Project = "jumpstart_azure_tf" }
15}
16
17# Storage Account
18variable "name-sta" {
19  description = "(Required) Name of Storage Account"
20  default="statestingaz"
21}
22
23variable "sku-sta" {
24  description = "(Required) Sku Storage Account"
25  default="Standard"
26}
27
28variable "replication-type-sta" {
29  description = "(Required) Replication type on Storage Account"
30  default="LRS"
31}
32
33variable "http-traffic-only-sta" {
34  description = "(Required) http-traffic-only-sta Storage Account"
35  default=true
36}
37
38variable "name-sta-container" {
39  description = "(Required) Name of Storage Account Container"
40  default="tfstate"
41}
42
43variable "access-type-sta-container" {
44  description = "(Required) Access Type of Storage Account Container"
45  default="private"
46}

De esta forma tendremos nuestro proyecto completamente automatizado.

Saludos!