Terraformのtfstateファイルは、Terraformによって管理されるインフラリソースの実際の状態をJSON形式で保存したファイルです。このファイルには現状のリソースの状態が保存されています。Terraformはterraform apply
が実行されるたびにこのファイルを参照・更新し、構築したいインフラの状態と現在のインフラの状態との差分を判断します。
この記事では、Terraformの基本的な構成要素であるコア、プロバイダついて解説し、tfstateファイルの役割や注意点について解説します。
Terraformの主要な構成要素
はじめにTerraformを利用する際に理解しておくべき2つの構成要素を解説します。tfstateファイルが作成される際に大きく関わってくるのが、次に紹介するTerraformコアとTerraformプロバイダです。
Perform CRUD operations with providers
コア
Terraformを実行する上で重要な役割を担っているのがコアです。このコアが、構築したいリソースの設定が書かれた拡張子が.tfのファイル(以降tfファイル)の読み取りや、tfstateファイルに現在のリソースの状態を書き込む動作を行います。
また、後述する「プロバイダ」へ、読み込んだ設定でリソースを作成、変更、削除を行うよう依頼するのもコアの役割です。
例えば、terraform apply
コマンドを実行した場合に、コアがプロバイダへリソースの作成、変更、削除を実行するように依頼し、プロバイダがその依頼をもとに環境を構築します。その際にコアがクラウド上のリソース情報を読み取り、tfstateファイルへ状態を書き込みます。
このように、Terraformコアはtfファイルを読み込むことでどのようなリソースを構築するのかを理解し、プロバイダを利用してどんな操作をするのかを判断する役割を担っています。
terraform apply
コマンドなどの詳細については、以下の記事で解説しています。
https://envader.plus/article/162
また、Terraformのinput変数については以下のリンク記事をご覧ください。
https://envader.plus/article/190
プロバイダ
プロバイダは先述したコアと実際に構築したいサービスなどとの架け橋のような役割を果たします。Terraformがサポートするクラウドサービスやそのほかのサービスとの間で、APIを利用して具体的な操作を行うのがプロバイダです。
例えば、AWSのEC2インスタンスを作成する場合、コアから依頼を受けた内容をもとに具体的なリソースの変更を行うのはAWSプロバイダが行っています。
また、プロバイダにはバージョンがあり定期的に更新されます。プロバイダのバージョンが更新されることで、新しいサービスやリソースをTerraformで利用できるようになります。
プロバイダは開発する環境へインストールする必要がありますが、terraform init
コマンドを実行することで自動的にインストールされます。
tfstateファイルとは?
tfstateファイルは、クラウド上に構築されたリソースの現在の状態を記録したファイルで、JSON形式で記述されています。
terraform apply
コマンドを実行すると、デフォルトではterraform.tfstateというファイルがコマンドを実行したディレクトリへ作成されます。
Terraformは、あるべき姿を記述したtfファイルと、リソースの現状を記録したtfstateファイルの情報をもとに二つのファイルの差分を計算し、新しくリソースを作成、更新、または削除するのかを判断します。
tfstateファイルはTerraformの動作の中心的な部分であり、Terraformが何を行うべきか、またどのリソースがどの状態にあるかを知るための主要な情報源といって良いでしょう。
tfstateファイルのキーとその説明
tfstateファイルはJSON形式で記述されていると先述しました。サンプルで以下のようなtfstateファイルを作成しました。
{
"version": 4,
"terraform_version": "1.4.6",
"serial": 15,
"lineage": "b024f1a9-cd64-4f9d-9a30-8a63f3b2e812",
"outputs": {
"vpc_id": {
"value": "vpc-a1b2c3d4",
"type": "string"
}
},
"resources": [
{
"module": "module.root",
"mode": "managed",
"type": "aws_instance",
"name": "example_instance",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"id": "i-0123456789abcdef0",
"ami": "ami-0c55b159cbfafe1f0",
"instance_type": "t2.micro",
"tags": {
"Name": "ExampleInstance"
},
"availability_zone": "ap-northeast-1a"
}
}
]
}
],
"depends_on": [
"aws_security_group.example"
],
"initialized": true
}
それぞれの主要なキーと内容は次の表のとおりです。
キー | 説明 |
---|---|
version | tfstateファイルのフォーマットバージョンを示す。 |
terraform_version | tfstateファイルを作成または更新した際のTerraformのバージョン。 |
serial | tfstateファイルの更新回数を示す。 |
lineage | tfstateファイルの一意の識別子。UUID |
outputs | Terraformコードで定義された出力変数の現在の値を示す。 |
resources | 定義されたリソースに関する情報の配列。 |
depends_on | リソースまたはモジュール間の依存関係を示す。 |
initialized | プロジェクトが初期化されているかどうかを示すブール値。 |
tfstateファイルが必要な理由
tfstateファイルはTerraformのtfファイルと、クラウド上の実際のリソースとの間での仲介役を果たします。例を挙げると、tfファイルで「aws_instance.main」と記述してサーバーを構築すると、実際のクラウド上には「i-abcd1234」のような一意のIDを持つインスタンスが作成されます。このようなコードと実際のリソースとの対応関係を記録しておくのがtfstateファイルの役目です。
特に、クラウド上に複数のサーバーが既に存在する状況では、tfファイルで定義した「aws_instance.main」が実際にはどのサーバーに該当するのかを判別するのは難しいものです。しかし、tfstateファイルには「aws_instance.main」が「i-abcd1234」というIDを持つサーバーであることが記されているため、これによりtfファイルとクラウドのサーバーとの紐づけが容易になります。
tfstateファイルの管理方法
tfstateファイルを管理する方法には、ローカルで管理する方法と、AWS S3やAzure Blob Storage、Terraform Cloudなどのリモートバックエンドのサービスを利用する方法の二通りがあります。
ローカルで管理する際の注意点として、PCが壊れてしまうとtfstateファイルも失われてしまうことや、チーム開発でTerraformを利用する場合には複数人で同じtfstateファイルを共有することが難しいなどが挙げられます。
チーム開発時にローカルでtfstateファイルを共有するのが難しい理由
複数人でローカルにあるtfstateファイルを共有する状況を考えた場合、まず最新のtfstateファイルを全員で共有することが難しいことが挙げられます。tfstateファイルは、管理されているインフラの現在の状態を詳細に反映しているため、一度でも更新が行われるとその内容は古いものとなり、他のメンバーが持つtfstateファイルの情報との間でずれが生じます。
このずれが生じると、問題が生じるリスクが増大します。例えば、Aさんがtfstateファイルを更新した直後に、Bさんが古いtfstateファイルを基に変更を行った場合、Aさんの変更内容が上書きされるか、最悪の場合、不整合が発生してインフラに影響を及ぼす可能性があります。
さらに、tfstateファイルには様々なクラウドリソースの情報や機密情報が含まれることもあるため、これを適切に管理しつつ共有することも一つの課題となります。万が一、セキュリティの観点から不適切な方法で共有されてしまうと、外部に情報が漏れるリスクも生まれます。
そして、tfstateファイルの変更履歴を追うことは、どの開発者がいつどのような変更を加えたかを明確にする上で非常に重要です。しかし、通常のファイル共有手段を用いると、この履歴の追跡が難しくなります。
これらの点を考慮すると、tfstateファイルをチームで効果的に共有するためには、リモートバックエンドのような専用のツールやサービスの導入が不可欠となります。これにより、同期の問題や情報漏洩に対するセキュリティの課題を解決し、チーム全体でのインフラの管理をスムーズに行うことができるようになります。
tfstateファイルは手動での更新は推奨されていない
TerraformのtfstateファイルはJSON形式で保存されていますが、これを直接編集することは推奨されていません。理由は、TerraformがCLIを介して安全かつ正確にtfstateの変更を行うための特別なコマンドを提供しているからです。このコマンドがあるおかげで、tfファイルの内容が変更された場合でも、CLIを利用すれば問題なくtfstateファイルの内容を作成、更新、削除することができます。
また、Terraformはtfファイルのコード上で定義した設定と実際のクラウド上のリソースとの間で、1対1の明確な関連性を持つことを前提として動作します。具体的には、Terraformがクラウド上に新しいリソースを作成すると、その情報がtfstateファイルに追加されます。逆に、リソースを削除すると、その情報がtfstateファイルからも取り除かれます。
このような仕組みがうまく機能するためには、tfstateファイルが正確かつ最新であることが極めて重要です。しかし、tfstateファイルを手動で編集する、あるいはTerraformが提供する以外の方法で変更してしまうと、この1対1の関係が狂ってしまう可能性があります。その結果、Terraformは意図しない動作をするかもしれません。そうなった場合、ユーザー自身が問題の原因を特定し、修正する作業が必要となるでしょう。
以上の理由から、Terraformのtfstateを安全に保つためにはtfstateファイルを直接編集するのではなく、CLIのコマンドを活用することが推奨されています。
tfstateファイルをリモートで管理する方法
tfstateファイルの管理をより安全かつ効率的に行うためには、リモートでtfstateファイルを管理します。公式では後述するTerraform Cloudの利用が推奨されています。
リモートでの管理は特にチームでの開発において、tfstateファイルを安全に共有し、適切なバージョン管理を行うのに役立ちます。
リモートバックエンドの利用
Terraformの「リモートバックエンド」という機能は、tfstateファイルをリモートで安全に保管するための仕組みを提供します。この機能を活用すると、tfstateファイルをクラウドストレージサービス、例えばAmazon S3やAzure Blob Storageに保存できるようになります。このリモートの保管方法のメリットは、ローカルのPCに問題が発生してもtfstateファイルの紛失リスクが大幅に低減することです。さらに、チーム内でのtfstateの共有が容易になり、同時に変更が行われることによる競合を防ぐロック機能や、過去のバージョンに戻すことができるバージョン管理、そしてtfstateファイルのセキュアな暗号化といったメリットを享受することができます。
Terraform Cloudを活用する
Terraform CloudはHashiCorp社が提供するクラウドサービスで、Terraformの状態管理や実行をクラウド上で行うことができます。特にtfstateファイルの管理においては、自動的なバージョン管理や変更履歴の追跡、アクセス制御などの機能が提供されます。これにより、チームメンバー間でのtfstateファイルの共有や同期が非常に簡単になります。
さらに、Terraform Cloudを使用することでTerraformのプランや適用の操作を中央で一元管理できるため、インフラの変更をより安全に、かつ迅速に行うことができます。
まとめ
こちらの記事では、Terraformのtfstateファイルの基本について解説しました。
tfstateファイルがあることで、tfファイルに記述したリソースと実際のクラウド上に作成したリソースとを紐づけることが可能になります。そのtfstateファイルは「リモートバックエンド」を活用して複数人で共有することが可能です。
どのようなリモートバックエンドを利用するのかはユースケースに応じて検討する必要があります。
また、コアやプロバイダがどのような役割を担っているのかもしっかりと押さえておきたいところです。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.07.23
【Terraformハンズオン】ECS Fargateでアプリケーションデプロイを実践してみよう
ECSでは、Dockerコンテナが実行されている1つ以上のEC2インスタンスを「クラスタ」と呼ばれる単位で扱います。 そのクラスタは、「EC2起動型」と「Fargate」から選択することができ、今回の記事ではFargateをTerraformで構築する手順を解説します。
- AWS
2024.02.29
AWS Certified Data Engineer - Associate(DEA)取得するメリット
今回は、「AWS Certified Data Engineer - Associate」について解説します。今後、AWSクラウドに関する深い知識を
- AWS
- 資格
2024.08.01
ECSのデプロイ戦略を比較 ブルー/グリーンとローリングアップデート
デプロイメント戦略は、アプリケーションの更新をスムーズかつ安全に行うための重要な手段です。適切な戦略を選ぶことで、ダウンタイムを最小限に抑え、ユーザーへの影響を軽減できます。本記事では、ECSで利用可能な2つの主要なデプロイメント戦略、ブルー/グリーンデプロイメントとローリングアップデートについて解説します。
- AWS