You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Terraform无stop命令,如何停止Oracle Cloud实例而非销毁资源?

如何在Terraform中停止OCI实例而不销毁它

你说得对,Terraform本身确实没有专门的terraform stop命令——它的核心是声明式地管理资源的期望状态,而不是提供类似启动/停止这类命令式的操作。不过针对OCI实例,我们有几种靠谱的方法来实现"停止资源"的需求:

方法1:通过Terraform声明式修改实例状态(推荐)

OCI的Terraform Provider(oci_core_instance)支持直接通过配置来控制实例的运行状态。你只需要在你的instance资源块中添加或修改state参数,然后执行terraform apply即可:

resource "oci_core_instance" "my_instance" {
  # 其他已有的配置(比如compartment_id, shape, source_details等)...

  # 设置实例的期望状态:STOPPED 或 RUNNING
  state = "STOPPED"
}

执行terraform apply后,Terraform会对比当前状态和期望状态,自动调用OCI API停止你的实例。这种方式完全符合Terraform的设计理念,状态也会自动同步,是最推荐的做法。

方法2:使用local-exec执行OCI CLI命令(命令式方式)

如果你需要临时触发停止操作,不想修改主配置文件,可以在instance资源中添加local-exec provisioner,或者单独创建一个null_resource来执行OCI CLI的停止命令:

方式A:在实例资源中添加provisioner

resource "oci_core_instance" "my_instance" {
  # 你的实例配置...

  # 当需要停止时,可以添加这个provisioner(用完可以注释掉)
  provisioner "local-exec" {
    command = "oci compute instance action --action STOP --instance-id ${oci_core_instance.my_instance.id} --region <你的OCI区域>"
  }
}

方式B:用null_resource单独控制

resource "null_resource" "stop_my_instance" {
  triggers = {
    # 可以通过修改这个值来触发执行,比如把1改成2
    trigger = 1
  }

  provisioner "local-exec" {
    command = "oci compute instance action --action STOP --instance-id ${oci_core_instance.my_instance.id} --region <你的OCI区域>"
  }
}

执行terraform apply -target=null_resource.stop_my_instance就能单独触发停止操作。不过要注意,这种命令式操作不会自动更新Terraform的状态文件,执行后最好跑一下terraform refresh来同步实例的实际状态到Terraform状态中。

注意事项

  • 确保你的环境已经配置好OCI CLI的凭证(比如通过oci configure),或者Terraform使用的OCI provider有权限执行实例停止操作。
  • 方法1是最符合Terraform工作流的方式,建议优先使用;方法2适合临时的、一次性的操作。

内容的提问来源于stack exchange,提问作者Nuwantha

火山引擎 最新活动