Oracle Cloud Infrastructureドキュメント

Terraformプロバイダのベスト・プラクティス

以下は、Oracle Cloud Infrastructure Terraformプロバイダの構成を記述するための推奨ベスト・プラクティスです。

イメージの参照

コンピュート・インスタンスを起動するときは、Terraformジョブを実行するたびにTerraform構成で同じイメージを使用する必要があります。

これを確実にするには、oci_core_imageデータ・ソースを使用してイメージOCIDを検索するのではなく、イメージOCIDを直接指定します。 これは、oci_core_imageデータ・ソースがListImages APIを呼び出し、時間の経過とともにその戻り値が変更され、古いイメージが追加され、古いイメージが削除されるためです。 Oracle提供のイメージとそのOCIDのリストは、「Oracle提供のイメージ」を参照してください。 詳細については、「oci_core_imagesの結果は、Oracle提供のイメージの時間とともに変化」を参照してください。

特定のリージョンのイメージを指定するには、次のパターンをお勧めします:

variable "image_id" {
  type = "map"
  default = {
    // See https://docs.cloud.oracle.com/iaas/images/
    // Oracle-provided image "Oracle-Linux-7.4-2018.02.21-1"
    us-phoenix-1 = "ocid1.image.oc1.phx.aaaaaaaaupbfz5f5hdvejulmalhyb6goieolullgkpumorbvxlwkaowglslq"
    us-ashburn-1 = "ocid1.image.oc1.iad.aaaaaaaajlw3xfie2t5t52uegyhiq2npx7bqyu4uvi2zyu3w3mqayc2bxmaa"
    eu-frankfurt-1 = "ocid1.image.oc1.eu-frankfurt-1.aaaaaaaa7d3fsb6272srnftyi4dphdgfjf6gurxqhmv6ileds7ba3m2gltxq"
    uk-london-1 = "ocid1.image.oc1.uk-london-1.aaaaaaaaa6h6gj6v4n56mqrbgnosskq63blyv2752g36zerymy63cfkojiiq"
  }
}

コンピュート・インスタンスは、次の方法でこれを使用できます:

resource "oci_core_instance" "TFInstance" {
  image = "${var.image_id[var.region]}"
  ...
}

可用性ドメイン

可用性ドメインに関しては、ここに示すように共通のパターンに注意してください:

// Get all availability domains for the region
data "oci_identity_availability_domains" "ads" {
  compartment_id = "${var.tenancy_ocid}"
}
  
// Then either use it to get a single AD name based on the index:
resource "oci_core_instance" "nat" {
  availability_domain = "${lookup(data.oci_identity_availability_domains.ads.availability_domains[var.nat_instance_ad],"name")}"
  ...
}
  
// Or iterate through all the ADs:
resource "oci_core_subnet" "nat" {
  count = "${length(data.oci_identity_availability_domains.ads.availability_domains)}"
  availability_domain = "${lookup(data.oci_identity_availability_domains.ad.availability_domains[count.index], "name")}"
  ...
}

その場合は、構成内のリージョンの可用性ドメイン名を明示的にリストすることをお勧めします。 これを行うには、次のように定義した変数を使用します:

variable "ad_list" {
  type = "list"
}

次に、ここに示すように変数を使用できます:

// Index:
resource "oci_core_instance" "nat" {
  availability_domain = "${var.ad_list[var.nat_instance_ad_index]}"
  ...
}
  
// Or iterate through all the ADs:
resource "oci_core_subnet" "nat" {
  count = "${length(var.ad_list)}"
  availability_domain = "${var.ad_list[count.index]}"
  ...
}

次に、以下に示すように、テナントとリージョンの可用性ドメイン名を使用して、ad_list変数を直接設定できます:

variable "ad_list" {
  type = "list"
  default = ["kIdk:PHX-AD-1","kIdk:PHX-AD-2","kIdk:PHX-AD-3"]
}

このメソッドを使用する利点は、可用性ドメインの使用状況を制御し、予期しない変更が発生しないようにすることです。 しかし、可用性ドメイン名はテナンシとリージョン固有のものなので、テナンシとリージョン間で構成を共有する場合、このアプローチは問題になります。

代わりに便利な方法は、oci_identity_availability_domainsデータソースを使用してad_list値を設定することです。 構成でこれを行い、それをモジュールに渡す必要があります。 これにより、ADのリストが効率的に集中化され、必要になった場合に後で明示的なリストに簡単に切り替えることができます: モジュール自体はoci_identity_availability_domainsデータソースを使用すべきではありません。

data "oci_identity_availability_domains" "ad" {
  compartment_id = "${var.tenancy_ocid}"
}
 
data "template_file" "ad_names" {
  count = "${length(data.oci_identity_availability_domains.ad.availability_domains)}"
  template = "${lookup(data.oci_identity_availability_domains.ad.availability_domains[count.index], "name")}"
}
  
module "ssm_network" {
  ad_list = "${data.template_file.ad_names.*.rendered}"
  ...
}