Terraform実行環境の構成

Terraform実行環境には、フォルダのレイアウトおよび複数層ネットワーク・トポロジの構築に必要なTerraform構成ファイルが含まれます。

Terraform実行環境について

Terraform実行環境のレイアウトは、モジュール性と将来の増加を目的として設計されています。

Terraform構成が含まれるディレクトリとファイルによって、実行環境が構成されます。各サブディレクトリはTerraformモジュールを表しています。サブディレクトリが、リソースの再利用可能なライブラリを構成します。

次のディレクトリ構造は、このソリューションで構築する実行環境を表します。

Local_directory_structure.pngの説明が続きます
図local_directory_structure.pngの説明

構成全体は、任意の名前を持つルート・ディレクトリ内にあります。開始するときは、このディレクトリは空である必要があります。

構成の作成後、ルート・ディレクトリには次のディレクトリおよびファイルが含まれます。

  • compartmentsディレクトリには、区分の構成パラメータが含まれます。
  • iamディレクトリには、ポリシーおよびグループの構成パラメータが格納されます。
  • vcnディレクトリには、仮想クラウド・ネットワークおよびゲートウェイの構成パラメータが含まれます。
  • ルート・ディレクトリには次のファイルがあります。
    • datasources.tfによって、リージョン内の可用性ドメインの数が決定され、名前が取得されます。
    • provider.tfは、使用するTerraformプロバイダのパラメータを定義します。
    • root.tfは、Terraformが実行するモジュールを定義します。
    • terraform.tvarsは、Terraformに渡す変数の値を定義します。
    • variables.tf構成内のモジュールが使用する変数を宣言します。

ルート・モジュールの作成

ルート・モジュールでは、TerraformがOracle Cloud Infrastructureに接続するために必要なパラメータを定義します。また、構成内のモジュールが使用するデータおよび変数も定義します。

  1. Terraformをインストールしたコンピュータで、このソリューションの残りの部分でルート・ディレクトリと呼ばれるディレクトリを作成します。
  2. ルート・ディレクトリに次のサブディレクトリを作成します。
    • compartments
    • iam
    • vcn
  3. ルート・ディレクトリにvariables.tfという名前のテキスト・ファイルを作成し、次のコードをファイルに貼り付けます。
    このコードでは、Terraform構成で使用するモジュール変数を宣言します。次のステップでは、これらの変数の値を指定します。
    variable "tenancy_ocid" {}
    variable "user_ocid" {}
    variable "fingerprint" {}
    variable "private_key_path" {}
    variable "private_key_password" {}
    variable "app_tag" {}
    variable "environment" {}
    variable "home_region" {}
    variable "region" {}
    variable "vcn_cidr" {
      default = "10.0.0.0/16"
    }
    
  4. ルート・ディレクトリにterraform.tfvarsという名前のテキスト・ファイルを作成し、次のコードをファイルに貼り付けます。
    このコードでは、前の手順で宣言した変数の値を定義します。
    # Parameters to authenticate with Oracle Cloud Infrastructure
    tenancy_ocid="EXAMPLE: ocid1.tenancy.oc1..aaaaaaaaf76usem7gyfrakr35anvky4tyowvdvbik7kbrcizlyjsgfxpdg2a"
    user_ocid="EXAMPLE: ocid1.user.oc1..aaaaaaaa5tds42w2zzbsdflkjwerkjghswdjfbvbts7imlb5yru2p10a"
    fingerprint="EXAMPLE: 9b:6a:ab:ab:32:0b:7f:d5:5b:6w:c0:fe:54:72:f1:pl"
    private_key_path="YOUR_HOME_DIRECTORY/.oci/oci_api_key.pem"
    
    # Leave empty if your private key does not have a password
    private_key_password=""
    
    # See https://docs.oracle.com/pls/topic/lookup?ctx=cloud&id=oci_general_regions
    home_region="EXAMPLE: us-ashburn-1"
    region="EXAMPLE: us-phoenix-1"
    
    # A short identifier for the application, used as a prefix for naming the compartments and other resources
    app_tag="myapp"
    
    # The environment that you're creating resources for: test, dev, prod, or staging
    environment="dev"
    
    # Base CIDR for the VCN
    vcn_cidr="10.0.0.0/16"
  5. 次の表の説明に従って、terraform.tfvarsの変数の値を更新します。
    可変 説明
    tenancy_ocid テナントのOracle Cloud ID (OCID )。

    テナントのOCIDを検索するには、サービス・メニューから「管理」を選択し、「テナント詳細」をクリックします。

    user_ocid TerraformでOracle Cloud Infrastructureで認証に使用するユーザーのOracle Cloud ID (OCID )。

    ユーザーのOCIDを検索するには、サービス・メニューから「Identity」を選択し、「ユーザー」を選択します。リストでユーザー名を検索し、OCID値をコピーします。

    フィンガープリント アップロードしたAPI署名キーのフィンガープリント。
    private_key_path 秘密鍵を含むファイルへのパス。
    private_key_password 秘密鍵のパスフレーズ。キーにパスフレーズがない場合は、この変数を空のままにします。
    home_region テナントのホーム・リージョンです。区分、ポリシーおよびグループはホーム領域に作成されます。

    ホーム・リージョンを取得するには、「サービスからの管理」メニューを選択し、「テナント詳細」をクリックして、「ホーム・リージョン」フィールドの値をコピーします。

    リージョン ネットワーク、計算およびその他のリソースを作成する領域。このリージョンは、ホーム・リージョンまたは他の任意のOracle Cloud Infrastructureリージョンにできます。
    app_tag 各リソースのアプリケーションを示すためにリソース名で使用する接頭辞。すべての小文字を使用することをお薦めします。
    環境 各リソースが開発、テスト、ステージングまたは本番である環境を示すためにリソース名で使用される接頭辞。すべての小文字を使用することをお薦めします。
    vcn_cidr VCNのアドレス範囲(CIDR形式)。この範囲を慎重に計画してください。後で変更することはできません。
  6. ルート・ディレクトリにdatasources.tfという名前のテキスト・ファイルを作成し、次のコードをファイルに貼り付けます。
    datasources.tfのコードによって、リージョン内の可用性ドメインの数とその名前が決まります。このコードでは、region変数で指定した地域が使用されています。
    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")}"
    }
  7. ルート・ディレクトリにprovider.tfという名前のテキスト・ファイルを作成し、次のコードをファイルに貼り付けます。
    provider.tfのコードによって、Terraformで使用するプロバイダのパラメータが定義されます。プロバイダは、Terraformコマンドをクラウド・サービス・プロバイダに固有のAPIコールに変換します。
    provider "oci" {
      alias                = "home"
      region               = "${var.home_region}"
      tenancy_ocid         = "${var.tenancy_ocid}"
      user_ocid            = "${var.user_ocid}"
      fingerprint          = "${var.fingerprint}"
      private_key_path     = "${var.private_key_path}"
      private_key_password = "${var.private_key_password}"
    }
    
    provider "oci" {
      region               = "${var.region}"
      tenancy_ocid         = "${var.tenancy_ocid}"
      user_ocid            = "${var.user_ocid}"
      fingerprint          = "${var.fingerprint}"
      private_key_path     = "${var.private_key_path}"
      private_key_password = "${var.private_key_password}"
    }
    この例では、2つのプロバイダを定義します。どちらのプロバイダもOracle Cloud Infrastructure用です。最初のプロバイダはホーム・リージョン用で、Oracle Cloud Infrastructure Identity and Access Managementリソースを作成します。2つ目のプロバイダは、ネットワーク、計算およびその他のリソースを作成するリージョンに対するものです。
  8. ルート・ディレクトリにroot.tfという名前のテキスト・ファイルを作成し、次のコードをファイルに貼り付けます。
    このコードは、Terraformが実行する必要があるモジュールを指定します。区分、グループおよびポリシーをホーム領域に作成する必要があるため、プロバイダは、compartmentsおよびiamモジュールに対して明示的に指定されます。
    module "compartments" {
      source       = "./compartments"
      tenancy_ocid = "${var.tenancy_ocid}"
      app_tag      = "${var.app_tag}"
      environment  = "${var.environment}"
    
      providers = {
        oci = "oci.home"
      }
    }
    
    module "a_vcn" {
      source           = "./vcn"
      tenancy_ocid     = "${var.tenancy_ocid}"
      compartment_ocid = "${module.compartments.networks_id}"
      app_tag          = "${var.app_tag}"
      environment      = "${var.environment}"
      vcn_cidr         = "${var.vcn_cidr}"
    }
    
    module "iam" {
      source       = "./iam"
      tenancy_ocid = "${var.tenancy_ocid}"
      app_tag      = "${var.app_tag}"
      environment  = "${var.environment}"
    
      providers = {
        oci = "oci.home"
      }
    }
    app_tagおよびenvironment変数では、ネーミング・スキームが適用されます。ネーミング・スキームの使用は必須ではありませんが、ベスト・プラクティスです。