原文はこちら。
https://blogs.oracle.com/cloud-infrastructure/automate-application-deployment-across-availability-domains-on-oracle-cloud-infrastructure-with-terraform
このエントリの目的は、Terraformを使ってOracle Cloud Infrastructureの複数のアベイラビリティ・ドメインにわたってアプリケーションのデプロイを自動化する方法とそのコツを説明することです。
Oracle Cloud Infrastructureのリージョンには、複数のアベイラビリティ・ドメインが含まれており、これらのアベイラビリティ・ドメインはそれぞれ分離しており、フォールトトレラントであり、同時に障害が発生したり、別のアベイラビリティ・ドメインの障害によって影響を受けることはありません。高可用性を確保し、リソースの障害から保護するには、複数のアベイラビリティ・ドメインにアプリケーションをデプロイすることをお勧めします。
Terraformを使ったデプロイメント自動化を説明するために、bastion(踏み台)、パブリックエージェント、マスター、およびワーカーノードで構成されるクラスタアプリケーションを使用します。 これらのノードは、高可用性を確保するために、複数のアベイラビリティ・ドメインにデプロイする必要があります。bastionノードとパブリックエージェントノードはpublicサブネットに、マスターノードとワーカーノードはprivateサブネットにそれぞれデプロイされます。
以下のコードは、3個のprivateサブネットを各アベイラビリティ・ドメインに作成する例です。
例えば、count.index%3を使用して、デプロイするアベイラビリティ・ドメインを判断し、前章で作成したサブネットのリストからsubnet_idを取得できます。以下のコードは、ユーザーが指定した数のワーカー・ノードを作成し、これらのノードを異なるアベイラビリティ・ドメインにデプロイする例です。
以下のコード例では、ブロックボリュームを作成し、各アベイラビリティ・ドメイン内の対応するマスターノードに割り当てています。
https://blogs.oracle.com/cloud-infrastructure/automate-application-deployment-across-availability-domains-on-oracle-cloud-infrastructure-with-terraform
このエントリの目的は、Terraformを使ってOracle Cloud Infrastructureの複数のアベイラビリティ・ドメインにわたってアプリケーションのデプロイを自動化する方法とそのコツを説明することです。
Oracle Cloud Infrastructureのリージョンには、複数のアベイラビリティ・ドメインが含まれており、これらのアベイラビリティ・ドメインはそれぞれ分離しており、フォールトトレラントであり、同時に障害が発生したり、別のアベイラビリティ・ドメインの障害によって影響を受けることはありません。高可用性を確保し、リソースの障害から保護するには、複数のアベイラビリティ・ドメインにアプリケーションをデプロイすることをお勧めします。
Terraformを使ったデプロイメント自動化を説明するために、bastion(踏み台)、パブリックエージェント、マスター、およびワーカーノードで構成されるクラスタアプリケーションを使用します。 これらのノードは、高可用性を確保するために、複数のアベイラビリティ・ドメインにデプロイする必要があります。bastionノードとパブリックエージェントノードはpublicサブネットに、マスターノードとワーカーノードはprivateサブネットにそれぞれデプロイされます。
Create Subnets in Each Availability Domain
このクラスタデプロイメントのために高可用性と冗長性を実現するには、各アベイラビリティ・ドメインに3つのサブネット(bastion、public、private)を作成し、対応するクラスタノードをこれらのサブネットに展開する必要があります。Terraformでは、count変数を使用して、各アベイラビリティ・ドメイン内でこれらのサブネットを作成できます(個別に作成する必要はありません)。ここでのコツは、count.indexを使用して、これらのサブネットを作成する際に各アベイラビリティ・ドメインを参照することです。以下のコードは、3個のprivateサブネットを各アベイラビリティ・ドメインに作成する例です。
data "oci_identity_availability_domains""ADs" {
compartment_id = "${var.tenancy_ocid}"
}
resource "oci_core_subnet""private" {
count = "3"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[count.index],"name")}"
cidr_block = "${var.sampleapp_cidr[count.index]}"
display_name = "private_ad${count.index}"
compartment_id = "${var.compartment_ocid}"
vcn_id = "${oci_core_virtual_network.sampleapp_vcn.id}"
route_table_id = "${oci_core_route_table.sampleapp.id}"
security_list_ids = ["${oci_core_security_list.PrivateSubnet.id}"]
dhcp_options_id = "${oci_core_virtual_network.sampleapp_vcn.default_dhcp_options_id}"
dns_label = "private${count.index}"
}
Deploy Cluster Nodes Across Availability Domains
同じやり方で、クラスタノードを対応するアベイラビリティ・ドメイン内にプロビジョニングし、デプロイできます。ここでのトリックは、count変数と剰余演算子%を使用する、という点です。これにより、簡単にこれらのノードを異なるアベイラビリティ・ドメインに配布できます。例えば、count.index%3を使用して、デプロイするアベイラビリティ・ドメインを判断し、前章で作成したサブネットのリストからsubnet_idを取得できます。以下のコードは、ユーザーが指定した数のワーカー・ノードを作成し、これらのノードを異なるアベイラビリティ・ドメインにデプロイする例です。
resource "oci_core_instance""WorkerNode" {
count = "${var.worker_node_count}"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[count.index%3],"name")}"
compartment_id = "${var.compartment_ocid}"
display_name = "Worker ${format("%01d", count.index+1)}"
hostname_label = "Worker-${format("%01d", count.index+1)}"
shape = "${var.WorkerInstanceShape}"
subnet_id = "${oci_core_subnet.private.*.id[count.index%3]}"
source_details {
source_type = "image"
source_id = "${var.image_ocid}"
boot_volume_size_in_gbs = "${var.boot_volume_size}"
}
metadata {
ssh_authorized_keys = "${var.ssh_public_key}"
}
timeouts {
create = "30m"
}
}
Attach Block Volumes to Cluster Nodes
ブロックボリュームを作成し、アベイラビリティ・ドメインに分散しているクラスタノードへアタッチする場合には、同様の方法を使い、count変数に基づいて剰余演算子(%)を実行できます。以下のコード例では、ブロックボリュームを作成し、各アベイラビリティ・ドメイン内の対応するマスターノードに割り当てています。
このエントリが皆様のお役に立って、Oracle Cloud Infrastructure上の複数のアベイラビリティ・ドメインにわたるアプリケーション・デプロイメントを簡単に自動化できるようになることを願っています。resource "oci_core_volume""MasterVolume" {
count="${var.MasterNodeCount}"
availability_domain = "${lookup(data.oci_identity_availability_domains.ADs.availability_domains[count.index%3],"name")}"
compartment_id = "${var.compartment_ocid}"
display_name = "Master ${format("%01d", count.index+1)} Volume"
size_in_gbs = "${var.blocksize_in_gbs}"
}
resource "oci_core_volume_attachment""MasterAttachment" {
count="${var.MasterNodeCount}"
attachment_type = "iscsi"
compartment_id = "${var.compartment_ocid}"
instance_id = "${oci_core_instance.MasterNode.*.id[count.index]}"
volume_id = "${oci_core_volume.MasterVolume.*.id[count.index]}"
}