SuperAPI AI 工具集

infrastructure-as-code

部署与运维

查看项目

更新于 10-15 08:17

技能介绍

用途

本技能用于在 OCI(Oracle Cloud Infrastructure)上编写与管理 Terraform 基础设施即代码,以及排查相关运维问题。适用场景包括:为 OCI 编写 Terraform、处理 provider 报错、管理状态文件、实施 Resource Manager 栈。

技能声明自身定位为补充通用 Terraform 知识之外的 OCI 专有经验,包括 provider 特有的坑、状态管理反模式、资源生命周期陷阱和 OCI 专有的 IaC 运维知识。它同时明确提示:不要猜测 OCI provider 的资源参数,不要假定 AWS/Azure 的 Terraform 模式在 OCI 上可用,需要时参考本技能的参考示例与 landing-zones 技能。

主要能力

优先使用官方 OCI Landing Zone 模块

技能强调不要重复造轮子,推荐使用官方 OCI Landing Zone Terraform 模块,示例:

module "landing_zone" {
  source  = "oracle-terraform-modules/landing-zone/oci"
  version = "~> 2.0"

  compartments_configuration = { ... }
  network_configuration = { ... }
  security_configuration = { ... }
}

给出的理由包括:经过大量 OCI 客户验证、与 CIS OCI Foundations Benchmark 对齐、由 Oracle 随 API 变化维护、覆盖 IAM/网络/安全/日志、可在多环境复用。并列出官方资源为 OCI Landing Zone Terraform Modules 与 OCI Resource Manager Stacks。

仅在以下情况编写自定义 Terraform:Landing Zone 未覆盖的应用特定资源、扩展 Landing Zone 模块、参考架构中没有的特殊需求。

必须避免的做法

  • 不要在 Terraform 中硬编码 OCID,应使用变量或数据源:
resource "oci_core_instance" "web" {
  compartment_id = var.compartment_ocid
  subnet_id      = data.oci_core_subnet.existing.id
}
  • 不要在开发/测试环境使用 preserve_boot_volume = true,技能称其为成本陷阱(实例销毁后遗留引导卷);开发/测试应显式设置 preserve_boot_volume = false。
  • 不要忘记为关键资源添加 lifecycle 块:
resource "oci_database_autonomous_database" "prod" {
  lifecycle {
    prevent_destroy = true
    ignore_changes  = [defined_tags]
  }
}
  • 不要混用区域级与 AD 特定资源,应动态查询可用性域:
data "oci_identity_availability_domains" "ads" {
  compartment_id = var.tenancy_ocid
}
  • 团队场景不要把状态文件放在本地文件系统,应使用带锁的 OCI Object Storage 后端(示例配置使用 backend "s3",含 endpoint、skip_* 校验参数与 use_path_style)。
  • 不要对不应因重排而替换的资源使用 count,应使用带稳定键的 for_each:
resource "oci_core_instance" "web" {
  for_each = toset(var.instance_names)
  display_name = each.value
}

OCI Provider 坑

认证优先级为:provider 块显式凭据、TF_VAR_* 环境变量、~/.oci/config 的 DEFAULT profile、Instance Principal。常见错误是设置了环境变量但被 provider 块静默覆盖。在 OCI Compute 上使用 Instance Principal 时,provider 配置示例:

provider "oci" {
  auth   = "InstancePrincipal"
  region = var.region
}

并强调实例必须在 Terraform 运行前已加入动态组,否则会出现难以理解的授权错误。

对于“资源已存在”冲突,技能建议使用 terraform import 导入既有资源再管理。

状态管理反模式

  • 状态漂移:可用 terraform plan、terraform show 检测;处理方式包括 terraform refresh、terraform import 或在 lifecycle 中 ignore_changes。
  • 状态文件损坏:先备份,再执行 terraform state pull > recovered.tfstate 尝试修复,失败可从 Object Storage 版本控制恢复,最后手段是重建导入;预防措施是启用带版本控制的 Object Storage 后端。

资源生命周期陷阱

  • 销毁失败(依赖未清理):可用 terraform graph 可视化依赖,按逆序 destroy(示例使用 -target),依赖本身可通过引用隐式表达。
  • 长时间运行资源需设置超时,例如 Autonomous Database:
timeouts {
  create = "60m"
  update = "60m"
  delete = "30m"
}

计算实例在容量不足时也可设置更长的 create 超时。

OCI Landing Zones 适用判断

仓库为 github.com/oracle-quickstart/oci-landing-zones。适用:全新 OCI tenancy、需要 CIS OCI Foundations Benchmark 合规、需要安全加固基线、多环境(dev/test/prod)搭建。不适用:既有基础设施(brownfield,过于主观)、简单单应用部署(过重)。关键模式包括 hub-and-spoke 网络、集中日志/监控、安全区与堡垒机、IAM 基线。

成本优化

  • 使用 Flex 形状替代固定形状,示例 VM.Standard.E4.Flex 配合 shape_config 设置 ocpus 与 memory_in_gbs。
  • 通过 locals 统一定义标签并合并到资源 freeform_tags,以便按 CostCenter、Environment、Project 做成本报告。

参考资料加载时机

技能包含渐进式加载的参考文件 oci-terraform-patterns.md,在配置 provider(多区域、认证方式)、通过 CLI 操作 Resource Manager 栈、常见资源模式(VCN、compute、ADB)、Object Storage 后端状态管理、Landing Zone 模块用法示例时加载;在已覆盖的快速坑位、Landing Zone 使用判断、生命周期模式等场景下无需加载。

使用方式

作为技能调用:在编写 OCI Terraform、排查 provider 错误、处理状态文件、实施 Resource Manager 栈时启用,并按需加载参考文件。具体安装命令与调用方式在提供的资料中暂未提供。

适用场景

  • 编写 Terraform:provider 配置、资源依赖、生命周期
  • 状态管理:漂移、损坏、导入/导出
  • 排障:认证失败、“资源已存在”、销毁失败
  • OCI Landing Zones:何时使用、如何定制
  • 成本优化:Flex 形状、标签策略
  • 生产实践:prevent_destroy、ignore_changes、超时

限制

技能自述训练数据对 OCI Terraform provider 语法、OCI API 端点与资源 schema、terraform-provider-oci 具体参数与数据源、Resource Manager 栈操作、最新 provider 特性与破坏性变更的了解有限且过时,因此不应猜测供应商参数。具体价格、成本节省比例等数值均来自原文示例,实际费用与效果未在资料中验证。