はじめに
こんにちは、id:yokoyama-mです。評価用に導入したTerraform Provider for Oracle Cloud Infrastructure
を使用し、OCI上にネットワークを構築してみたので紹介します。
以下記事にてCLIで手動作成したリソースをテンプレート化して構築の自動化を行います。
事前準備
Terraformのインストール
以下を参考にTerraform(v0.10.x以降)をインストールしてください。
Terraform Provider for Oracle Cloud Infrastructureのインストール
以下記事を参照してください。
まずはテンプレートを作成します。CLIのコマンドラインオプションとリソース属性がほぼ一対一で対応しているため機械的に変換することができます。各リソースの詳細は以下ドキュメントを参照してください。 https://github.com/oracle/terraform-provider-oci/blob/master/docs/Table%20of%20Contents.mdgithub.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の実行環境を用意するのが少し手間ですが、興味のある方はぜひ挑戦してみてください。