はじめに
近年、インフラストラクチャのコード化、通称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.
実際の現場ではさまざまなユースケースが考えられます。以下では、公式ドキュメントからどういった使い方が適しているのかを考察しました。
ディスクスペースなどのリソースを節約したい時
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を上手く活用するためには、その機能と仕組みをしっかり理解し、適切な環境管理の習慣を身につけることが必要です。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.10.29
CloudWatchを使ったモニタリングとアラート設定のベストプラクティス
本記事では、Amazon CloudWatchを活用してAWS環境における可観測性を向上させるためのベストプラクティスについて、初心者でも理解しやすく解説します。
- AWS
- インフラエンジニア
2022.12.10
スケーリングとは?垂直スケーリング・水平スケーリングを使い分ける
こちらの記事では、性能のためのスケーリングについて解説します。
- インフラエンジニア
2024.01.28
Undifferentiated Heavy Liftingとは?重労働から解放されるクラウド時代の新戦略
クラウドコンピューティングの文脈でよく使われるこの用語は、企業や開発者が自社のコアビジネスやイノベーションに集中する代わりに、基本的でありながら重要なインフラストラクチャやシステム管理などの作業に多くの時間とリソースを費やしている状況を指します。
- AWS
- インフラエンジニア