如何使用 Terraform 自动化部署甲骨文云免费实例?

文章导读
使用 Terraform 管理甲骨文云(Oracle Cloud)免费实例适合需要重复创建或版本控制基础设施的场景。由于免费层资源有限且区域库存波动大,自动化前必须确认配额与网络环境。
📋 目录
  1. 前置准备:密钥与配额
  2. 完整 Terraform 配置
  3. 执行与验证
  4. 常见坑与排查
  5. 参考来源
A A

使用 Terraform 管理甲骨文云(Oracle Cloud)免费实例适合需要重复创建或版本控制基础设施的场景。由于免费层资源有限且区域库存波动大,自动化前必须确认配额与网络环境。

先说结论:Terraform 能有效固化配置,但甲骨文云免费层资源有限,自动化前需人工确认配额与网络。

  • 适合:需要多次重建、配置一致性要求高的场景
  • 先准备:获取 API 密钥、生成 SSH 密钥对、确认免费配额及区域库存
  • 验收:通过控制台和 SSH 双向验证实例状态与网络连通性

前置准备:密钥与配额

在运行 Terraform 前,需区分两类密钥并完成配额检查。

1. API 签名密钥(用于 Terraform 认证)

登录甲骨文云控制台,进入用户设置(User Settings)生成 API 密钥。下载私钥文件(如oci_api_key.pem),记录密钥指纹(Fingerprint)。将私钥权限设置为只读:

chmod 600 oci_api_key.pem

在本地~/.oci/config文件中配置 Tenancy OCID、User OCID、Fingerprint 及私钥路径。

2. SSH 密钥对(用于实例登录)

在本地终端生成 SSH 密钥对,公钥将写入实例,私钥用于登录:

如何使用 Terraform 自动化部署甲骨文云免费实例?
ssh-keygen -t rsa -b 4096 -f ~/.ssh/oci_free_key

同样需保护私钥权限:

chmod 600 ~/.ssh/oci_free_key

3. 确认免费配额

进入控制台“治理与管理”->“配额”,确认VM.Standard.A1.Flex规格在目标区域是否有可用额度。若显示配额为 0 或已用完,需更换区域或清理旧实例。

完整 Terraform 配置

创建项目目录,包含variables.tfmain.tfterraform.tfvars。以下配置包含 VCN 网络、子网及免费 ARM 实例。

1. 变量定义 (variables.tf)

variable "tenancy_ocid" { type = string }
variable "user_ocid" { type = string }
variable "fingerprint" { type = string }
variable "private_key_path" { type = string }
variable "region" { type = string }
variable "compartment_ocid" { type = string }
variable "ssh_public_key" { type = string }
variable "instance_shape" { type = string, default = "VM.Standard.A1.Flex" }

2. 资源配置 (main.tf)

包含 Provider 配置、网络环境(VCN/子网/网关)及实例定义。使用 data source 自动获取最新 Oracle Linux 镜像,避免硬编码 Image OCID。

provider "oci" {
  tenancy_ocid     = var.tenancy_ocid
  user_ocid        = var.user_ocid
  fingerprint      = var.fingerprint
  private_key_path = var.private_key_path
  region           = var.region
}

# 获取最新 Oracle Linux 镜像
data "oci_core_images" "ol_image" {
  compartment_id = var.compartment_ocid
  operating_system = "Oracle-Linux"
  sort_by = "TIMECREATED"
  sort_order = "DESC"
}

# 创建 VCN
resource "oci_core_virtual_network" "free_vcn" {
  compartment_id = var.compartment_ocid
  cidr_block     = "10.0.0.0/16"
  display_name   = "free-tier-vcn"
  dns_label      = "freetier"
}

# 创建互联网网关
resource "oci_core_internet_gateway" "igw" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_virtual_network.free_vcn.id
  display_name   = "free-tier-igw"
}

# 创建路由表
resource "oci_core_route_table" "rt" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_virtual_network.free_vcn.id
  display_name   = "free-tier-rt"
  route_rules {
    destination       = "0.0.0.0/0"
    destination_type  = "CIDR_BLOCK"
    network_entity_id = oci_core_internet_gateway.igw.id
  }
}

# 创建安全列表(放行 22 端口)
resource "oci_core_security_list" "sl" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_virtual_network.free_vcn.id
  display_name   = "free-tier-sL"
  ingress_security_rules {
    protocol    = "6"
    source      = "0.0.0.0/0"
    tcp_options { min = 22, max = 22 }
  }
  egress_security_rules {
    protocol    = "all"
    destination = "0.0.0.0/0"
  }
}

# 创建子网
resource "oci_core_subnet" "subnet" {
  compartment_id      = var.compartment_ocid
  vcn_id              = oci_core_virtual_network.free_vcn.id
  cidr_block          = "10.0.1.0/24"
  display_name        = "free-tier-subnet"
  dns_label           = "subnet"
  route_table_id      = oci_core_route_table.rt.id
  security_list_ids   = [oci_core_security_list.sl.id]
  subnet_access       = "PUBLIC"
}

# 创建实例
resource "oci_core_instance" "free_instance" {
  compartment_id = var.compartment_ocid
  shape          = var.instance_shape
  display_name   = "terraform-free-instance"

  shape_config {
    ocpus         = 4
    memory_in_gb  = 24
  }

  create_vnic_details {
    subnet_id        = oci_core_subnet.subnet.id
    assign_public_ip = true
  }

  source_details {
    source_type = "image"
    source_id   = data.oci_core_images.ol_image.images[0].id
  }

  metadata = {
    ssh_authorized_keys = var.ssh_public_key
  }
}

3. 变量赋值 (terraform.tfvars)

如何使用 Terraform 自动化部署甲骨文云免费实例?

复制示例文件并填入实际值,注意 SSH 公钥内容需完整(包含ssh-rsa前缀)。

tenancy_ocid     = "ocid1.tenancy.oc1..example"
user_ocid        = "ocid1.user.oc1..example"
fingerprint      = "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
private_key_path = "~/.oci/oci_api_key.pem"
region           = "ap-seoul-1"
compartment_ocid = "ocid1.compartment.oc1..example"
ssh_public_key   = file("~/.ssh/oci_free_key.pub")

执行与验证

1. 初始化与应用

在终端执行以下命令。若遇到Out of capacity错误,请更换区域或稍后重试。

terraform init
terraform plan
terraform apply

2. 验证实例状态

登录甲骨文云控制台,在“计算”->“实例”中查看状态是否为“运行中”。确认公网 IP 已分配。

3. 验证 SSH 连接

使用本地私钥连接实例,默认用户为opc

如何使用 Terraform 自动化部署甲骨文云免费实例?
ssh -i ~/.ssh/oci_free_key opc@<实例公网 IP>

若连接成功,说明自动化部署完成。

常见坑与排查

1. 区域缺货(Out of Capacity)

免费 ARM 实例在热门区域(如首尔、东京)常缺货。Terraform 会报错ServiceError: 5xx或提示资源不可用。

  • 解决:更换至冷门区域(如圣保罗、约翰内斯堡)或在main.tf中尝试调整shape_config(如先尝试 1 OCPU 看是否有资源)。

2. 密钥权限错误

若 SSH 连接被拒绝(Permission denied),检查本地私钥权限是否为 600。若 Terraform 报错认证失败,检查 API 私钥路径及~/.oci/config配置是否正确。

3. 网络不通

若实例运行中但无法 SSH,检查安全列表(Security List)是否放行 22 端口,以及路由表是否关联了互联网网关。

参考来源

  • Terraform Registry - Oracle OCI Provider: https://registry.terraform.io/providers/oracle/oci/latest/docs
  • Oracle Cloud Documentation - API Signing Key: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm
  • Oracle Cloud Free Tier: https://www.oracle.com/cloud/free/