Facebook Twitter
お問い合わせ
TOPICS
更新情報
ホーム > ブログ > Oracle Cloud > Terraform Provider for Oracle Cloud Infrastructureでネットワークを構築する

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

Oracle Cloud
ソフトウェア
2018.08.27

はじめに

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

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

 

OCIでネットワークを構築する

事前準備

Terraformのインストール

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

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

以下記事を参照してください。

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の実行環境を用意するのが少し手間ですが、興味のある方はぜひ挑戦してみてください。


この記事が気に入ったら
「いいね!」

この記事を書いた人


関連コンテンツ

CONTACT お問い合わせ

Cloudiiのサービスやプロダクトについて
興味をお持ちの方は、
お気軽にお問い合わせください。