
TerraformのNetwork MirrorとFilesystem Mirrorを学ぶ
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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
ダウンロードできましたね。






