TerraformのNetwork MirrorとFilesystem Mirrorを学ぶ

2020.12.14

Network MirrorおよびFilesystem Mirrorはバージョン0.13.2からの新機能です。

Providerのミラーを定義できる機能です。ミラーサイトからProviderをダウンロードできるようになります。これにより、ファイアウォールなどが原因でProviderのソースにアクセスができない場合でもTerraformを利用することが可能になります。

Network Mirrorなし

通常、つまりNetwork Mirrorsを使わない場合は、Providerのダウンロード元はTerraformブロック内のrequired_providerssource値で指定します。

terraform {
  required_providers {
    mycloud = {
      source  = "mycorp/mycloud"
      version = "~> 1.0"
    }
  }
}

上記の例だと、registry.terraform.io/mycorp/mycloudからダウンロードしてきます。 (詳しくは こちら)

Network Mirrorを使うとどうなるか見てみましょう。

Network Mirrorあり

.terraformrc

provider_installation {
  network_mirror {
    url     = "https://hogehoge.com/providers/"
    include = ["example.com/*/*"]
  }
  direct {
    exclude = ["example.com/*/*"]
  }
}

network_mirrorブロックを見てください。上記のように書くと、include値で指定されたsourceを持つproviderは、そのsourceからではなくurl値に書かれた場所からダウンロードされます。

また、この network_mirrorはHTTPSでurl値の場所にアクセスしに行きますが、ローカルにソースがある場合は filesystem_mirrorも利用できます。

設定は.terraformrcファイルで

さて、上記ミラーの設定を書くprovider_installationブロックですが、.terraformrcというファイルに書きます。このファイルは、terraformコマンドを実行するディレクトリではなく、ユーザーのホームディレクトリに配置する必要があります。

※ 上記はWindows以外での場合です。Windowsの場合はterraform.rcというファイル名にして、ユーザーの%APPDATA%ディレクトリに配置します。

やってみる

存在しないproviderをrequireして、filesystem_mirrorを利用してローカルからダウンロードしてみます。

まずtfファイルには以下のように書いています。barが存在しないproviderです。

terraform {
  required_version = "= 0.14.2"

  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "3.20.0"
    }
    bar = {
      source = "hogehoge.com/fuga/bar"
      version = "1.0.0"
    }
  }
}

ホームディレクトリに置くterraform.rcを以下のように書きます。

terraform.rc

provider_installation {
  filesystem_mirror {
    path    = "/Users/kazue.masaki/hogehoge-mirror"
    include = ["hogehoge.com/*/*"]
  }
  direct {
    exclude =  ["hogehoge.com/*/*"]
  }
}

filesystem_mirror.pathで指定したディレクトリ以下は以下のようにしています。HOSTNAME/NAMESPACE/TYPE/terraform-provider-TYPE_VERSION_TARGET.zipという形式に合わせる必要があります。

$ tree ~/hogehoge-mirror/
/Users/kazue.masaki/hogehoge-mirror/
└── hogehoge.com
    └── fuga
        └── bar
            └── terraform-provider-bar_1.0.0_darwin_amd64.zip

この状態でterraform initすると…

$ terraform init
(略)
Initializing provider plugins...
- Finding hogehoge.com/fuga/bar versions matching "1.0.0"...
- Installing hashicorp/aws v3.20.0...
- Installed hashicorp/aws v3.20.0 (signed by HashiCorp)
- Installing hogehoge.com/fuga/bar v1.0.0...
- Installed hogehoge.com/fuga/bar v1.0.0 (unauthenticated)
(略)

ミラーからダウンロードしてインストールできたようです。

terraform providers mirrorコマンド

network_mirrorfilesystem_mirrorを使う場合は、まずはじめに任意の場所にソースを配置する必要があります。その支援をするコマンドも存在します。 terraform providers mirrorコマンドです。

tfファイルに以下のようにawsのproviderを使うと書いた状態で、terraform providers mirrorコマンドを実行してみます。

terraform {
  required_version = "= 0.14.2"

  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "3.20.0"
    }
  }
}
$ terraform providers mirror ~/test-mirror-dir
- Mirroring hashicorp/aws...
  - Selected v3.20.0 to meet constraints 3.20.0
  - Downloading package for darwin_amd64...
  - Package authenticated: signed by HashiCorp
$ tree ~/test-mirror-dir/
/Users/kazue.masaki/test-mirror-dir/
└── registry.terraform.io
    └── hashicorp
        └── aws
            ├── 3.20.0.json
            ├── index.json
            └── terraform-provider-aws_3.20.0_darwin_amd64.zip

ダウンロードできましたね。

参考情報