Terraform面接質問集を作ってみた

# はじめに
面接時に役に立つ、Terraformにおける実践的な基礎知識やベストプラクティスを学べる問題集を作ってみました。
面接形式なので、サンプルコードの記述が少なく、わかりにくい部分もあるかと思いますが、Terraformの基本的な概念の整理にお役立ていただけます。ぜひ面接の準備や知識の確認にご活用ください。

## 注意事項
- 本問題集はTerraformのv1.5.xを基準に作成されています。
- 本問題集は、Terraformにおける実践的な基礎知識やベストプラクティスなどを学ぶための問題集であり、全ての問題が実際の企業採用面接時に出題されるとは限りません。また筆者の現在所属する組織の採用活動とは一切関係ありません。
- 本問題集では、Terraformの全ての基礎知識やベストプラクティスが網羅されているわけではありません。また特定のprovider（AWS等）に特化したものでもありません。特定のproviderにおけるベストプラクティス等は、該当providerの公式ドキュメント等をご参照ください。
- 面接形式となるため、サンプルコード等の記述を省略する場合があります。ご了承ください。
- Terraformの学習においては、公式ドキュメントや他の情報源を併せて活用することをお勧めします。

# Q1: Terraformにおけるstateファイルとは何ですか。
A: stateファイルとは、Terraformが管理するインフラストラクチャの現在の状態を記録するファイルです。このファイルには、作成されたリソースやその構成、依存関係などが含まれています。
デフォルトでは、Terraformが実行されるディレクトリに、terraform.tfstateという名前で作成されます。

# Q2: Terraformにおけるbackendとは何ですか。
backendを使って、stateファイルの保存場所を定義することができます。
通常はリモートストレージにstateファイルを保存するために使います。これによって、チームメンバー間でのstateファイルの共有や、stateファイルのセキュアな保存が可能となります。

# Q3: Terraformにおけるstate lockingとは何ですか。
state lockingとは、複数のユーザーやプロセスが同時にTerraformを使ってインフラストラクチャを変更する際に、競合状態や矛盾した結果を防ぐための仕組みです。
stateファイルがロックされている間、他のユーザーやプロセスはそのstateファイルを変更できなくなるので、競合状態やデータの不整合を防ぐことができます。

# Q4: Terraformにおけるproviderとは何ですか。
providerとは、特定のクラウドプロバイダー（AWS、Azure、GCPなど）や、SaaSなどのリソースを管理するためのプラグインです。
providerはTerraformがリソースを作成、変更、削除する際に使用され、それぞれの環境に対して適切なAPI呼び出しや設定を提供します。

# Q5: terraform initコマンドの用途を教えてください。
terraform initコマンドは、Terraformプロジェクトの初期化を行うためのコマンドです。

主な用途としては
- providerの初期化
- プラグインのダウンロード
- backendの設定
- moduleの初期化
 
などが挙げられます。またプロジェクト作成時だけでなく、新しいproviderやmoduleを追加した際にもterraform initコマンドを実行する必要があります。

# Q6: terraform planとterraform applyコマンドの用途を教えてください。
terraform planコマンドは、設定値と現在の状態（state）を比較し、リソースの変更内容をプレビューする機能を提供します。変更を実際に適用する前に、変更内容や影響を確認するために使います。

terraform applyコマンドは、実際に変更を適用してインフラストラクチャを変更します。オプションなしで実行すると、変更のプレビューが表示された後に、ユーザーに変更を適用するかどうかの入力を求めます。


# Q7: terraform planとterraform validateコマンドの違いについて教えてください。
terraform planコマンドはstateファイルを読み込んで、設定値と現在の状態（state）を比較し、変更のプレビューを生成します。一方、terraform validateコマンドはTerraformの設定ファイルの構文や構造のみを検証します。構文エラーや設定の不整合を検出しますが、変更のプレビューや実際の適用は行いません。


# Q8: terraform applyコマンド実行時に、対話形式で変更適用するかどうかの入力を求められますが、それをスキップしてapplyを実行するにはどうしたらいいですか。
terraform applyコマンドを対話形式なしに実行するには、以下の方法があります。
- terraform applyコマンドの-auto-approveオプションを使う
- terraform plan時に-outオプションを指定し、plan結果をファイルに保存、apply時に該当ファイルを指定


# Q9: tfファイルをフォーマットする際に使うコマンドは何ですか。
terraform fmtコマンドを使うことで、Terraformのコードを一貫性のあるフォーマットに整形することができ、コードの可読性を向上させることができます。

# Q10: Terraformにおけるmoduleとは何ですか。moduleを使うメリットは何ですか。
Terraformにおけるmoduleとは、複数のリソースや設定を組み合わせて再利用可能なコンポーネントを定義するための仕組みです。moduleは特定のディレクトリ内に.tfファイルを配置して定義され、外部から呼び出されることができます。

moduleの主なメリットは以下になります。
- 再利用性の向上: コードの重複を減らし、効率的に管理することが可能になる
- 抽象化と階層化：複雑な設定を論理的な単位に分割し、抽象化することでコードの管理が容易になる
- 可読性の向上：コードの意図が明確になり、理解しやすくなる
- チーム開発：共通の設定やリソースを提供し、一貫性を保つ

# Q11: TerraformにおけるVariableとLocal Valueの違いについて教えてください。
Variable（変数）は、Terraformコード内で値をパラメータ化するために使用されます。通常、tfファイル（variables.tfなど）で宣言され、使用される箇所では${var.variable_name}として参照されます。主にプロバイダーやモジュール内で共通の値を渡すために利用されます。

一方、Local Value（ローカル値）は、Terraformコード内で一時的な計算や変換を行うための仕組みです。通常、Terraformコード内のlocalsブロックで定義され、使用される箇所では${local.local_name}として参照されます。ローカル値は複雑な計算や共通の変換を効率的に行う際に使用されます。
どちらもコードの整理と可読性の向上に役に立ちます。

# Q12: Terraform（HCL）におけるデータ型について教えてください。
主なデータ型は以下です。
- string
- number
- bool
- list
- map
- set
- tuple
- object
- any
- null

これらのデータ型を適切に組み合わせて使用することで、Terraformコード内で様々な種類のデータを操作し、リソースの設定や値の管理を行うことができます。

# Q13: Terraformにおけるtfvarsファイルとは何ですか。
tfvarsファイルは、変数の実際の値を設定するために使用されるファイルです。
tfvarsファイルの主な用途は以下です。
- 環境ごとの設定
- 共有の秘密情報
- 共通の設定

デフォルトでは、terraform planやapplyコマンド実行時に、terraform.tfvars か terraform.tfvars.jsonというファイル名のファイル、または拡張子が.auto.tfvars か .auto.tfvars.jsonのファイルは自動的に読み込まれます。それ以外の場合はコマンド実行時に-var-fileオプションでtfvarsファイルを指定することができます。

# Q14: terraform plan & apply実行時に、特定のtfvarsファイルを指定したい場合はどうしたらいいですか。
.tfvarsファイルを直接指定してterraform planやterraform applyを実行するには、コマンド実行時に-var-file オプションでファイル名を指定することができます。また-var-fileを複数記述することで、複数の.tfvarsファイルを指定することも可能です。

# Q15: terraform plan & apply実行時に、特定のリソースのみを対象にしたい場合はどうしたらいいですか。
コマンド実行時に、-target オプションで特定のリソースのみを対象にすることができます。また-targetを複数記述することで、複数のリソースを指定することも可能です。

# Q16: 現在利用中のtfstateで管理していない既存リソースがありますが、importやハードコーディングせずに、該当リソースの情報を参照したい場合はどうしたらいいですか。
Data Sourceを定義し、参照することで、tfstateに含まれていないリソースの情報をTerraformコード内で利用できます。


# Q17: あるmoduleから別のmoduleにあるリソースの情報を参照したい場合はどうしたらいいですか。（Data Sourceを使用しない場合）
リソースの情報を共有するモジュールで、outputs ブロックを使って必要な出力値を定義して、出力値を受け取るモジュールで該当出力値を参照することで実現できます。

# Q18: Terraformにおけるログレベルの種類とコンソール出力時の設定方法を教えてください。
主なログレベルは以下です。
- TRACE
- DEBUG
- INFO
- WARN
- ERROR

環境変数 TF_LOG を使ってTerraformのログレベルを設定することができます。環境変数 TF_LOG にログレベルを設定してから、Terraformコマンドを実行することで、コンソール出力時のログレベルが変更されます。

# Q19: あるリソースの特定の属性や設定値を変更適用の対象から外したい場合はどうしたらいいですか。
lifecycleのignore_changesを使います。
リソースの定義内で ignore_changes ブロックを使って、特定の属性や設定値を変更の対象から外すことができます。このブロックに指定された属性は、変更があってもTerraformが変更差分を無視します。

# Q20: Terraformで特定のリソースを複数回作成したい場合はどうしたらいいですか。
countまたはfor_eachを使います。
countの場合は、count に数値を指定し、その回数分だけリソースを作成することができます。リソースにインデックスが付きます。
for_eachの場合は、mapまたは文字列のsetの各要素に対して、リソースを作成することができます。リソースはkeyとvalueのペアで作成されます。


# Q21: Terraformで特定のリソースにある特定のブロックを複数回作成したい場合はどうしたらいいですか。
dynamic ブロックを使うことで、リソース内で複数のブロックを動的に生成することができます。

# Q22: Terraform管理下のあるリソースは手動再作成によって、リソースを一意に識別する識別子が変更されました。該当リソースを削除せずにそのままTerraformで管理するにはどうしたらいいですか。
手動再作成によって、実機値とtfstateとの乖離が生じるため、Terraformが再度正しく管理できるようにするためには、以下の方法があります。
- terraform state rm コマンドで旧リソースをtfstateから削除する
- terraform import コマンドで新リソースをTerraformの管理下に取り込む
- terraform planコマンドを実行し、該当リソースで差分が表示されないことを確認する


# おまけ：実際の面接で聞かれそうな正解のない問題（問題文のみ）
### Q1: Terraform利用時に気をつけていることあれば教えてください。


### Q2: Terraformに関するトラブルシューティングの経験があれば教えてください。

### Q3: Terraform利用時に大変だったこととその解決方法を教えてください。

### Q4: Terraformにおけるユニットテスト等のテスティングの経験があれば教えてください。

### Q5: CI/CDツールを使ったTerraformの自動テスト＆デプロイを実施した経験があれば教えてください。

# 参考URL
- https://developer.hashicorp.com/terraform
- https://www.youtube.com/watch?v=pCoCynze4Ag
- https://www.youtube.com/watch?v=tyRhxznRkg0
- https://www.youtube.com/watch?v=LPW3VriwLVs
- https://www.youtube.com/watch?v=OOZkOJVH0rA
- https://www.simplilearn.com/terraform-interview-questions-and-answers-article
- https://intellipaat.com/blog/interview-question/terraform-interview-questions/?US
- https://geekflare.com/terraform-interview-questions-and-answers/