TerraformのNetwork MirrorとFilesystem Mirrorを学ぶ
Network MirrorおよびFilesystem Mirrorはバージョン0.13.2からの新機能です。
Providerのミラーを定義できる機能です。ミラーサイトからProviderをダウンロードできるようになります。これにより、ファイアウォールなどが原因でProviderのソースにアクセスができない場合でもTerraformを利用することが可能になります。
Network Mirrorなし
通常、つまりNetwork Mirrorsを使わない場合は、Providerのダウンロード元はTerraform
ブロック内のrequired_providers
のsource
値で指定します。
terraform { required_providers { mycloud = { source = "mycorp/mycloud" version = "~> 1.0" } } }
上記の例だと、registry.terraform.io/mycorp/mycloud
からダウンロードしてきます。 (詳しくは こちら)
Network Mirrorを使うとどうなるか見てみましょう。
Network Mirrorあり
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
を以下のように書きます。
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_mirror
やfilesystem_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
ダウンロードできましたね。