This article answers the question: How can I configure geo-replication in TerraForm? And explains that this is actually built into the TerraForm Azure rm provider, and provides the code to do it.
Hello All, a short post this week, but as we talk about availability, chaos engineering, etc. One of the most common data elements I see out there is SQL, and Azure SQL. SQL is a prevelant and common data store, it’s everywhere you look.
Given that, many shops are implementing infrastructure-as-code to manage configuration drift and provide increased resiliency for their applications. Which is definitely a great way to do that. The one thing that I’ve had a couple of people talk to me about that isn’t clear…how can I configure geo-replication in TerraForm.
This actually built into the TerraForm azure rm provider, and can be done with the following code:
provider "azurerm" {
subscription_id = ""
features {
key_vault {
purge_soft_delete_on_destroy = true
}
}
}
data "azurerm_client_config" "current" {}
resource "azurerm_resource_group" "rg" {
name = "sqlpoc"
location = "{region}"
}
resource "azurerm_sql_server" "primary" {
name = "kmack-sql-primary"
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = "{password}"
}
resource "azurerm_sql_server" "secondary" {
name = "kmack-sql-secondary"
resource_group_name = azurerm_resource_group.rg.name
location = "usgovarizona"
version = "12.0"
administrator_login = "sqladmin"
administrator_login_password = "{password}"
}
resource "azurerm_sql_database" "db1" {
name = "kmackdb1"
resource_group_name = azurerm_sql_server.primary.resource_group_name
location = azurerm_sql_server.primary.location
server_name = azurerm_sql_server.primary.name
}
resource "azurerm_sql_failover_group" "example" {
name = "sqlpoc-failover-group"
resource_group_name = azurerm_sql_server.primary.resource_group_name
server_name = azurerm_sql_server.primary.name
databases = [azurerm_sql_database.db1.id]
partner_servers {
id = azurerm_sql_server.secondary.id
}
read_write_endpoint_failover_policy {
mode = "Automatic"
grace_minutes = 60
}
}
Now above TF, will deploy two database servers with geo-replication configured. The key part is the following:
resource "azurerm_sql_failover_group" "example" {
name = "sqlpoc-failover-group"
resource_group_name = azurerm_sql_server.primary.resource_group_name
server_name = azurerm_sql_server.primary.name
databases = [azurerm_sql_database.db1.id]
partner_servers {
id = azurerm_sql_server.secondary.id
}
read_write_endpoint_failover_policy {
mode = "Automatic"
grace_minutes = 60
}
}
The important elements are “server_name” and “partner_servers”, this makes the connection to where the data is being replicated. And then the “read_write_endpoint_failover_policy” setups up the failover policy.