Terraform で Oracle Cloud Infrastructure に無料のコンピューティングリソースを立ち上げようとしたがキャパシティ不足で失敗した

oci

Oracle Cloud Infrastructure (OCI) には無料で使えるコンピューティングリソースがある。ただしアカウント作成時に設定するホームリージョンにしか立てられない。東京リージョンは枯渇気味ということだったので大阪リージョンで作成した。

API Key となる秘密鍵をダウンロードし Tenant やユーザーの OCID を控えておく。

Terraform で諸々のリソースを作成する。ネットワークまわりは AWS と呼び方こそ違うが概念は似ている。接続は Tailscale で行う想定なので Ingress は設定していない。

TerraformでVPCを管理するmoduleを作る - sambaiz-net

ECS Fargate を Tailscale につないでスマホから Termius で SSH 接続する - sambaiz-net

terraform {
  required_version = "~> 1.14"

  required_providers {
    oci = {
      source  = "oracle/oci"
      version = "~> 6.0"
    }
  }

  backend "local" {
    path = "terraform.tfstate"
  }
}

provider "oci" {
  tenancy_ocid     = var.tenancy_ocid     # Identifier of the tenancy (top-level account)
  user_ocid        = var.user_ocid        # Identifier of the user calling the API
  fingerprint      = var.fingerprint      # Fingerprint of the API signing key
  private_key_path = var.private_key_path # Path to the private key file for API signing
  region           = var.region           # Region to create resources in (e.g. ap-osaka-1)
}

# --- Networking ---

resource "oci_core_vcn" "garage" {
  compartment_id = var.tenancy_ocid
  display_name   = "garage-vcn"
  cidr_blocks    = ["10.0.1.0/24"]
  dns_label      = "garagevcn"
}

resource "oci_core_internet_gateway" "garage" {
  compartment_id = var.tenancy_ocid
  vcn_id         = oci_core_vcn.garage.id
  display_name   = "garage-igw"
  enabled        = true
}

resource "oci_core_route_table" "garage" {
  compartment_id = var.tenancy_ocid
  vcn_id         = oci_core_vcn.garage.id
  display_name   = "garage-rt"

  route_rules {
    network_entity_id = oci_core_internet_gateway.garage.id
    destination       = "0.0.0.0/0"
    destination_type  = "CIDR_BLOCK"
  }
}

resource "oci_core_security_list" "garage" {
  compartment_id = var.tenancy_ocid
  vcn_id         = oci_core_vcn.garage.id
  display_name   = "garage-sl"

  egress_security_rules {
    protocol    = "all"
    destination = "0.0.0.0/0"
    stateless   = false
  }

  # No ingress rules - garage is accessed via Tailscale only
}

resource "oci_core_subnet" "garage" {
  compartment_id             = var.tenancy_ocid
  vcn_id                     = oci_core_vcn.garage.id
  display_name               = "garage-subnet"
  cidr_block                 = "10.0.1.0/24"
  dns_label                  = "garagesub"
  route_table_id             = oci_core_route_table.garage.id
  security_list_ids          = [oci_core_security_list.garage.id]
  prohibit_public_ip_on_vnic = false
}

# --- Compute ---

data "oci_identity_availability_domains" "ads" {
  compartment_id = var.tenancy_ocid
}

# Ubuntu 24.04 aarch64 (Always Free compatible, portable across clouds)
data "oci_core_images" "ubuntu" {
  compartment_id           = var.tenancy_ocid
  operating_system         = "Canonical Ubuntu"
  operating_system_version = "24.04"
  shape                    = var.instance_shape
  sort_by                  = "TIMECREATED"
  sort_order               = "DESC"

  filter {
    name   = "display_name"
    values = ["^Canonical-Ubuntu-24\\.04-aarch64-[\\d\\.\\-]+$"]
    regex  = true
  }
}

resource "oci_core_instance" "garage" {
  compartment_id      = var.tenancy_ocid
  availability_domain = data.oci_identity_availability_domains.ads.availability_domains[0].name
  display_name        = "garage"
  shape               = var.instance_shape

  shape_config {
    ocpus         = var.instance_ocpus
    memory_in_gbs = var.instance_memory_gb
  }

  source_details {
    source_type             = "image"
    source_id               = data.oci_core_images.ubuntu.images[0].id
    boot_volume_size_in_gbs = var.boot_volume_gb
  }

  create_vnic_details {
    subnet_id        = oci_core_subnet.garage.id
    assign_public_ip = true
    display_name     = "garage-vnic"
  }

  metadata = {
    user_data           = base64encode(templatefile("${path.module}/cloud-init.yaml", {
      tailscale_auth_key = var.tailscale_auth_key
    }))
  }

  lifecycle {
    ignore_changes = [source_details[0].source_id]
  }
}

しかし、これを apply したところキャパシティ不足で失敗した。有料アカウントにアップグレードしようとしたがすぐには反映されなかったので他のリージョンでは試していない。

Error: 500-InternalError, Out of host capacity.