将 Terraform 的 Azure SQL 资源从“azurerm_sql_database”升级到“azurerm_mssql_database”

Upgrade Terraform's Azure SQL Resource from `azurerm_sql_database` to `azurerm_mssql_database`

不久前,我使用 azurerm_sql_database block. Then in March, in azurerm version 2.3 they came out with the azurerm_mssql_database block, which as I understand 在 Terraform 中创建了一个无服务器 Azure SQL 资源,旨在替换 azurerm_sql_database

我需要更改 auto_pause_delay_in_minutes 设置,该设置仅在 azurerm_mssql_database 中可用。所以我想我现在需要升级,在有任何关于如何执行升级的官方指导(我能找到)之前。如果我执行这些步骤:

然后 Terraform 尝试删除我的数据库并创建一个新数据库,但我收到类似“ID 为 [id] 的资源已存在 - 要通过 Terraform 管理此资源需要导入状态的错误."

如何在不删除数据库的情况下执行升级和设置 auto_pause_delay_in_minutes

需要将Azure中的旧资源导入到terraform中的新资源定义中。然后需要删除 terraform 中的旧资源状态。请参阅以下演练。修改任何你需要的附加参数,它是相同的工作流程。

首先构建 azurerm_sql_database 资源:

# cat .\main.tf
provider "azurerm" {
  version = "~>2.19.0"
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "East US"
}

resource "azurerm_sql_server" "example" {
  name                         = "pearcecexamplesqlserver"
  resource_group_name          = azurerm_resource_group.example.name
  location                     = "East US"
  version                      = "12.0"
  administrator_login          = "4dm1n157r470r"
  administrator_login_password = "4-v3ry-53cr37-p455w0rd"

}

resource "azurerm_sql_database" "example" {
  name                = "pearcecexamplesqldatabase"
  resource_group_name = azurerm_resource_group.example.name
  location            = "East US"
  server_name         = azurerm_sql_server.example.name
}

Terraform Apply -- 假设一个干净的创建

将资源更改为 azurerm_mssql_database 并更新参数

cat .\main.tf
provider "azurerm" {
  version = "~>2.19.0"
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "East US"
}

resource "azurerm_sql_server" "example" {
  name                         = "pearcecexamplesqlserver"
  resource_group_name          = azurerm_resource_group.example.name
  location                     = "East US"
  version                      = "12.0"
  administrator_login          = "4dm1n157r470r"
  administrator_login_password = "4-v3ry-53cr37-p455w0rd"

}

resource "azurerm_mssql_database" "example" {
  name                = "pearcecexamplesqldatabase"
  server_id           = azurerm_sql_server.example.id
}

Terraform 应用 -- 哦哦

# terraform apply
azurerm_resource_group.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources]
azurerm_sql_database.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase]
azurerm_sql_server.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  # azurerm_mssql_database.example will be created
  + resource "azurerm_mssql_database" "example" {
      + auto_pause_delay_in_minutes = (known after apply)
      + collation                   = (known after apply)
      + create_mode                 = (known after apply)
      + creation_source_database_id = (known after apply)
      + id                          = (known after apply)
      + license_type                = (known after apply)
      + max_size_gb                 = (known after apply)
      + min_capacity                = (known after apply)
      + name                        = "pearcecexamplesqldatabase"
      + read_replica_count          = (known after apply)
      + read_scale                  = (known after apply)
      + restore_point_in_time       = (known after apply)
      + sample_name                 = (known after apply)
      + server_id                   = "/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver"
      + sku_name                    = (known after apply)
      + zone_redundant              = (known after apply)

      + threat_detection_policy {
          + disabled_alerts            = (known after apply)
          + email_account_admins       = (known after apply)
          + email_addresses            = (known after apply)
          + retention_days             = (known after apply)
          + state                      = (known after apply)
          + storage_account_access_key = (sensitive value)
          + storage_endpoint           = (known after apply)
          + use_server_default         = (known after apply)
        }
    }

  # azurerm_sql_database.example will be destroyed
  - resource "azurerm_sql_database" "example" {
      - collation                        = "SQL_Latin1_General_CP1_CI_AS" -> null
      - create_mode                      = "Default" -> null
      - creation_date                    = "2020-07-31T17:54:48.453Z" -> null
      - default_secondary_location       = "West US" -> null
      - edition                          = "GeneralPurpose" -> null
      - id                               = "/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase" -> null
      - location                         = "eastus" -> null
      - max_size_bytes                   = "34359738368" -> null
      - name                             = "pearcecexamplesqldatabase" -> null
      - read_scale                       = false -> null
      - requested_service_objective_id   = "f21733ad-9b9b-4d4e-a4fa-94a133c41718" -> null
      - requested_service_objective_name = "GP_Gen5_2" -> null
      - resource_group_name              = "example-resources" -> null
      - server_name                      = "pearcecexamplesqlserver" -> null
      - tags                             = {} -> null
      - zone_redundant                   = false -> null

      - threat_detection_policy {
          - disabled_alerts      = [] -> null
          - email_account_admins = "Disabled" -> null
          - email_addresses      = [] -> null
          - retention_days       = 0 -> null
          - state                = "Disabled" -> null
          - use_server_default   = "Disabled" -> null
        }
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:
Apply cancelled

Terraform Import -- 导入资源

# terraform import azurerm_mssql_database.example /subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase
azurerm_mssql_database.example: Importing from ID "/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase"...
azurerm_mssql_database.example: Import prepared!
  Prepared azurerm_mssql_database for import
azurerm_mssql_database.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.

Terraform State Remove -- 移除旧状态

terraform state rm azurerm_sql_database.example
Removed azurerm_sql_database.example
Successfully removed 1 resource instance(s)

Terraform 应用 - 清理

# terraform apply
azurerm_resource_group.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources]
azurerm_sql_server.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver]
azurerm_mssql_database.example: Refreshing state... [id=/subscriptions/redacted/resourceGroups/example-resources/providers/Microsoft.Sql/servers/pearcecexamplesqlserver/databases/pearcecexamplesqldatabase]

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.