#chiroito ’s blog

Java を中心とした趣味の技術について

Terraform で Oracle Cloud Infrastructure を構築する

Terraform を使って以下のような構成の Oracle Cloud Infrastructure を構築してみました。

f:id:chiroito:20181228142831p:plain
Terraform で作成する環境

設定を以下の 4 つに分けて紹介します。

  • パラメータ
  • OCI プロバイダの設定
  • インフラの設定
  • インスタンスの設定

パラメータは terraform.auto.tfvars、設定は 1 つのファイルにまとめて terraform.tf など適当なファイル名を付けて同じディレクトリへ保存して下さい。

そのディレクトリで以下のようにすると環境が作られます。

terraform init
terraform apply

参考

パラメータ

tenancy_ocid="ocid1.tenancy.oc1..xxxxxx(略)xxxx"
user_ocid="ocid1.user.oc1..xxxx(略)xxxxxxx"
parrent_compartment_ocid="ocid1.compartment.oc1..xxxx(略)xxxxxxx"
fingerprint="xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
private_key_path="C:\\Users\\chito\\.oci\\oci_api_key.pem"
region="us-phoenix-1"
environment_name="test"
environment_description="検証用の環境"
domain_name="各自のドメイン"
instance_shape="VM.Standard2.1"
ssh_public_key="ssh-rsa xxxxxx(略)xxxxxx== rsa-key-20181124"

OCI プロバイダの設定

# OCIプロバイダのための変数
variable "region" {}
variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}

# OCI プロバイダの設定
provider "oci" {
  region = "${var.region}"
  tenancy_ocid = "${var.tenancy_ocid}"
  user_ocid = "${var.user_ocid}"
  fingerprint = "${var.fingerprint}"
  private_key_path = "${var.private_key_path}"
}

インフラの設定

# ネットワークなどの基盤のための変数
variable "parrent_compartment_ocid" {}
variable "environment_name" {}
variable "environment_description" {}
variable "domain_name" {}

# 既存のコンパートメントの下に新しいコンパートメントを作成
resource "oci_identity_compartment" "target_compartment" {
  name = "${var.environment_name}"
  description = "${var.environment_description}"
  compartment_id = "${var.parrent_compartment_ocid}"
}

# 仮想クラウドネットワーク
resource "oci_core_vcn" "target_vcn" {
  cidr_block = "10.0.0.0/16"
  compartment_id = "${oci_identity_compartment.target_compartment.id}"
  dns_label = "${var.environment_name}"
}

# インターネットゲートウェイ
resource "oci_core_internet_gateway" "ig" {
  compartment_id = "${oci_identity_compartment.target_compartment.id}"
  vcn_id = "${oci_core_vcn.target_vcn.id}"
}

# デフォルトルートテーブルを修正
resource "oci_core_default_route_table" "default-route-table" {
  manage_default_resource_id = "${oci_core_vcn.target_vcn.default_route_table_id}"

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

# デフォルトDHCPオプションを修正
resource "oci_core_default_dhcp_options" "default-dhcp-options" {
  manage_default_resource_id = "${oci_core_vcn.target_vcn.default_dhcp_options_id}"

  options {
    type = "DomainNameServer"
    server_type = "VcnLocalPlusInternet"
  }
  options {
    type = "SearchDomain"
    search_domain_names = [
      "${var.domain_name}"]
  }
}

# デフォルトセキュリティリストを修正
resource "oci_core_default_security_list" "default-security-list" {
  manage_default_resource_id = "${oci_core_vcn.target_vcn.default_security_list_id}"

  egress_security_rules {
    destination = "0.0.0.0/0"
    protocol = "6"
    tcp_options {
      "min" = 80
      "max" = 80
    }
  }

  egress_security_rules {
    destination = "0.0.0.0/0"
    protocol = "6"
    tcp_options {
      "min" = 443
      "max" = 443
    }
  }

  ingress_security_rules {
    protocol = "6"
    source = "0.0.0.0/0"
    tcp_options {
      "min" = 22
      "max" = 22
    }
  }

  ingress_security_rules {
    protocol = 1
    source = "0.0.0.0/0"
    stateless = true
    icmp_options {
      "type" = 3
      "code" = 4
    }
  }
}

# AD1にサブネットを作る
resource "oci_core_subnet" "ad_subnet" {
  compartment_id = "${oci_identity_compartment.target_compartment.id}"
  vcn_id = "${oci_core_vcn.target_vcn.id}"
  availability_domain = "${lookup(data.oci_identity_availability_domains.ads.availability_domains[0], "name")}"
  dns_label = "ad1"
  cidr_block = "10.0.1.0/24"
}

# 利用可能な Availability Domain の一覧を取得する
data "oci_identity_availability_domains" "ads" {
  compartment_id = "${var.parrent_compartment_ocid}"
}

インスタンスの設定

# インスタンスのための変数
variable "instance_shape" {}
variable "ssh_public_key" {}

# リージョン毎のOracle Linux 7.6 のイメージの OCID
variable "instance_image_ocid" {
  type = "map"

  default = {
    // 各イメージのOCIDは https://docs.us-phoenix-1.oraclecloud.com/images/ を参照下さい
    // 今回は Oracle が提供している "Oracle-Linux-7.6-2018.11.19-0" イメージを使用します
    eu-frankfurt-1 = "ocid1.image.oc1.eu-frankfurt-1.aaaaaaaa2rvnnmdz6ewn4pozatb2l6sjtpqpbgiqrilfh3b4ee7salrwy3kq"
    us-ashburn-1 = "ocid1.image.oc1.iad.aaaaaaaa2mnepqp7wn3ej2axm2nkoxwwcdwf7uc246tcltg4li67z6mktdiq"
    uk-london-1 = "ocid1.image.oc1.uk-london-1.aaaaaaaaikjrglbnzkvlkiltzobfvtxmqctoho3tmdcwopnqnoolmwbsk3za"
    us-phoenix-1 = "ocid1.image.oc1.phx.aaaaaaaaaujbtv32uv4mizzbgnjkjlvbeaiqj5sgc6r5umfunebt7qpzdzmq"
  }
}

resource "oci_core_instance" "instance1" {
  count = "1"
  availability_domain = "${oci_core_subnet.ad_subnet.availability_domain}"
  compartment_id = "${oci_identity_compartment.target_compartment.id}"
  shape = "${var.instance_shape}"
  fault_domain = "FAULT-DOMAIN-1"
  create_vnic_details {
    subnet_id = "${oci_core_subnet.ad_subnet.id}"
    assign_public_ip = true
  }
  source_details {
    source_type = "image"
    source_id = "${var.instance_image_ocid[var.region]}"
  }
  metadata {
    ssh_authorized_keys = "${var.ssh_public_key}"
  }
}