关于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": [
~~~~~~省略~~~~~~
最后 / 终于 / 最终
因为很困,所以我就写到这里,明天以后再在这里继续添加。