Terraformを利用したAzure SQL Databaseの構築
2019-10-18
azblob://2022/11/11/eyecatch/2019-10-18-creting-azure-sql-database-using-terraform-000.jpg

TerraformでAzure SQL Databaseを構築した際の手順を簡単にメモしておきます。

要件
・Terraformを利用してSQL Server / SQL Databaseを作成する
・東日本リージョンをプライマリ、西日本をセカンダリとする
・東西でgeoレプリケーションフェールオーバグループを構成する
・Terraformのバージョンはv0.12.11を利用

参考
azurerm_sql_server
azurerm_sql_failover_group
azurerm_sql_firewall_rule

Terraformのソースコード

まずSQL Serverの作成を行います。

resource "azurerm_sql_server" "sql01_je" {
  name                        = "${var.sql_server_name}je"
  resource_group_name          = "${var.resource_group_name}je"
  location                     = "${var.primary_location}"
  version                      = "12.0"
  administrator_login          = "${var.admin_username}"
  administrator_login_password = "${var.admin_password}"
}

resource "azurerm_sql_server" "sql01_jw" {
  name                         = "${var.sql_server_name}jw"
  resource_group_name          = "${var.resource_group_name}jw"
  location                     = "${var.secondary_location}"
  version                      = "12.0"
  administrator_login          = "${var.admin_username}"
  administrator_login_password = "${var.admin_password}"
}

次に、プライマリのSQL ServerにシングルDB(S0)を作成します。
geoレプリケーションを構成する場合、セカンダリはプライマリを参考に作成されるため、作成は不要となります。

resource "azurerm_sql_database" "sqldb01_je" {
  name                         = "${var.sql_database_name}"
  resource_group_name          = "${var.resource_group_name}je"
  location                     = "${var.primary_location}"
  server_name                  = "${azurerm_sql_server.sql01_je.name}"

  requested_service_objective_name = "S0"
}

フェールオーバグループの構成を行います。
 mode:自動フェールオーバの設定を「Manual」と「Automatic」で選択可能
 grace_minutes:自動フェールオーバまでの猶予期間(分)

resource "azurerm_sql_failover_group" "sqlfo01" {
  name                = "${var.sql_server_name}"
  resource_group_name = "${var.resource_group_name}je"
  server_name         = "${azurerm_sql_server.sql01_je.name}"
  databases           = ["${azurerm_sql_database.sqldb01_je.id}"]
  partner_servers {
      id = "${azurerm_sql_server.sql01_jw.id}"
  }

  read_write_endpoint_failover_policy {
    mode = "Automatic"
    grace_minutes = 60
  }
}

構築後の接続を確認するため、ファイアウォールにクライアントIPを追加します。

resource "azurerm_sql_firewall_rule" "Allow_client_je" {
  name                = "Allow_client"
  resource_group_name = "${var.resource_group_name}je"
  server_name         = "${azurerm_sql_server.sql01_je.name}"
  start_ip_address    = "${var.client_ip}"
  end_ip_address      = "${var.client_ip}"
}

resource "azurerm_sql_firewall_rule" "Allow_client_jw" {
  name                = "Allow_client"
  resource_group_name = "${var.resource_group_name}jw"
  server_name         = "${azurerm_sql_server.sql01_jw.name}"
  start_ip_address    = "${var.client_ip}"
  end_ip_address      = "${var.client_ip}"
}

リソース名などを変数で定義しています。

//サーバ名
variable "sql_server_name"
  default = "sqltfdemoserver01"
}

//DB名
variable "sql_database_name" {
  default = "sqldemodb"
}

//リソースグループ名(既存のものを参照)
variable "resource_group_name" {
  default = "sqldemorg"
}

//リージョン名
variable "primary_location" {
  default = "japaneast"
}

variable "secondary_location" {
  default = "japanwest"
}

//認証情報
variable "admin_username" {
  default = "XXXXXXXXXX"
}

variable "admin_password" {
  default = "XXXXXXXXXX"
}

//クライアントIP
variable "client_ip" {
  default = "X.X.X.X"
}

実行結果

実行結果のキャプチャを貼り付けておきます。

東西でSQL Serverが作成されている
フェールオーバグループが東西で構成されている
東がプライマリ、西がセカンダリとなり、エンドポイント名が指定した名前となっている
geoレプリケーションが構成され、西が読み取り専用となっている

リソースが作成され、geoレプリケーションとフェールオーバグループが構成されていることが確認できました。

所感

以上です。
インフラ構築もコード化して作業ミスを防止しましょう。