入門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-cluster
git::https://example.com/network.git//modules/vpc
https://example.com/network-module.zip//modules/vpc
s3::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.0
github.com/hashicorp/example//modules/vpc?ref=v1.2.0
Discussion