管理 Terraform 状态文件

对于任何部署,您可能需要检查或修改状态文件。例如,您可能需要从部署中导入或移除资源,这可以通过修改状态文件来实现。

本页介绍了如何使用为每个部署和修订创建的 Terraform 状态文件。如需详细了解状态文件,请参阅状态

本页中的说明假定您熟悉 Terraform

准备工作

  1. 确保您拥有使用状态文件所需的权限。config.admin 角色包含所需权限。所需的具体权限包括:

    • config.deployments.lock
    • config.revisions.getState
    • config.deployments.updateState
    • config.deployments.unlock
    • config.deployments.getLock
    • config.deployments.getState
  2. 确保您有 Terraform 配置的本地副本。这是与您使用的状态文件对应的配置。

    借助配置的本地副本,您可以在修改状态文件时在本地运行 terraform refreshterraform plan 等命令。

  3. 安装 Terraform,以便在本地机器上使用 Terraform CLI。

修改或检查状态文件

如需更改(修改)或检查状态文件,您需要锁定部署并下载状态文件。然后,您可以修改或检查状态文件。

修改状态文件后,您需要上传该文件,以便 Infra Manager 在部署中使用。

锁定部署

  1. 锁定部署,以防止在更改状态文件时对部署进行任何更改。部署必须处于锁定状态,才能下载状态文件。

     gcloud infra-manager deployments lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION
    

    您需要进行如下替换:

    • DEPLOYMENT_ID 替换为部署标识符。
    • PROJECT_ID 替换为运行部署的项目。
    • LOCATION 替换为部署运行的位置。

    此命令的输出包含用于上传和解锁状态文件的 lock ID

  2. 如需随时检索锁定 ID,请使用以下命令:

     gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION
    

下载状态文件

如需下载状态文件,您可以使用签名 Cloud Storage 网址

   SIGNED_STATE_DOWNLOAD_URL=$(gcloud infra-manager deployments export-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(signedUri)")

   curl -s -X GET --output terraform.tfstate ${SIGNED_STATE_DOWNLOAD_URL}

在本地更改状态文件

  1. 确认配置(*.tf 文件)与下载的状态文件 (terraform.tfstate) 位于同一目录中。

  2. 初始化 Terraform:

     terraform init
    
  3. 如果您之前已初始化 Terraform,则可能需要使用重新配置标志进行初始化:

     terraform init -reconfigure
    
  4. 根据需要处理状态文件。例如,您可以执行状态检查更改操作。如需详细了解如何使用状态文件,请参阅操控 Terraform 状态

  5. 如果您在本地对 Terraform 配置文件进行了任何更改,请上传修改后的配置。将此配置上传到您用作部署配置的源的 Storage 存储分区或公共 Git 代码库。

上传状态文件

使用经过签名的 Cloud Storage 网址上传状态文件:

  1. 获取锁定 ID:

     LOCK_ID=$(gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)")
    
  2. 获取上传网址:

     SIGNED_STATE_UPLOAD_URL=$(gcloud infra-manager deployments import-statefile DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID} --format="get(signedUri)")
    
     curl -s -X PUT --upload-file terraform.tfstate $SIGNED_STATE_UPLOAD_URL
    

解锁部署

  1. 获取锁定 ID:

     LOCK_ID=$(gcloud infra-manager deployments export-lock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --format="get(lockId)")
    
  2. 解锁部署:

     gcloud infra-manager deployments unlock DEPLOYMENT_ID --project PROJECT_ID --location LOCATION --lock-id ${LOCK_ID}
    

后续步骤