はじめに
そもそもModuleとは
Terraform
にはModuleという共通処理化する機能が備わっています。
そのModuleを使用する際、参照できるディレクトリに配置されている場合はsource変数で指定ディレクトリを渡して指定しますが、他のプロジェクトで同じModuleを使用したい場合に頭を悩ませることになります。
その様な場合にTerraformではWEBやSSHなどのプロトコルで実行環境から参照できる場所にModuleを置くことで、各実行環境にて共通のModuleを使用するができるようになります。
但し、公Moduleを公開する場合はアクセスの権限を気にする必要はないのですが、業務利用する場合などある一定のユーザのみ利用できるModuleにしなければならないという要件が含まれることは多々あることと思います。
今回の記事ではTerraform Cloud
利用観点でアクセスを絞ったModuleについての設定の仕方を紹介したいと思います。
この記事で実現すること
-
Terraform Cloud Private Module
の設定 - VCSのPrivate Moduleを利用したModuleの利用
この記事がターゲットとする読者層
読者層
- Terraform Cloudに興味がある人
- Terraform CloudのModuleの共有の仕方に興味がある人
必要スキル
- 多少のTerraform CloudとVCSの知識
前提の設定
VCSはこのような感じです
まず、りVCS設定は終わっているものとします。こちらができていない方は過去の記事を参考にしてください。
この様な簡単なPrivate Repositoryを作っています。
main.tfも簡単なTerraform Cloud
にWorkspace
を作成するだけのものです。
variable "organization_name" {
type = string
default = "kuroseets"
}
variable "workspace_name" {
type = string
default = ""
}
variable "operations" {
type = bool
default = false
}
resource "tfe_workspace" "this" {
name = var.workspace_name
organization = var.organization_name
operations = var.operations
}
Terraform Cloud Private Modules
機能紹介
Terraform Cloud
でもアカウント内で使い回すことのできるPrivate Modules
という機能があり、Terraform Cloud
のOrganization
にて関連づけられたメンバーのみ参照できる閉じられた環境で利用することを想定した機能です。
こちらはVCSのリポジトリ、ブランチをWorkspache
に紐付けてApplyするのと同様に、VSCのリポジトリをModule設定にて紐付けてpublishして利用できる様にします。
Private Modulesのpublish(設定方法)
owners
権限を持つメンバーでログインし、メニューバーからModules
をクリック。
Add module
をクリック。
VCSを選択。
Moduleとしてpublishするリポジトリを選択。
キャプチャにもある通り、Repository名はterraform-<PROVIDER>-<NAME>
である必要があります。
今回は次の様になります。
PROVIDER = tfe
NAME = test
以上でpublishが完了しました。
呼び出し方
source変数は<TERRAFORM CLOUD URL>/<ORGANIZATION>/<NAME>/<PROVIDER>
となります。
複数バージョンが存在する場合はversion変数を指定します。
module "create_workspace" {
source = "app.terraform.io/kuroseets/test/tfe"
version = "0.0.2"
workspace_name = "test-ws"
}
VSCのPrivate Repositoryを使用したModules
機能紹介
もう一つはTerraform Cloudにてpublishせずに、そのままVCSのPrivate Repositoryを参照する方法です。
Public Repositoryでしたらアクセス権限を考慮せず利用することが可能ですが、Private Repositoryを利用することで利用できるユーザを絞っています。
Private Repositoryを利用する場合の準備では、Terraform Cloud
にてSSH Keys
で秘密鍵を設定します。対になる公開鍵がVCSにて取り込まれていたらRepositoryにアクセスできるようになります。
設定方法
SSH鍵作成
どこかターミナル環境でSSH鍵を発行します。
ssh-keygen -t rsa -m PEM
Terraform CloudのOrganization設定
Terrafomr Cloudにて秘密鍵を登録します。
メニューバーのSettingsをクリックし、SSH Keysをクリック。
Nameと秘密鍵を入力してAdd private SSH key
をクリック。
Terraform CloudのWorkspace設定
引き続き、Workspace
の鍵を指定します。
Workspaces
をクリックした後設定するWorkspace名をクリック。
Workspace
のメニューよりSettings
をクリックし、表示されたサブメニューのSSH Key
をクリックする。
SSH key
ドロップダウンより先ほど登録したSSH鍵を指定し、Update SSH key
をクリック。
VCSに公開鍵を設定(今回はGitHUB)
鍵を登録するユーザのメニューを開き、Settings
画面を開きます。
TitleとKeyを入力しAdd SSH key
をクリック。
呼び出し方
source変数にはgit cloneする際の文字列
を指定します。
module "create_workspace" {
source = "git@github.com:kuroseets/terraform-tfe-test.git"
workspace_name = "test-ws"
}
バージョンを指定する場合は、version変数を使用せず、下記の様にrefを指定します。
source = "git@github.com:kuroseets/terraform-tfe-test.git?ref=v0.0.2"
双方を比較しての私感
Private Modules
とVCSのPrivate RepositoryでSSH鍵を利用するModulesを比較して一番懸念される観点はセキュリティになると思います。
Terraform Cloud
で実装する場合、これはSaasにて一定のメンバーからしかアクセスできないことが担保されていると考えて間違いないと思います。
一方VCSを使用する場合ですが、この場合はアクセス権限管理がVCSのものになりますので冗長のように見え、一見セキュリティに難があると感じるかもしれませんが、Private Modules
を利用する状況でWorkspace
にVSCを利用していないことは想像し辛いところがあります。
要はTerraformのModule以外のコードもVCSにて管理され、一定の権限でアクセスできる様になっているのと同様、Moduleも一定の権限でしかアクセスできないと考えると、セキュリティレベルは同等のものが担保されている状態であると言えます。
あとは使い勝手に関してのメリット・デメリットで判断すれば良いのかなと思います。
個人的なメリデメ
メリット | デメリット | |
---|---|---|
Terraform Cloud Private Modules | Applyする環境と一体感がある | Publishにowners 権限が必要Repositoryのtag付必須 Repositoryに一定の命名規則 |
Private RepositoryをModuleとして参照 | Terraform Cloudから切り離せる | SSH鍵を管理する必要がある source変数の書き方が残念 |
並べてみましたけど、どっちでも良いですね。 | ||
Terraform Cloud Free の様なある程度の規模の範囲でOrganization を区切って使う場合はあまり気にすることは無いと思いますので、使いたい様に使えば良いと思います。 |
||
逆に、Terraform Cloud Team & Governance 以上のOrganization が大きくなる場合に、複数のプロジェクトや権限が異なるメンバーなどいろいろ条件が違う人たち一箇所で使用する場合、全体に適用されるPrivate Modules が足枷で動きが鈍くなるのではという気がしますの。 |
||
その場合は横断で使うものはPrivate Modules 、各プロジェクトの範囲で利用するものはプロジェクトの範囲で閲覧権限のあVCS Private Repositoryで実装するのが良いのではと感じます。 |
今回記事を書いた理由
以上となります。
今回この記事を書いた理由は、Terraform-jpのSlack内でTerraform Cloud
の話題になった際に意外にPrivate Modules
を使っている人が少ないと感じたことからでした。
もし、「こうやってるよー」という意見があれば教えていただきたいところです。
今回もありがとうございました。
参考ページ
関連記事
Terraform Cloud その1 - まずは使ってみた(ローカル実行からリモート実行に変更)
Terraform Cloud その2 - Gihubと連携してみた(VCSとWorking Directoryの設定)
Terraform Cloud その3 - Terraform CloudをTerraformで管理する
Terraform Cloud その4 - ワークスペース間で共有する閉じられた空間で使用するModuleについて