🎾

入門Terraform module source

2022/08/14に公開

概要

個人の備忘録としてTerraform moduleのsourceについてまとめていきます。

参考

https://www.terraform.io/language/modules/sources

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名など)

参考
https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#_single_revisions

# 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を実行するように指定できます。

https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---depthltdepthgt

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は次の順番でアクセスします。

  1. レスポンスヘッダーX-Terraform-Getの示す値
  2. レスポンスがHTMLページの場合にterraform-getで始まるmetaタグが示す値
    ex)
<meta name="terraform-get" content="github.com/hashicorp/example" />

その他のsource

そのほかにS3 BucketGCS 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