Cloudii tech blog

Terraform Provider for Oracle Cloud Infrastructureでネットワークを構築する

はじめに

こんにちは、id:yokoyama-mです。評価用に導入したTerraform Provider for Oracle Cloud Infrastructureを使用し、OCI上にネットワークを構築してみたので紹介します。

以下記事にてCLIで手動作成したリソースをテンプレート化して構築の自動化を行います。 cloudii.atomitech.jp

事前準備

Terraformのインストール

以下を参考にTerraform(v0.10.x以降)をインストールしてください。

Terraform Provider for Oracle Cloud Infrastructureのインストール

以下記事を参照してください。 cloudii.atomitech.jp

テンプレートの作成

まずはテンプレートを作成します。CLIのコマンドラインオプションとリソース属性がほぼ一対一で対応しているため機械的に変換することができます。各リソースの詳細は以下ドキュメントを参照してください。 github.com

コンパートメントは一度作成すると消すことができないため、今回はテンプレートに含めず既存のものを再利用します。

# variables

variable "tenancy_ocid" {}
variable "user_ocid" {}
variable "fingerprint" {}
variable "private_key_path" {}
variable "compartment_ocid" {}
variable "region" {}
variable "compartment_id" {}

# provider

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}"
}

# vcn

resource "oci_core_vcn" "vcn_main" {
    cidr_block     = "192.168.0.0/16"
    compartment_id = "${var.compartment_id}"
    display_name   = "vcn-main"
}

# internet gateway

resource "oci_core_internet_gateway" "igw_main" {
    compartment_id = "${var.compartment_id}"
    enabled = true
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "igw-main"
}

# route table

resource "oci_core_route_table" "rt_main" {
    compartment_id = "${var.compartment_id}"
    route_rules {
        network_entity_id = "${oci_core_internet_gateway.igw_main.id}"
        cidr_block = "0.0.0.0/0"
    }
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "rt_main"
}

# security list

resource "oci_core_security_list" "sl_web" {
    compartment_id = "${var.compartment_id}"
    egress_security_rules {
        destination = "0.0.0.0/0"
        protocol = "6"
        stateless = false
    }
    ingress_security_rules {
        protocol = "6"
        source = "0.0.0.0/0"
        stateless = false
        tcp_options {
            max = "80"
            min = "80"
        }
    }
    ingress_security_rules {
        protocol = "6"
        source = "0.0.0.0/0"
        stateless = false
        tcp_options {
            max = "443"
            min = "443"
        }
    }
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "sl-web"
}

resource "oci_core_security_list" "sl_app" {
    compartment_id = "${var.compartment_id}"
    egress_security_rules {
        destination = "0.0.0.0/0"
        protocol = "6"
        stateless = false
    }
    ingress_security_rules {
        protocol = "6"
        source = "192.168.64.0/18"
        stateless = false
        tcp_options {
            max = "8080"
            min = "8080"
        }
    }
    ingress_security_rules {
        protocol = "6"
        source = "0.0.0.0/0"
        stateless = false
        tcp_options {
            max = "22"
            min = "22"
        }
    }
    ingress_security_rules {
        protocol = "6"
        source = "192.168.128.0/18"
        stateless = false
    }
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "sl-app"
}

resource "oci_core_security_list" "sl_db" {
    compartment_id = "${var.compartment_id}"
    egress_security_rules {
        destination = "0.0.0.0/0"
        protocol = "6"
        stateless = false
    }
    ingress_security_rules {
        protocol = "6"
        source = "192.168.128.0/18"
        stateless = false
        tcp_options {
            max = "3306"
            min = "3306"
        }
    }
    ingress_security_rules {
        protocol = "6"
        source = "192.168.128.0/18"
        stateless = false
        tcp_options {
            max = "6379"
            min = "6379"
        }
    }
    ingress_security_rules {
        protocol = "6"
        source = "192.168.192.0/18"
        stateless = false
    }
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "sl-db"
}

# subnet

resource "oci_core_subnet" "subnet_web_1" {
    availability_domain = "dArW:US-ASHBURN-AD-1"
    cidr_block = "192.168.64.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-web-1"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_web.id}"]
}

resource "oci_core_subnet" "subnet_web_2" {
    availability_domain = "dArW:US-ASHBURN-AD-2"
    cidr_block = "192.168.80.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-web-2"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_web.id}"]
}

resource "oci_core_subnet" "subnet_app_1" {
    availability_domain = "dArW:US-ASHBURN-AD-1"
    cidr_block = "192.168.128.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-app-1"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_app.id}"]
}

resource "oci_core_subnet" "subnet_app_2" {
    availability_domain = "dArW:US-ASHBURN-AD-2"
    cidr_block = "192.168.144.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-app-2"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_app.id}"]
}

resource "oci_core_subnet" "subnet_db_1" {
    availability_domain = "dArW:US-ASHBURN-AD-1"
    cidr_block = "192.168.192.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-db-1"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_db.id}"]
}

resource "oci_core_subnet" "subnet_db_2" {
    availability_domain = "dArW:US-ASHBURN-AD-2"
    cidr_block = "192.168.208.0/24"
    compartment_id = "${var.compartment_id}"
    vcn_id = "${oci_core_vcn.vcn_main.id}"
    display_name = "subnet-db-2"
    route_table_id = "${oci_core_route_table.rt_main.id}"
    security_list_ids = ["${oci_core_security_list.sl_db.id}"]
}

構築

作成したテンプレートと事前準備で用意した変数ファイルvariable.auto.tfvarsを同一のディレクトリに配置しTerraformを実行します。applyサブコマンド実行時に再利用するコンパートメントのOCIDを指定してください。

$ terraform init
$ terraform apply -var 'compartment_id=(※再利用するコンパートメントのOCID)'

OCIのWebコンソールにログインし、テンプレートで指定した通りのリソースが作成されているか確認してみましょう。

作成したリソースの後始末を行う場合は以下を実行してください。

$ terraform destroy

さいごに

OCI用のテンプレートを作成しネットワークを構築してみました。いかがだったでしょうか。 今回のようなシンプルな構成の場合はテンプレート化することのメリットをあまり感じませんが、構成が大規模化すればするほど効果を発揮するのではないかと思います。 Terraformの実行環境を用意するのが少し手間ですが、興味のある方はぜひ挑戦してみてください。

Cloudiiの各サービス・サポートのお問い合わせはこちらから