Terraformを利用して、Azure SQL serverの設定を実現

背景：
お客様はTerraformを利用して、SQL serverに対してaudit logを設定しようとします。
しかし失敗しました。それを究明するため、自分のdev 環境でテストをしました。

テスト：
1.下記のtest.tfファイルを準備します。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
data "azurerm_client_config" "current" {}

provider "azurerm" {
  features {}
}

terraform {
  required_version = ">= 0.12"
}

locals {
  primary_sql_server_name   = "jcline-sqlsvr-primary"
  secondary_sql_server_name = "jcline-sqlsrv-secondary"
}

# SQL RG
resource "azurerm_resource_group" "pipeline" {
  name     = "jcline-cx-repro-pipeline"
  location = "
  "
}

# AE RG
resource "azurerm_resource_group" "AE" {
  name     = "jcline-cx-repro-log-AE"
  location = "eastus"
}

# SE RG
resource "azurerm_resource_group" "SE" {
  name     = "jcline-cx-repro-log-SE"
  location = "westus2"
}

# SA AE
resource "azurerm_storage_account" "sa_ae" {
  name                = "jclineaesa01"
  resource_group_name = azurerm_resource_group.AE.name

  location                 = azurerm_resource_group.AE.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

# SA SE
resource "azurerm_storage_account" "sa_se" {
  name                = "jclineaese01"
  resource_group_name = azurerm_resource_group.SE.name

  location                 = azurerm_resource_group.SE.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

# Primary SQL Server
resource "azurerm_sql_server" "server" {
  name                         = local.primary_sql_server_name
  resource_group_name          = azurerm_resource_group.pipeline.name
  location                     = azurerm_resource_group.pipeline.location
  version                      = "12.0"
  administrator_login          = "azureadmin"
  administrator_login_password = "R@nd0mP4$$w0rd!"

  extended_auditing_policy {
    storage_endpoint                        = azurerm_storage_account.sa_ae.primary_blob_endpoint
    storage_account_access_key              = azurerm_storage_account.sa_ae.primary_access_key
    storage_account_access_key_is_secondary = false
    retention_in_days                       = 7
  }
}

# Secondary SQL Server
resource "azurerm_sql_server" "server_secondary" {
  name                         = local.secondary_sql_server_name
  resource_group_name          = azurerm_resource_group.pipeline.name
  location                     = azurerm_resource_group.pipeline.location
  version                      = "12.0"
  administrator_login          = "azureadmin"
  administrator_login_password = "R@nd0mP4$$w0rd!"

  extended_auditing_policy {
    storage_endpoint                        = azurerm_storage_account.sa_se.primary_blob_endpoint
    storage_account_access_key              = azurerm_storage_account.sa_se.primary_access_key
    storage_account_access_key_is_secondary = false
    retention_in_days                       = 7
  }

}

resource "azurerm_sql_active_directory_administrator" "primary_AD" {
  server_name         = azurerm_sql_server.server.name
  resource_group_name = azurerm_resource_group.pipeline.name
  login               = "sqladmin"
  tenant_id           = data.azurerm_client_config.current.tenant_id
  object_id           = data.azurerm_client_config.current.object_id
}

resource "azurerm_sql_active_directory_administrator" "secondary_AD" {
  server_name         = azurerm_sql_server.server_secondary.name
  resource_group_name = azurerm_resource_group.pipeline.name
  login               = "sqladmin"
  tenant_id           = data.azurerm_client_config.current.tenant_id
  object_id           = data.azurerm_client_config.current.object_id
}

# outputs
output "primary_server_id" {
  value = azurerm_sql_server.server.id
}
output "primary_server_name" {
  value = azurerm_sql_server.server.name
}
output "secondary_server_id" {
  value = azurerm_sql_server.server_secondary.id
}
output "secondary_server_name" {
  value = azurerm_sql_server.server_secondary.name
}
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

2.Azure portalのCLIで下記のコマンドを実施して、情報を取得します。
コマンド１：az account show --query "{subscriptionId:id, tenantId:tenantId}"
コマンド２：az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/${SUBSCRIPTION_ID}"

3.取得した情報を下記のコマンドで打ちます。
export ARM_SUBSCRIPTION_ID=サブスクリプションID
export ARM_CLIENT_ID=アップId
export ARM_CLIENT_SECRET=パスワード
export ARM_TENANT_ID=テナントID

4.vi test.tf でstep１で準備できたものを入れます。

5.コマンド：terraform init
※Terraform has been successfully initialized! と表示されたら成功。

6.コマンド：terraform apply -auto-approve

以上の流れで初めてterraformをやってみました。Azure portalで確認したら、確かにresoruce gourp, storage account ,SQL server は全部作成されて、また、Auditlogも設定されました。
なんという便利さ！関心しました。

しかし、お客様はFirewall/vnet ruleを設定したstorage accountの条件なので、まだお客様の問題を再現しております。その設定の分を
TFファイルに組み込まなければならないですね。また別の話でやります。

以上、簡単にterraformの使い方をさらしてみました。