原文はこちら。
https://blogs.oracle.com/developers/announcing-oracle-cloud-infrastructure-modules-for-the-terraform-modules-registry
新たに発表されたHashiCorp Terraform Module Registryを使用して、OracleはOracle Cloud Infrastructure Classic(OPC)Provider用の検証済みモジュールの初期セットを提供しています。このモジュールは現在HashiCorpによる認定および互換性テストを受けています。
HashiCorp Terraform Module Registry
https://www.hashicorp.com/blog/hashicorp-terraform-module-registry/
Terraform Moduleは、Terraform構成の再利用可能なパーツを内蔵パッケージとしてカプセル化しています。Terraform Moduleを使用すると、インフラストラクチャ構成全体の再利用性と保守性の両方を向上することができ、テスト済みの構成パターンを一貫して使用できます。
Module Configuration
https://www.terraform.io/docs/configuration/modules.html
Terraform Module Registryを使用すると、Oracle Cloud Infrastructureの検証済みモジュールとコミュニティ・モジュールの両方を簡単に検出して使用することができます。以下で、Oracle Cloud Infrastructure Classic(OPC)モジュールの初版を2個組み合わせた構成で使用する方法を詳しく見ていきます。
Oracle Cloud Infrastructure Classic Modules
Terraform Providerは、Compute、Networking、Storageサービスなどを構成およびプロビジョニングするために使用される個々のリソースをきめ細かく制御することができます。
Resource Configuration
https://www.terraform.io/docs/configuration/resources.html
インフラストラクチャ構成を完全に制御するにあたり、個々のリソースを宣言することは非常に強力な方法ではありますが、例えばComputeインスタンスの起動やネットワークの作成、セキュリティ・ルールの宣言といった、具体的な構成要件を満たすために、何度もリソースのグループを共通パターンで使う必要があります。
Compute Instance Module
opc_compute_instanceリソースは、デフォルトで、ローカルブートストレージを持つ一時インスタンスを作成しますが、永続インスタンスを作成するには、追加の
opc_compute_storage_volumeリソースをブートボリューム用に宣言し、作成時にインスタンスにアタッチする必要があります。
compute-instanceモジュールを使うと、ストレージリソースならびにインスタンスリソースの両方の作成が1個の再利用可能なコンポーネントに結合され、複数のリソースの定義と関連付けの詳細が、単一の簡潔なインスタンス定義にカプセル化されます。
Terraform Module for creating Oracle Cloud Infrastructure OPC Compute instances
https://registry.terraform.io/modules/oracle/compute-instance/opc
では、最も簡単な
compute-instanceモジュール定義から始めましょう。
module "persistent-instance1" {
source = "oracle/compute-instance/opc"
instance_name = "instance1"
instance_shape = "oc3"
}
この最小限の設定で、通常明示的に定義が必要な多くの属性に対して、共通のデフォルト値や派生値を使用して、永続ブータブルストレージボリュームを持つインスタンスを作成します。
では、この最小設定と同等の、全て宣言した基本リソースセットと比べてみましょう。
resource "opc_compute_instance" "persistent-instance1" {
name = "instance1"
hostname = "instance1"
label = "instance1"
shape = "oc3"
networking_info {
index = 0
shared_network = true
}
storage {
index = 1
volume = "${opc_compute_storage_volume.boot-volume.name}"
}
boot_order = [1]
}
resource "opc_compute_storage_volume" "boot-volume" {
name = "instance1-boot"
description = "$instance1 boot storage volume "
image_list = "/oracle/public/OL_7.2_UEKR4_x86_64"
image_list_entry = 1
size = 12
bootable = true
}
IP Networks Modules
2個目のモジュールは
ip-networksモジュールです。 このヘルパーモジュールは、共有IPネットワーク交換(IP Network Exchange)を使って、相互に接続された複数のIPネットワークの作成を簡素化します。これは、異なるアプリケーションデプロイメント層に使用される複数のサブネットを宣言する場合に便利です。
Terraform Module for creating Oracle Cloud Infrastructure OPC IP Neworks
https://registry.terraform.io/modules/oracle/ip-networks/opc
この
ip-networksモジュールはIPネットワーク交換の名前、サブネットと対応するサブネットワーク名のリストを使ってインスタンス化します。
module "ip-networks" {
source = "oracle/ip-networks/opc"
ip_exchange_name = "example"
subnet_cidrs = [ "192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24" ]
subnet_names = [ "network1", "network2", "network3" ]
}
ここでも、同じ構成の同等の基本リソース定義を見てみましょう。
resource "opc_compute_ip_network_exchange" "exchange" {
name = "example"
}
resource "opc_compute_ip_network" "network" {
name = "network1"
ip_address_prefix = "192.168.1.0/24"
ip_network_exchange = "${opc_compute_ip_network_exchange.exchange.name}"
}
resource "opc_compute_ip_network" "network" {
name = "network2"
ip_address_prefix = "192.168.2.0/24"
ip_network_exchange = "${opc_compute_ip_network_exchange.exchange.name}"
}
resource "opc_compute_ip_network" "network" {
name = "network3"
ip_address_prefix = "192.168.3.0/24"
ip_network_exchange = "${opc_compute_ip_network_exchange.exchange.name}"
}
Using Modules as part of a complete configuration
今度は、上記の2つのモジュールを組み合わせを見てみましょう。 相互接続されたIPネットワークのサブネットワークを2個作成し、各サブネットに1つのCompute インスタンスを作成します。構成を完了するために追加のリソースが2つ作成され、実行中のインスタンスにアクセスできるようにSSHキーが作成されます。 パブリックIPアドレス予約はインスタンスの1つに関連付けられます。
module "ip-networks" {
source = "oracle/ip-networks/opc"
ip_exchange_name = "example"
subnet_cidrs = [ "192.168.1.0/24", "192.168.2.0/24" ]
subnet_names = [ "network1", "network2" ]
}
module "persistent-instance1" {
source = "oracle/compute-instance/opc"
instance_name = "instance1"
instance_shape = "oc3"
ip_network = "${module.ip-networks.ip_networks[0]}"
ssh_key = "${opc_compute_ssh_key.ssh-key.name}"
}
module "persistent-instance2" {
source = "oracle/compute-instance/opc"
instance_name = "instance1"
instance_shape = "oc3"
ip_network = "${module.ip-networks.ip_networks[1]}"
ip_reservation = "${opc_compute_ip_address_reservation.ip-reservation.name}"
ssh_key = "${opc_compute_ssh_key.ssh-key.name}"
}
resource "opc_compute_ssh_key" "ssh-key" {
name = "example-sshkey1"
key = "${file("~/.ssh/id_rsa.pub")}"
enabled = true
}
resource "opc_compute_ip_address_reservation" "ip-reservation" {
name = "example-ip-reservation"
ip_address_pool = "public-ippool"
}
この例では、IPネットワーク上にインスタンスを作成しているため、
opc_compute_ip_address_reservationでパブリックIP予約を使っていますが、IPネットワークを使わない場合、共有ネットワークインターフェースでIP予約を作成するために、
opc_compute_ip_reservationを使う必要があります。
Summary
どのようなプログラミング言語でも、再利用可能なコード要素にカプセル化し分解することで、開発と保守が大幅に省力化できますが、この原則は、宣言的および機能的な構造を使用してクラウドインフラストラクチャを定義できる、infrastructure-as-codeの領域でも等しく適用されます。Terraform ModuleとTerraform Modules Repositoryを使うと、ベンダーが提供するモジュールとコミュニティが提供するモジュールの両方を信頼性の高い方法で採用して、素早く初期設定を作成できます。
Related Content