TerraformのModuleソースとしてGitHubのPrivate Repositoriesを利用する
技術推進室とサービス開発部兼務の宇津井です。 前回から連続してTerraformネタです。
Terraform Enterprise(以下TFE)が新しいバージョンになって、TerraformのModuleソースとしてGitHubプライベートリポジトリを利用することができるようになりました。 https://www.terraform.io/docs/modules/sources.html#github
なお、以前でも利用はできたのですが、以下の方法しかありませんでした。
- 認証情報をソースファイルに書く
- パブリックリポジトリを利用する
TFEが新しいバージョンになって色々と調べている中で、SSH KEYを登録して、外部からmoduleをcloneする機能がついたことで世界が変わりました。
なお、TFEにはPrivate Module Registryを利用する方法もあり、こちらでも似たようなことが実現できます。
https://www.terraform.io/docs/enterprise/registry/index.html
こちらについては次回記載してみようと思います。
やり方
Private Repositories登録方法(GitHubを利用した場合)
登録方法といっても難しいことはなく、GitHubにリポジトリ作って中身用意するだけです。 GMOメディアでは以下のようなディレクトリ構造になっています。
$ tree -d .
.
├── compute
│ ├── ec2
│ └── security_group
├── database
│ └── rds
│ └── aurora
├── mail
│ └── ses-sending-and-recieving
├── network
│ ├── alb
│ │ ├── alb
│ │ ├── alb_listener
│ │ └── alb_target_group
│ ├── cf
│ │ ├── cf
│ │ ├── cf-additional-1-cache-behaivior
│ │ ├── cf-additional-2-cache-behaivior
│ │ ├── cf-additional-3-cache-behaivior
│ │ ├── cf-additional-4-cache-behaivior
│ │ └── cf-additional-9-cache-behaivior
│ ├── dns
│ │ ├── route53
│ │ └── route53-alias
│ ├── eip
│ └── nlb
│ ├── nlb
│ ├── nlb_listener
│ ├── nlb_target_group
│ └── nlb_target_group_attachment
├── security
│ ├── iam_role
│ └── iam_user
└── storage
├── elasticache-memcached
└── s3
Private Repositories利用方法(GitHubを利用した場合)
SSH Keyを登録
まず、TFE上でGitHubのリポジトリをCloneする必要があるので、SSH KeyをTFE, GitHub双方に登録します。
TFE - Organization setting - Manage SSH Keys
GitHub - Personal settings - SSH and GPG keys
SSH Keyとmoduleをcloneする設定
TFEに作成済みのWorkspaceに対して、GitHubからModulesをLocalにCloneする設定を実施します。
- TFE - Workspaces - Integrations
設定は2箇所のみです。 SSH KEYには先ほど登録した鍵を指定します。
更に、Include submodules on cloneにチェックを入れて上記の鍵を利用して、GitHubからModulesをコピーする設定を有効にします。
ModuleのSourceをGitHubに向ける
moduleのsourceをlocalからGitHub Private Repositryに向けます。 https://www.terraform.io/docs/modules/sources.html
before
module "consul" {
source = "./consul"
}
after
module "consul" {
source = "git@github.com:hashicorp/example.git//subdir"
}
確認
モジュールの中身が一致して入れば以上で終了です。 terraform plan
コマンドを打って差分が出ないことを確認しましょう。
所感
これまではモジュールを利用してるとは言いつつ、コピーして使いまわしていたので、Aというサービスで必要になった修正を施しても、Bというサービスの方ではその恩恵を得られないと言った状況でした。
この方法ですと共通モジュール化されたことにより、全てのサービスでその恩恵を得られることになります。
逆に影響範囲が一気に増えるので怖さもあります。Terraformにはバージョンを指定してModuleを利用する機能があるため、この機能を利用すればある程度柔軟に運用できると思いますが、なんとこの機能はTerraform RegistryかTerraform Enterprise’s private module registryでしか利用できないらしいです。
https://www.terraform.io/docs/modules/usage.html
Version constraints are supported only for modules installed from a module registry, such as the Terraform Registry or Terraform Enterprise’s private module registry. Other module sources can provide their own versioning mechanisms within the source string itself, or might not support versions at all. In particular, modules sourced from local file paths do not support version; since they’re loaded from the same source repository, they always share the same version as their caller.
issueに上がってますが 言い切っていますね。
versioning is integrated with the module registry
やはりTerraform Enterprise’s private module registryを利用した方が良さそうです。 ということで、次回はTerraform Enterprise’s private module registryの利用方法です。