1. ホーム
  2. 記事一覧
  3. Terraform Workspaceの基礎知識。workspaceの操作と仕組み

2023.09.25

Terraform Workspaceの基礎知識。workspaceの操作と仕組み

はじめに

近年、インフラストラクチャのコード化、通称IaC (Infrastructure as Code) が注目を浴びています。その中でも中心的なツールの1つが「Terraform」です。本記事では、このTerraformの機能の一つである「workspace」に焦点を当て、その基本から使い方に至るまでをご紹介します。

Terraformとは?

Terraformは、HashiCorp社によって開発されたオープンソースのIaCツールです。Terraformを使うことで、従来の手動でのインフラ管理や設定作業を自動化し、コードベースでの管理が可能になります。その結果、インフラの設定変更やデプロイを迅速かつ確実に行うことができます。

クラウド環境でのリソース管理において、Terraformは多くのクラウドプロバイダとの互換性を持ち、AWS、GCP、Azureなど主要なクラウドサービスでのインフラ構築を一元的にコードで管理することができます。

IaCについては以下の記事にて解説しています。

https://envader.plus/article/136

Terraformを用いることで、複数の環境や複数のリージョンでのリソースの状態を一貫して維持することが容易になります。エンジニアの作業効率の向上だけでなく、エラーの発生リスクも低減します。

Terraformにおけるworkspaceとは?

Terraformのworkspaceは、異なる環境を分けて管理するための「仮想の作業部屋」のようなものです。「開発」「ステージング」「本番」といった異なる環境を分けて管理することができます。workspaceを使わずに環境を分ける場合、それぞれの環境ごとにディレクトリを分けるなどの必要がありました。workspaceはコマンド一つで環境を切り替えることができるため、開発環境やステージング環境にすぐに移行して作業することが可能です。 開発環境やステージング環境については次の記事で解説しています。

https://envader.plus/article/134

workspaceではStateファイルを分割できる

Terraformでインフラをコード化すると、その構成や状態を表す「tfstateファイル(通常、terraform.tfstateとして保存される)」が生成されます。デフォルトでは1つのtfstateファイル(以降Stateファイル)で全てのリソースを管理することになります。これは大きなプロジェクトや複数の開発者が関わる状況での問題(Stateファイルのコンフリクト、同期の問題など)を引き起こす可能性がありました。

workspaceという機能を導入することで、「開発」「ステージング」といった環境ごとにStateファイルが作成されます。これにより、環境ごとのStateファイルを管理することが可能になりました。環境ごとにStateファイルを分けることで、前述したコンフリクトや同期の問題を効果的に回避できるようになったのです。

tfstateファイルについては、以下の記事で解説しています。

https://envader.plus/article/199 https://envader.plus/article/199

どんな時にworkspaceを使うべきか?

Terraformの公式ドキュメントでは、以下のようにユースケースとして解説されています。

You can create multiple working directories to maintain multiple instances of a configuration with completely separate state data. However, Terraform installs a separate cache of plugins and modules for each working directory, so maintaining multiple directories can waste bandwidth and disk space. This approach also requires extra tasks like updating configuration from version control for each directory separately and reinitializing each directory when you change the configuration. Workspaces are convenient because they let you create different sets of infrastructure with the same working copy of your configuration and the same plugin and module caches.

A common use for multiple workspaces is to create a parallel, distinct copy of a set of infrastructure to test a set of changes before modifying production infrastructure.

Non-default workspaces are often related to feature branches in version control. The default workspace might correspond to the main or trunk branch, which describes the intended state of production infrastructure. When a developer creates a feature branch for a change, they might also create a corresponding workspace and deploy into it a temporary copy of the main infrastructure. They can then test changes on the copy without affecting the production infrastructure. Once the change is merged and deployed to the default workspace, they destroy the test infrastructure and delete the temporary workspace.

Managing Workspacesより引用

実際の現場ではさまざまなユースケースが考えられます。以下では、公式ドキュメントからどういった使い方が適しているのかを考察しました。

ディスクスペースなどのリソースを節約したい時

workspaceを使うと、1つのディレクトリ内で複数の環境や設定を切り替えて管理することができるようになります。何度もプラグインやモジュールをダウンロード・保存する手間が省けるため、ディスクスペースを節約できます。

つまり、リソースの使用状況を節約したいといった場面に効果を発揮するということです。

異なる環境ごとにディレクトリを作成する場合、それぞれのディレクトリにはプラグインやモジュールの情報がダウンロード・保存されます。多くのディレクトリを持つということは、それだけ多くのディスクスペースを消費することに繋がります。

テストを行う場合

本番環境と似たテスト環境を作ることで、安全に変更を試すことができます。このテスト環境は、新しい変更を試す場所として役立ち、万が一の問題があった場合でも本番環境には影響を及ぼしません。変更が正しく動作することをテスト環境で確認した後、本番環境にその変更を適用することができ、これにより本番での問題を最小限に抑えることができます。

workspaceの基本的な操作

workspaceの操作方法は非常にシンプルで分かりやすいです。基本的な使い方は以下になります。

$ terraform [オプション」 workspace [サブコマンド]

terraform -h workspaceでヘルプがひけます。

$ terraform -h workspace
Usage: terraform [global options] workspace

  new, list, show, select and delete Terraform workspaces.

Subcommands:
    delete    Delete a workspace
    list      List Workspaces
    new       Create a new workspace
    select    Select a workspace
    show      Show the name of the current workspace

workspaceの確認と作成

現在洗濯中のworkspaceを確認するには、showコマンドを使用します。

$ terraform workspace show
default

Terraformを初期化した際には、defaultのworkspaceが自動で作成されています。workspaceを新しく作成するにはnewコマンドを使用します。

# workspaceを作成する
$ terraform workspace new dev
Created and switched to workspace "dev"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

terraform new 作成したいworkspace名とすることで、新しくworkspaceが作成されていることが分かります。注意する点は、workspaceを作成すると自動で作成したworkspaceへ切り替えられることです。間違いに注意しましょう。

workspaceのリスト表示

listコマンドで、存在しているworkspaceを確認できます。

$ terraform workspace list
  default
* dev

*が表示されている方が、現在のworkspaceになります。このコマンドでは、存在している全てのworkspaceを確認することができます。

workspaceの切り替え

selectコマンドでworkspaceを切り替えます。

$ terraform workspace select default
Switched to workspace "default".

workspaceの削除

deleteコマンドでworkspaceを削除できます。

$ terraform workspace delete dev
Deleted workspace "dev"!

削除する際にも、確認のメッセージは表示されません。間違って残しておくべきworkspaceを削除してしまわないように注意が必要です。

workspaceでの文字列補完

workspace機能で便利なのが、${terraform.workspace}とすることでworkspaceの文字列を使用できる点です。コードの中に記述することで文字列として補完できるため、workspaceごとにタグの内容を変更したいときなどに活用できます。

# workspaceがdevの場合
resource "aws_vpc" "test" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "${terraform.workspace}-VPC"
  }
}

# terraform planの結果
~~~~~~~~~中略~~~~~~~~~~~
+ owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "dev-VPC"
        }
      + tags_all                             = {
          + "Name" = "dev-VPC"
        }
    }

workspaceの機能を使って環境別のVPCを作成する

シンプルな例として、workspaceをdev、stg、prdに分けて作成し、VPCを環境ごとに作成します。VPCのソースコードは先ほどの例をそのまま使用します。

はじめにterraform newコマンドで3つの環境を作成します。

$ terraform workspace new dev
Created and switched to workspace "dev"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

# 一度に作成できないため、stg、prdを順番に作成する。

3つのworkspaceを作成後、devへworkspaceを切り替えます。

$ terraform workspace select dev
Switched to workspace "dev".

この状態でterraform applyを実行します。devのworkspaceで実行して良いか質問されるため、yesと入力し実行します。

$ terraform apply
~~~~~~中略~~~~~
+ owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "dev-VPC"
        }
      + tags_all                             = {
          + "Name" = "dev-VPC"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions in workspace "dev"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

次にstgのworkspaceへ切り替えます。

$ terraform workspace select stg
Switched to workspace "stg".

VPCのソースコードはそのまま、stgのworkspaceでterraform applyを実行します。

$ terraform apply
~~~~~~中略~~~~~
+ tags                                 = {
          + "Name" = "stg-VPC"
        }
      + tags_all                             = {
          + "Name" = "stg-VPC"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions in workspace "stg"?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

prdのworkspaceも同様に、切り替えとterraform applyを実行します。完了後、マネジメントコンソールで3つのVPCが作成されているか確認します。

ソースコードを変更せずに、タグを環境ごとに変更しVPCを作成することができました。このように、一つのソースコードでリソースを管理することができるのがworkspaceの機能です。

workspaceで生成されるディレクトリ

新しくworkspaceを作成すると、.terraform.tfstate.dというディレクトリが生成され、その中にworkspace名のディレクトリが生成されます。その後、実際にVPCなどのリソースを作成するとworkspace名のディレクトリ内に環境ごとのStateファイルが作成されるようになります。

main.tfと同じディレクトリに存在しているStateファイルは、defaultのworkspaceを管理しているものです。

# 例
$ tree .
.
├── main.tf
├── terraform.tfstate
└── terraform.tfstate.d # 以下、workspaceで管理されるディレクトリ
    └── dev
        └── terraform.tfstate

このような仕組みで、workspaceごとにStateファイルを分けて管理しています。

まとめ

Terraformのworkspaceの基礎知識と使い方について、本記事を通して学びました。

workspaceはTerraformでのインフラ管理を効率的に行うための機能の一つです。特に、複数の環境を持つプロジェクトにおいては、環境の切り替えや設定の管理をスムーズに行うための必須のツールと言えるでしょう。この機能を使うことで、「開発」「ステージング」「本番」といった異なる環境間での移動や操作が、コマンドひとつで可能になります。

workspaceを活用することで、それぞれの環境ごとに専用のStateファイルを持つことができます。これにより、環境ごとのインフラの状態を明確に把握し、管理することが簡単になります。

注意点として、どのworkspaceが現在アクティブなのかを常に意識することです。誤って別の環境で操作を実行してしまうと、予期しない問題や変更が生じる可能性があります。

workspaceを上手く活用するためには、その機能と仕組みをしっかり理解し、適切な環境管理の習慣を身につけることが必要です。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事

2020.02.25

完全未経験からエンジニアを目指す爆速勉強法

USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

  • キャリア・学習法
  • エンジニア

2024.04.06

[ハンズオン]AWS Backupで作成したAMIをLambdaを使用して起動テンプレートに適用

この記事では、AWS上でのリソース管理を自動化する方法を実践的に解説します。特に、開発環境やプロダクション環境におけるデプロイメントプロセスの簡素化や、ディザスタリカバリ準備の一環として、最新のAMIを定期的に起動テンプレートに適用する自動化手法を紹介します。

  • AWS
  • インフラエンジニア
  • ハンズオン

2023.01.25

【初心者向け】GitHubとは?必須知識と使い方について解説!

こちらの記事でGitHubの基礎知識と基本操作、そして実際の開発時の使い方について解説します。

  • インフラエンジニア

2024.01.28

Undifferentiated Heavy Liftingとは?重労働から解放されるクラウド時代の新戦略

クラウドコンピューティングの文脈でよく使われるこの用語は、企業や開発者が自社のコアビジネスやイノベーションに集中する代わりに、基本的でありながら重要なインフラストラクチャやシステム管理などの作業に多くの時間とリソースを費やしている状況を指します。

  • AWS
  • インフラエンジニア