Always Free の OCI Compute Instance を Terraform で構築してみた

VCN と Compute Instance を Terraform で構築

provider "oci" {
}

variable "compartment_ocid" {
  default = "< your ocid >"
}

resource "oci_core_vcn" "mnrst_vcn" {
  compartment_id = var.compartment_ocid
  cidr_block     = "172.16.0.0/16"
  display_name   = "mnrstVcn"
}

resource "oci_core_internet_gateway" "mnrst_igw" {
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.mnrst_vcn.id
  enabled        = true
  display_name   = "mnrstIgw"
}

resource "oci_core_default_route_table" "mnrst_route_table" {
  manage_default_resource_id = oci_core_vcn.mnrst_vcn.default_route_table_id
  display_name               = "mnrstRouteTable"

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

resource "oci_core_default_security_list" "mnrst_security_list" {
  manage_default_resource_id = oci_core_vcn.mnrst_vcn.default_security_list_id
  display_name               = "mnrstSecurityList"

  ingress_security_rules {
    protocol = 6 # TCP
    source   = "${data.http.checkip.response_body}/32"
    tcp_options {
      max = 22
      min = 22
    }
  }

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

resource "oci_core_subnet" "mnrst_subnet" {
  cidr_block     = "172.16.0.0/24"
  compartment_id = var.compartment_ocid
  vcn_id         = oci_core_vcn.mnrst_vcn.id
  display_name   = "mnrstSubnet"
}

resource "oci_core_instance" "mnrst_instance" {
  availability_domain = data.oci_identity_availability_domain.ad.name
  compartment_id      = var.compartment_ocid
  shape               = data.oci_core_images.instance_images.shape
  display_name        = "mnrstInstance"

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

  create_vnic_details {
    subnet_id        = oci_core_subnet.mnrst_subnet.id
    display_name     = "mnrstNic"
    assign_public_ip = true
  }

  metadata = {
    ssh_authorized_keys = file("~/.ssh/id_rsa.pub")
  }
}

data "http" "checkip" {
  url = "http://inet-ip.info/ip"
}

data "oci_identity_availability_domain" "ad" {
  compartment_id = var.compartment_ocid
  ad_number      = 1
}

data "oci_core_images" "instance_images" {
  compartment_id           = var.compartment_ocid
  operating_system         = "Canonical Ubuntu"
  operating_system_version = "22.04"
  shape                    = "VM.Standard.E2.1.Micro"
}

output "instance_public_ip" {
  value = oci_core_instance.mnrst_instance.public_ip
}

Terraform を実行して SSH 接続

terraform init

terraform plan

terraform apply -auto-approve

ssh ubuntu@$(terraform output instance_public_ip | jq -r .)

参考サイト

https://registry.terraform.io/providers/oracle/oci/latest/docs/resources/core_instance

https://github.com/oracle/terraform-provider-oci/blob/master/examples/compute/instance/instance.tf

タグ: ,