关于Terraform的”terraform state mv”命令的具体行为,请记下以下详细信息

首先

在Terraform的命令中,有一个叫做terraform state mv的选项。

 

只要想重命名资源或移动资源块时,就可以使用此命令。但是由于找不到关于命令执行后状态如何的具体解释,所以决定边运行边验证。

※验证环境正在从本地运行中,使用的是Azure平台。

事前准备

仓库在这里。

首先登录Azure,然后设置创建资源的订阅。

$ az login
$ az account set --subscription "サブスクリプション名"

在develop目录中执行以下命令,创建资源组和AppServicePlan。

$ terraform init
$ terraform plan
$ terraform apply

在Azure上创建了资源。

State文件的内容如下所示。

{
  "version": 4,
  "terraform_version": "1.3.2",
  "serial": 3,
  "lineage": "XXXX",
  "outputs": {},
  "resources": [
    {
      "module": "module.common_app_service_plan",
      "mode": "managed",
      "type": "azurerm_service_plan",
      "name": "common_module_app_service_plan",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "app_service_environment_id": "",
            "id": "XXXX",
            "kind": "linux",
            "location": "japaneast",
            "maximum_elastic_worker_count": 1,
            "name": "plan-common-dev-je-001",
            "os_type": "Linux",
            "per_site_scaling_enabled": false,
            "reserved": true,
            "resource_group_name": "rg-common-dev-je-001",
            "sku_name": "B1",
            "tags": null,
            "timeouts": null,
            "worker_count": 1
          },
          "sensitive_attributes": [],
          "private": "XXX",
          "dependencies": [
            "module.common_resource_group.azurerm_resource_group.common_module_resource_group"
          ]
        }
      ]
    },
    {
      "module": "module.common_resource_group",
      "mode": "managed",
      "type": "azurerm_resource_group",
      "name": "common_module_resource_group",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "id": "XXXX",
            "location": "japaneast",
            "name": "rg-common-dev-je-001",
            "tags": null,
            "timeouts": null
          },
          "sensitive_attributes": [],
          "private": "XXXX"
        }
      ]
    }
  ],
  "check_results": []
}

 

事前准备已经完成了。

接下来,我们将使用terraform state mv命令来验证状态(State)的行为。

场景1:希望修改Terraform上资源的名称。

如果想要更改common_module_app_service_plan的名称,可以使用以下命令。

resource "azurerm_service_plan" "common_module_app_service_plan" {
  name                = var.common_app_service_plan_config.name
~~~~~~省略~~~~~~

当然,在State文件中也包含了common_module_app_service_plan的名称。

~~~~~~省略~~~~~~
      "module": "module.common_app_service_plan",
      "mode": "managed",
      "type": "azurerm_service_plan",
      "name": "common_module_app_service_plan",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
~~~~~~省略~~~~~~

所以,如果普通地进行重命名,Terraform会将其视为不同的对象,并将现有的对象销毁,然后创建新的重命名资源。

为了避免这个问题,我们将执行terraform state mv命令。

更改资源名称

首先,我们将资源名称命名为hoge_module_app_service_plan。

resource "azurerm_service_plan" "hoge_module_app_service_plan" {
  name                = var.common_app_service_plan_config.name
  resource_group_name = var.common_app_service_plan_config.resource_group_name
  location            = var.common_config.location
~~~~~~省略~~~~~~

执行命令

可以使用terraform state mv命令来执行。
顺便说一下,你可以通过terraform state list命令来获取资源名称。

$ terraform state mv module.common_app_service_plan.azurerm_service_plan.common_module_app_service_plan module.common_app_service_plan.azurerm_service_plan.hoge_module_app_service_plan

在 State 中的 name 已经被更改,并且成功完成了。
由于这是一条破坏性指令,看来会自动创建备份。

~~~~~~省略~~~~~~
      "module": "module.common_app_service_plan",
      "mode": "managed",
      "type": "azurerm_service_plan",
      "name": "hoge_module_app_service_plan",
      "provider": "provider[\"registry.terraform.io/hashicorp/azurerm\"]",
      "instances": [
~~~~~~省略~~~~~~

最后 / 终于 / 最终

因为很困,所以我就写到这里,明天以后再在这里继续添加。

广告
将在 10 秒后关闭
bannerAds