広告

Terraform-Provider

GCP

前回に、terraformとproviderの関係を簡単にご紹介しました。
今回はproviderについて、深堀していきたいと思います。

Provider ブロック

プロバイダーの情報を定義するコードブロックです。
terraformはその後のすべてのリソースタイプを providerブロックに依存します。
※コードブロックは開発言語で、コードの塊を意味するものです。{...}で囲んだ部分が1ブロックです。

例:

provider "google" {
    project = "test-project"
    region = "asia-northeast1"
    zone = "asia-northeast1-a"
}

providerを追加した場合、terraform applyコマンドを実行する前にterraform initコマンドを実行する必要があります。
terraform initはプロバイダーのプラグインをダウンロード&インストールするためのコマンドです。
また、terraform initはカレント ワーク ディレクトリにのみ効果があります。ディレクトリごとに自分のterraform init設定を持っています。

terraform initが自動ダウンロード可能なのはHashiCorp社が提供しているもののみです。サードパーティーのプラグインのダウンロードはここをご参照ください。

providers バージョン

providersのバージョンはterraformのバージョンと分離しています。そのため、providersは自分のバージョン番号を持っています。

To prevent automatic upgrades to new major versions that may contain breaking changes
意図しない動作を防ぐために、自動アップグレードを防ぎたい時があります。その場合、バージョンの指定が必要です。

providersバージョン指定

providersのバージョンを指定するには、以下のようなterraformブロックで定義できます。
※指定しない場合、最新バージョンのprovidersプラグインがインストールされます。

terraform {
  required_providers {
    google = "~> 1.0"  # googleのプラグインバージョン指定
  }
}
  • バージョン指定の演算子
    • =(省略可能):固定バージョンを指定
    • !=:指定バージョン以外
    • >,>=,<,<=:バージョン範囲を指定
    • ~>:指定バージョン ~ 次の上位バージョンまでの範囲
      • 例:~> 0.9 is equivalent to >= 0.9, < 1.0
      • 例:~> 0.8.4, is equivalent to >= 0.8.4, < 0.9

providersバージョン確認

以下のコマンドで、providersのバージョンを確認できます。

# terraformディレクトリに移動する
cd <initしたディレクトリ>

# initしたprovidersの確認
terraform providers

# providerのバージョン確認
terraform providers -version

また、強制アップグレードしたい場合、以下のコマンドを使います。

terraform init -upgrade

provider ブロック内の version

providerブロック内でも、versionを指定することが可能です。
ただ、問題を起こす場合があります(特に共有モジュールを定義する時に)。
公式ドキュメントでは推奨していません。

alias(別名) provider

terraformでは、同じproviderに複数設定を定義することができます。
また、どのリソースをどのモジュールで作成するかも指定できます。多くの場合、マルチリージョンを対応するために用いられます。

alias providerの作成

alias providerの定義は、providerブロックに、alias属性を付けることで作成可能です。

alias providerの作成例:

# aliasを指定しないリソースが使用するデフォルトのprovider
provider "google" {
    project = "test-project"
    region = "asia-northeast1"
    zone = "asia-northeast1-a"
}

# alias provider:ここで定義されていない設定はデフォルトのproviderを参照する
provider "google" {
    alias = "us-google"  # alias指定
    project = "test-project"
    region = "us-central1"
    zone = "us-central1-a"
}

aliasの使用

aliasの指定は<provider>.<alias>で指定します。

  • 注意点:
    • ""で囲む必要はない
    • 以下のブロック内にのみ使用可能
      • resource
      • data
      • module

resourceでの指定例:

# default providerの定義
provider "google" {
    project = "test-project"
    region = "asia-northeast1"
    zone = "asia-northeast1-a"
}

# alias providerの定義
provider "google" {
    alias = "us-google"
    project = "test-project"
    region = "us-central1"
    zone = "us-central1-a"
}

# provider指定なし(default provider使用)
resource "google_compute_instance" "vm_instance" {
    name = "terraform-instance"
    machine_type = "f1-micro"

    boot_disk {
        initialize_params {
            image = "debian-cloud/debian-9"
        }
    }

    network_interface {
        network = "default"
        access_config {
        }
    }
}

# alias provider指定
resource "google_compute_instance" "vm_instance-us" {
    provider = google.us-google  # alias providerを指定
    name = "terraform-instance-us"
    machine_type = "f1-micro"

    boot_disk {
        initialize_params {
            image = "debian-cloud/debian-9"
        }
    }

    network_interface {
        network = "default"
        access_config {
        }
    }
}

provider plugin cache

上記で説明した通、terraform initはカレントディレクトリにプラグインをダウンロード&インストールします。
インストール場所は、.\.terraform\plugins\<os_arch>配下になります。
ワークディレクトリが沢山ある場合、同じプラグインをダウンロードすることになってしまいます。

そこで、プラグインのディレクトリを指定する仕組みがあります。

それは、terraformの設定ファイルにplugin_cache_dir設定を追加することです。設定方法
この設定によって、各ワークディレクトリにプラグインを配置しなくなります。

注意点:

  • 事前に手動でplugin_cache_dir指定するディレクトリを用意する
  • windows環境でも、パスに\ではなく、/を使用してください。
  • 環境変数TF_PLUGIN_CACHE_DIRでも設定可能
    • 環境変数の優先度は設定ファイルより高い
    • export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

キャシューの動作:

When a plugin cache directory is enabled, the terraform init command will still access the plugin distribution server to obtain metadata about which plugins are available, but once a suitable version has been selected it will first check to see if the selected plugin is already available in the cache directory. If so, the already-downloaded plugin binary will be used.If the selected plugin is not already in the cache, it will be downloaded into the cache first and then copied from there into the correct location under your current working directory.When possible, Terraform will use hardlinks or symlinks to avoid storing a separate copy of a cached plugin in multiple directories. At present, this is not supported on Windows and instead a copy is always created.

上記引用通り、terraform initするときに、キャッシュフォルダからワークディレクトリへコピー(Windowsの場合)して使用するらしいです。
※Linuxの場合はhardlinks or symlinksを作成することになります。

最後に

今回でproviderに関数内容をご紹介しました。
providerの使い方は基本中の基本なので、是非覚えておいてください。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました