用途
本技能用于在 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 特性与破坏性变更的了解有限且过时,因此不应猜测供应商参数。具体价格、成本节省比例等数值均来自原文示例,实际费用与效果未在资料中验证。