状態ファイル用のオブジェクト・ストレージの使用

Terraform状態ファイルをOCIオブジェクト・ストレージに格納します。

ノート

このページで説明するバックエンド・タイプのうち、OCIネイティブ・バックエンドの使用を使用することをお薦めします。

S3互換バックエンドの使用方法(非推奨)

ノート

S3互換のバックエンド・メソッドは非推奨です。この方法は、Terraformバージョンv1.12.0以上にアップグレードできない場合にのみ使用します。

S3互換バックエンドを構成するには、次の項のステップを実行します。

タスク1: OCIへのアクセスの設定

S3の互換性の詳細は、Amazon S3 Compatibility APIの前提条件を参照してください。オブジェクト・ライフサイクル管理の権限の詳細は、必要なIAMポリシーを参照してください。
  1. Oracle Cloud Infrastructureにサインアップして、一意のネームスペースを取得します。
  2. Amazon S3 Compatibility APIとObject Storageのユーザーは、このサービスを操作する権限が必要です。権限があるかわからない場合は、管理者に連絡してください。ポリシーの基本情報は、ポリシーの仕組みを参照してください。オブジェクト・ストレージの使用を可能にするポリシーについては、共通ポリシーおよびポリシー・リファレンスを参照してください。
  3. 既存の顧客秘密キーを使用するか、顧客秘密キーを作成します。顧客秘密キーはアクセス・キー/秘密キー・ペアで構成されます。詳細は、顧客秘密キーの作業を参照してください。キー・ペアを使用または作成するには:
    • 既存の顧客秘密キーを使用するには、秘密キーをすでに把握している必要があります。セキュリティ上の理由から、秘密キーを生成後に取得できません。アクセス・キーを表示またはコピーするには: ナビゲーション・メニューで、「プロファイル」メニュー「プロファイル」メニュー・アイコンを選択し、表示されるオプションに応じて「ユーザー設定」または「自分のプロファイル」を選択します。ページの左側の「顧客秘密キー」を選択します。特定の顧客秘密キーの名前に関連付けられているアクセス・キーにカーソルを置き、「コピー」を選択します。
    • コンソールを使用して顧客秘密キーを作成するには、顧客秘密キーを作成するにはを参照してください。
    • コマンドライン・インタフェース(CLI)を使用して顧客秘密キーを作成するには、oci iam customer-secret-key createを参照してください。

タスク2: 認証の構成

  1. 資格証明ファイルの場所を設定します。
    注意

    access_key属性とsecret_key属性は、決して同じTerraformバックエンド構成に設定しないでください。これらの属性を同じ構成に格納すると、セキュリティ・リスクが発生します。

    デフォルトの場所は~/.aws/credentialsです。S3バックエンドのshared_credentials_fileオプションを使用すると別の場所を設定できます。

  2. 資格証明ファイルの[default]エントリに、適切なオブジェクト・ストレージ資格証明を構成します。

    このファイルには資格証明プロファイルをいくつでも含めることができます。別のプロファイル名を指定する場合は、Terraform構成ファイル内のバックエンドのprofileオプションも更新する必要があります。

    オブジェクト・ストレージ資格証明の例を次に示します:

    [default]
    aws_access_key_id=ae37c0b4ffc488c7d4e6b360a21312244330718f
    aws_secret_access_key=mSTdaWhlbWj3ty4JZXlm0NUZV52xlImWjayJLJ6OH9A=
    ノート

    例に示されているキー値は無効です。有効なaws_access_key_idおよびaws_secret_access_keyは、前のステップを使用して生成されたユーザー固有の値です。

タスク3: TerraformでのS3バックエンドの構成

  1. 次のフォーマットでオブジェクト・ストレージのendpoint値を設定します:
    https://<namespace>.compat.objectstorage.<region>.oraclecloud.com
  2. Terraform構成内のterraformブロックを更新して、バックエンド・タイプを定義します。
    ノート

    変数およびローカルはterraformブロックでは受け入れられないため、バックエンド構成値をハードコードする必要があります。

    次に、Terraformバージョン別に編成されたブロックを示します。Terraform構成のバージョンが変化するブロックを選択します。

    Terraformバージョン1.6.4以降

    # (Terraform version >= 1.6.4)
    terraform {
      backend "s3" {
        bucket                    = "terraform-states"
        region                    = "us-phoenix-1"
        key                       = "tf.tfstate"
        skip_region_validation      = true
        skip_credentials_validation = true
        skip_requesting_account_id  = true
        use_path_style              = true
        skip_s3_checksum            = true
        skip_metadata_api_check = true
        endpoints = {
          s3 = "https://<namespace>.compat.objectstorage.<region>.oraclecloud.com"
        }
      }
    }

    1.64より前のTerraformバージョン

    # (Terraform version < 1.6.4)
    terraform {
      backend "s3" {
        bucket   = "terraform-states"
        key      = "networking/terraform.tfstate"
        region   = "us-phoenix-1"
        endpoint = "https://<namespace>.compat.objectstorage.<region>.oraclecloud.com"
       skip_region_validation      = true
        skip_credentials_validation = true
        skip_metadata_api_check     = true
        force_path_style            = true
      }
    }
    注意

    同じバケットが多くのTerraform構成で使用されている場合、状態ファイルが上書きされないように、キーは一意である必要があります。この例では、単一のバケット(terraform-states)を使用してすべてのTerraform状態ファイルを格納しますが、リソース(networking)に基づいてオブジェクト名に一意の接頭辞を使用します。
  3. terraform initを実行します。

    既存のterraform.tfstateファイルがすでにある場合、現在の状態ファイルがリモート状態にアップロードするファイルであることを確認するように、Terraformによって求められます。

  4. terraform applyを実行します。
生成された状態ファイルがオブジェクト・ストレージにアップロードされます。
Terraformプロジェクト間で状態を共有するには、terraform_remote_stateのバックエンド構成を使用します。詳細は、「リモート状態へのアクセス」を参照してください。

HTTPバックエンドの使用

ノート

HTTPバックエンドには各状態ファイルに対して事前認証済リクエスト(PAR)が必要であるため、オブジェクト・ストレージに状態ファイルを格納するための推奨方法はOCIネイティブ・バックエンドの使用です。

HTTPバックエンド・タイプでは、RESTクライアントを使用して状態を格納し、HTTP GETPOSTおよびDELETEメソッドを使用して状態のフェッチ、更新およびパージを行います。

HTTPバックエンドを構成するには、次の各項のステップを実行します。

タスク1: 既存の状態のアップロード

状態ファイルは、事前認証済リクエスト(PAR)を作成する前にバケットに存在している必要があります。このファイルは、既存の状態ファイルでも、初期状態用の空のファイルでもかまいません。
Curlを使用して既存の状態ファイルをアップロードするには、オブジェクト・ストアURLにHTTP PUTリクエストを作成します。
curl -X PUT -H "Content-Type: text/plain" --data-binary "@path/to/local/tfstate" http://<prefix>/<my-access-uri>
コンソール、CLIまたはAPIを使用してバケットにファイルをアップロードする手順は、バケットへのオブジェクト・ストレージ・オブジェクトのアップロードを参照してください。

タスク2: 読取り/書込み事前認証済リクエストの作成

読取り/書込み権限を指定するオブジェクト・ストレージ内の事前認証済リクエスト(PAR)を使用すると、資格証明を指定せずにTerraform状態ファイルにアクセスできます。

コンソール、CLIまたはAPIを使用してPARを作成する手順は、オブジェクト・ストレージでの事前認証済リクエストの作成を参照してください。

タスク3: TerraformでのHTTPバックエンドの構成

  1. リージョンおよびアクセスURIがユーザーに固有である次の形式でアドレス値を設定します。
    https://objectstorage.<region>.oraclecloud.com/<my-access-uri>

    次に例を示します:

    https://objectstorage.us-phoenix-1.oraclecloud.com/p/example-guid/n/example/b/terraform-state/o/terraform.tfstate
  2. Terraform構成内のterraformブロックを更新して、バックエンド・タイプを定義します。
    ノート

    変数およびローカルはterraformブロックでは受け入れられないため、バックエンド構成値をハードコードする必要があります。

    次に、リージョンus-phoenix-1を使用したTerraform構成の例を示します。

    terraform {
      backend "http" {
        update_method = "PUT"
        address       = "https://objectstorage.us-phoenix-1.oraclecloud.com/p/example-guid/n/example/b/terraform-state/o/terraform.tfstate"
      }
    }

    その他の構成例、コードを参照する状態ファイル、構成変数のサマリーは、HTTPを参照してください。

  3. terraform initを実行します。
  4. terraform applyを実行します。
生成された状態ファイルがオブジェクト・ストレージにアップロードされます。
Terraformプロジェクト間で状態を共有するには、terraform_remote_stateのバックエンド構成を使用します。詳細は、「リモート状態へのアクセス」を参照してください。

リモート状態へのアクセス

terraform_remote_stateを使用して、あるTerraform構成内のオブジェクトのプロパティに別の構成からアクセスします。

たとえば、ある構成を使用してコンパートメントを定義し、別の構成を使用してVCNを定義できます。リソースが同じTerraform構成フォルダにある場合は、module.iam_compartment_SANDBOX.compartment_idなどを使用して、VCN構成からコンパートメントのOCIDを参照できます。

ただし、定義で状態ファイルが共有されておらず、次のようなファイル構造であるとします:

.
├── governance
│   ├── compartments.tf
│   ├── outputs.tf
│   ├── remote-backend.tf
│   └── variables.tf
├── networking
│   ├── outputs.tf
│   ├── remote-backend.tf
│   ├── remote-state-data_governance.tf
│   ├── variables.tf
│   └── vcns.tf
└── terraform-states_bucket_credentials

この例では:

  • Both governance and networking configurations store their respective state files on an OCI Object Storage bucket using the remote-backend.tf and terraform-states_bucket_credentials files.
  • compartments.tfファイルは、Terraformレジストリのiam-compartmentモジュールを使用して、次のようにルート・レベルでコンパートメントを作成します:
    module "iam_compartment_SANDBOX" {
      source = "oracle-terraform-modules/iam/oci//modules/iam-compartment"
      version = "2.0.0"
      tenancy_ocid = var.tenancy_ocid
      compartment_id = var.tenancy_ocid # define the parent compartment. Creation at tenancy root if omitted
      compartment_name = "SANDBOX"
      compartment_description = "Test and evaluate OCI features here"
      compartment_create = true # if false, a data source with a matching name is created instead
      enable_delete = true # if false, on `terraform destroy`, compartment is deleted from the terraform state but not from oci
    }

出力の定義

terraform_remote_stateデータ・ソースは、リモート・バックエンドを含む最新の状態ファイルを使用して、別のTerraform構成の出力値にアクセスできます。networking構成でgovernance構成にアクセスし、Terraformリソースのプロパティを動的に取得するには、governance Terraform構成の出力を定義する必要があります。出力が定義されていないと、その構成の外から値を使用することはできません。

governance/outputs.tfファイルは、次のようになります:

output "iam_compartment_SANDBOX" {
  description = "compartment ocid, parent ocid, name, description"
  value = {
    id = module.iam_compartment_SANDBOX.compartment_id
    parent_id = module.iam_compartment_SANDBOX.parent_compartment_id
    name = module.iam_compartment_SANDBOX.compartment_name
    description = module.iam_compartment_SANDBOX.compartment_description
  }
}

リモート状態の参照

この例では、Terraformレジストリのvcnモジュールを使用して、新しいVCNを定義しています。networking構成は、governance構成を参照して、VCNのコンパートメントのOCIDを定義します:

module "vcn_hub1iad" {
  source = "oracle-terraform-modules/vcn/oci"
  version = "2.2.0"

  # general oci parameters
  compartment_id = data.terraform_remote_state.governance.outputs.iam_compartment_SANDBOX["id"]
  tags = var.tags

  # vcn parameters
  create_drg = false
  internet_gateway_enabled = true
  lockdown_default_seclist = true
  nat_gateway_enabled = false
  service_gateway_enabled = false
  vcn_cidr = "10.0.0.0/16"
  vcn_dns_label = "hub1iad"
  vcn_name = "hub1"
}

ただし、compartment_id = data.terraform_remote_state.governance.outputs.iam_compartment_SANDBOX["id"]の行が正しく解釈されるには、data.terraform_remote_stateオブジェクトを定義する必要があります。

リモート状態のデータ・ソースの定義

次のterraform_remote_stateデータ・ソースがnetworking構成に追加された後、networkingフォルダ内の構成からgovernance Terraformの出力にアクセスできます:

data "terraform_remote_state" "governance" {
  backend = "oci"
  config = {
    bucket = "terraform-states"
    key = "governance/terraform.tfstate"
    region = "us-phoenix-1"
    endpoint = "https://acme.compat.objectstorage.us-phoenix-1.oraclecloud.com"
    shared_credentials_file = "../terraform-states_bucket_credentials"
    skip_region_validation = true
    skip_credentials_validation = true
    skip_metadata_api_check = true
    force_path_style = true
  }
}

remote-state-data_governance.tfなどの別のファイルにリモート状態のデータ・ソースを定義する場合は、必要に応じてファイルをコピーして貼り付けることができます。その後、新しい構成のそれぞれが、同じ方法でコンパートメントを参照できます。