入門Terraform module source
概要
個人の備忘録としてTerraform moduleのsourceについてまとめていきます。
参考
Localパス
シングルソースrepository内で構成ファイルをソースとする場合に利用するのがLocalパスです。
module "consul" {
source = "./consul"
}
localパスでのsourceの指定は module registry addressと区別できるようにするために./または../で始める必要があります。
localパスでの指定では対象ファイルが既にlocal disk上に存在するためダウンロードせず直接利用されます。親モジュールが更新された場合に自動で更新されます。
Terraformではlocal pathに絶対パス(ここのコンピューターのファイルシステムレイアウトに結びつく)の利用を推奨されてません。
Terraform Registry
public Terraform registryでは次のようにsourceに<NAMESPACE>/<NAME>/<PROVIDER>の規則で指定してmoduleを指定します。
module "consul" {
source = "hashicorp/consul/aws"
version = "0.1.0"
}
そのほかのregistryでホスティングされている場合は前述の名前のprefixに<HOSTNAME>/を加えた命名でsourceに指定します。
module "consul" {
source = "app.terraform.io/example-corp/k8s-cluster/azurerm"
version = "1.1.0"
}
SaaSバージョンのTerraform Cloudを利用している場合、そのプライベート registryのhostnameはapp.terraform.ioになります。
GitHub
次のようにGitHubのURLを指定することでsourceとしてGitHub repositoryを指定できます。
module "consul" {
source = "github.com/hashicorp/example"
}
SSHでcloneする場合は次のように指定します。
module "consul" {
source = "git@github.com:hashicorp/example.git"
}
任意のGitリポジトリ
任意のGitリポジトリをsourceに指定する場合はプレフィックスにgit::をつけてアドレスを指定します。
ex)
module "vpc" {
source = "git::https://example.com/vpc.git"
}
module "storage" {
source = "git::ssh://username@example.com/storage.git"
}
terraformはgit cloneコマンドを利用してmoduleをインストールします。
そのため、credentialsを含むlocalのGitのconfigurationを設定する必要があります。
パブリックでないGitリポジトリにアクセスするために、そのGitリポジトリ用の適切なcredentialsを設定する必要があります。
revisionの指定
デフォルトではterraformはデフォルトブランチ(HEADで参照)からmoduleをインストールします。ref引数を指定する事でこのデフォルト設定を上書きできます。
このref引数に指定することができる値としてはgit checkoutコマンドで指定できる値であれば任意のものを指定できます(ex:SHA-1 ハッシュやtag名など)
参考
# select a specific tag
module "vpc" {
source = "git::https://example.com/vpc.git?ref=v1.2.0"
}
# directly select a commit using its SHA-1 hash
module "storage" {
source = "git::https://example.com/storage.git?ref=51d462976d84fdea54b47d80dcabbf680badcdb8"
}
shallow clone
git cloneコマンドの--depth引数に該当するURL引数のdepthを指定することで、
Gitに対してある指定数のgit commitをhistoryから削除したshallow cloneを実行するように指定できます。
scpライクアドレスsyntax
SSH経由でgitリポジトリをsourceに指定する場合、 URLにプレフィックssh://をつけた短縮系での指定がterraformでは推奨されます。
ex)
module "storage" {
source = "git::username@example.com:storage.git"
}
HTTP URLs
sourceにHTTPまたはHTTPS URLを指定した場合、terraformはmoduleを取得するためにGETリクエストします。
正常系のレスポンス(status200)が返却された場合、terraformは次の順番でアクセスします。
- レスポンスヘッダー
X-Terraform-Getの示す値 - レスポンスがHTMLページの場合に
terraform-getで始まるmetaタグが示す値
ex)
<meta name="terraform-get" content="github.com/hashicorp/example" />
その他のsource
そのほかにS3 BucketやGCS Bucketなどをsourceに指定できます。
パッケージのサブディレクトリのmodule
パッケージのサブディレクトリ化のmoduleを指定する場合、次のように
ダブルスラッシュ//に続けてそのサブディレクトリのmoduleを指定します。
ex)
hashicorp/consul/aws//modules/consul-clustergit::https://example.com/network.git//modules/vpchttps://example.com/network-module.zip//modules/vpcs3::https://s3-eu-west-1.amazonaws.com/examplecorp-terraform-modules/network.zip//modules/vpc
refのような引数をsourceアドレスに指定する場合はサブディレクトリ部分の後に引数の指定をします。
ex)
git::https://example.com/network.git//modules/vpc?ref=v1.2.0github.com/hashicorp/example//modules/vpc?ref=v1.2.0
Discussion