0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Terraform Cloud その4 - ワークスペース間で共有する閉じられた空間で使用するModuleについて

Last updated at Posted at 2020-10-11

はじめに

そもそも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設定は終わっているものとします。こちらができていない方は過去の記事を参考にしてください。
スクリーンショット 2020-10-11 15.45.55.png
この様な簡単なPrivate Repositoryを作っています。
main.tfも簡単なTerraform CloudWorkspaceを作成するだけのものです。

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 CloudOrganizationにて関連づけられたメンバーのみ参照できる閉じられた環境で利用することを想定した機能です。
こちらはVCSのリポジトリ、ブランチをWorkspacheに紐付けてApplyするのと同様に、VSCのリポジトリをModule設定にて紐付けてpublishして利用できる様にします。

Private Modulesのpublish(設定方法)

owners権限を持つメンバーでログインし、メニューバーからModulesをクリック。
スクリーンショット 2020-10-11 15.41.23.png
Add moduleをクリック。
スクリーンショット 2020-10-11 15.41.32.png
VCSを選択。
スクリーンショット 2020-10-11 15.41.43.png
Moduleとしてpublishするリポジトリを選択。
キャプチャにもある通り、Repository名はterraform-<PROVIDER>-<NAME>である必要があります。
スクリーンショット 2020-10-11 15.41.53.png
今回は次の様になります。

PROVIDER = tfe
NAME     = test

次に、Publish moduleをクリック。
スクリーンショット 2020-10-11 15.42.17.png
登録完了。
スクリーンショット 2020-10-11 15.44.07.png

以上で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をクリック。
スクリーンショット 2020-10-11 16.17.18.png

Nameと秘密鍵を入力してAdd private SSH keyをクリック。
スクリーンショット 2020-10-11 16.17.26.png

Organizationに秘密鍵の登録完了。
スクリーンショット 2020-10-11 16.22.28.png

Terraform CloudのWorkspace設定

引き続き、Workspaceの鍵を指定します。
Workspacesをクリックした後設定するWorkspace名をクリック。
スクリーンショット 2020-10-11 16.23.50.png

WorkspaceのメニューよりSettingsをクリックし、表示されたサブメニューのSSH Keyをクリックする。
スクリーンショット 2020-10-11 16.24.11.png

SSH keyドロップダウンより先ほど登録したSSH鍵を指定し、Update SSH keyをクリック。
スクリーンショット 2020-10-11 16.28.25.png

このダイアログが出ていたら登録完了。
スクリーンショット 2020-10-11 16.30.24.png

VCSに公開鍵を設定(今回はGitHUB)

鍵を登録するユーザのメニューを開き、Settings画面を開きます。
スクリーンショット 2020-10-11 16.33.47.png

SSH and GPG keysをクリック。
スクリーンショット 2020-10-11 16.34.01.png

SSH keys画面でNew SSH keyをクリック。
スクリーンショット 2020-10-11 16.34.10.png

TitleとKeyを入力しAdd SSH keyをクリック。
スクリーンショット 2020-10-11 16.34.24.png

パスワード入力を求められた場合はパスワードを入力。
スクリーンショット 2020-10-11 16.35.11.png

登録した公開鍵が確認できたら登録完了。
スクリーンショット 2020-10-11 16.35.27.png

呼び出し方

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について

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?