はじめに 起先
面接時に役に立つ、Terraformにおける実践的な基礎知識やベストプラクティスを学べる問題集を作ってみました。
我们创建了一个问题集合,可帮助您学习Terraform中的实用基础知识和最佳实践,这些问题在面试中很有用。
面接形式なので、サンプルコードの記述が少なく、わかりにくい部分もあるかと思いますが、Terraformの基本的な概念の整理にお役立ていただけます。ぜひ面接の準備や知識の確認にご活用ください。
由于是面试形式,示例代码描述很少,可能有些部分难以理解,但对于组织 Terraform 的基本概念很有用。 请使用它来准备面试并检查您的知识。
注意事項 预防 措施
- 本問題集はTerraformのv1.5.xを基準に作成されています。
这一系列问题基于Terraform v1.5.x。 - 本問題集は、Terraformにおける実践的な基礎知識やベストプラクティスなどを学ぶための問題集であり、全ての問題が実際の企業採用面接時に出題されるとは限りません。また筆者の現在所属する組織の採用活動とは一切関係ありません。
这一系列问题用于学习Terraform的实用基础知识和最佳实践,并非所有问题都会在实际的公司招聘面试中提出。 此外,这与我目前所属组织的招聘活动无关。 - 本問題集では、Terraformの全ての基礎知識やベストプラクティスが網羅されているわけではありません。また特定のprovider(AWS等)に特化したものでもありません。特定のproviderにおけるベストプラクティス等は、該当providerの公式ドキュメント等をご参照ください。
这一系列问题并不涵盖 Terraform 的所有基础知识和最佳实践。 它也不是特定于特定的提供商(AWS等)。 有关特定提供商的最佳实践,请参阅该提供商的官方文档。 - 面接形式となるため、サンプルコード等の記述を省略する場合があります。ご了承ください。
由于是面试形式,因此可以省略示例代码等的描述。 感谢您的理解。 - Terraformの学習においては、公式ドキュメントや他の情報源を併せて活用することをお勧めします。
我们建议您在学习 Terraform 时使用官方文档和其他信息来源。
Q1: Terraformにおけるstateファイルとは何ですか。
Q1: 什么是 Terraform 中的状态文件?
A: stateファイルとは、Terraformが管理するインフラストラクチャの現在の状態を記録するファイルです。このファイルには、作成されたリソースやその構成、依存関係などが含まれています。
答:状态文件是记录 Terraform 管理的基础设施的当前状态的文件。 此文件包含创建的资源、其配置、依赖项等。
デフォルトでは、Terraformが実行されるディレクトリに、terraform.tfstateという名前で作成されます。
默认情况下,它是在运行 Terraform 的目录中创建的,名称为 terraform.tfstate。
Q2: Terraformにおけるbackendとは何ですか。
Q2: 什么是 Terraform 中的后端?
backendを使って、stateファイルの保存場所を定義することができます。
可以使用后端来定义状态文件的存储位置。
通常はリモートストレージにstateファイルを保存するために使います。これによって、チームメンバー間でのstateファイルの共有や、stateファイルのセキュアな保存が可能となります。
它通常用于将状态文件存储在远程存储上。 这允许团队成员共享状态文件并安全地存储状态文件。
Q3: Terraformにおけるstate lockingとは何ですか。
Q3: 什么是 Terraform 中的状态锁定?
state lockingとは、複数のユーザーやプロセスが同時にTerraformを使ってインフラストラクチャを変更する際に、競合状態や矛盾した結果を防ぐための仕組みです。
状态锁定是一种机制,用于防止多个用户或进程同时使用 Terraform 修改基础结构时出现争用条件和不一致的结果。
stateファイルがロックされている間、他のユーザーやプロセスはそのstateファイルを変更できなくなるので、競合状態やデータの不整合を防ぐことができます。
当状态文件被锁定时,其他用户或进程无法修改它,从而防止争用条件和数据不一致。
Q4: Terraformにおけるproviderとは何ですか。
Q4: 什么是 Terraform 中的提供商?
providerとは、特定のクラウドプロバイダー(AWS、Azure、GCPなど)や、SaaSなどのリソースを管理するためのプラグインです。
提供商是用于管理资源(例如特定的云提供商(AWS,Azure,GCP等)或SaaS的插件。
providerはTerraformがリソースを作成、変更、削除する際に使用され、それぞれの環境に対して適切なAPI呼び出しや設定を提供します。
Terraform 使用提供程序来创建、修改和删除资源,并为每个环境提供适当的 API 调用和设置。
Q5: terraform initコマンドの用途を教えてください。
Q5: terraform init 命令的目的是什么?
terraform initコマンドは、Terraformプロジェクトの初期化を行うためのコマンドです。
terraform init 命令用于初始化 Terraform 项目。
主な用途としては 主要应用有:
- providerの初期化 初始化提供程序
- プラグインのダウンロード 下载插件
- backendの設定 设置后端
- moduleの初期化 模块初始化
などが挙げられます。またプロジェクト作成時だけでなく、新しいproviderやmoduleを追加した際にもterraform initコマンドを実行する必要があります。
等等。 您不仅需要在创建项目时执行 terraform init 命令,还需要在添加新提供程序或模块时执行。
Q6: terraform planとterraform applyコマンドの用途を教えてください。
问题 6:地形规划 和 地形应用命令的用途是什么?
terraform planコマンドは、設定値と現在の状態(state)を比較し、リソースの変更内容をプレビューする機能を提供します。変更を実際に適用する前に、変更内容や影響を確認するために使います。
通过地形规划命令,可以将配置值与当前状态进行比较,并预览对资源的更改。 在实际应用更改和效果之前,使用它来查看更改和效果。
terraform applyコマンドは、実際に変更を適用してインフラストラクチャを変更します。オプションなしで実行すると、変更のプレビューが表示された後に、ユーザーに変更を適用するかどうかの入力を求めます。
terraform apply 命令实际上通过应用更改来修改基础结构。 如果在没有任何选项的情况下运行,将显示更改的预览,然后提示用户应用更改。
Q7: terraform planとterraform validateコマンドの違いについて教えてください。
Q7:地形规划与地形验证命令有什么区别?
terraform planコマンドはstateファイルを読み込んで、設定値と現在の状態(state)を比較し、変更のプレビューを生成します。一方、terraform validateコマンドはTerraformの設定ファイルの構文や構造のみを検証します。構文エラーや設定の不整合を検出しますが、変更のプレビューや実際の適用は行いません。
terraform 规划命令读取状态文件,将配置值与当前状态(状态)进行比较,并生成更改的预览。 另一方面,terraform 验证命令仅验证 Terraform 配置文件的语法和结构。 检测语法错误和配置不一致,但不预览或应用更改。
Q8: terraform applyコマンド実行時に、対話形式で変更適用するかどうかの入力を求められますが、それをスキップしてapplyを実行するにはどうしたらいいですか。
Q8: 执行 terraform apply 命令时,系统会询问我是否要以交互方式应用更改,但如何跳过它并执行 apply?
terraform applyコマンドを対話形式なしに実行するには、以下の方法があります。
要在不以交互方式的情况下运行地形应用命令,您可以:
- terraform applyコマンドの-auto-approveオプションを使う
使用 terraform apply 命令的 -auto-approval选项 - terraform plan時に-outオプションを指定し、plan結果をファイルに保存、apply時に該当ファイルを指定
在地形规划时指定 -out 选项,将规划结果保存到文件中,并在应用时指定相应的文件。
Q9: tfファイルをフォーマットする際に使うコマンドは何ですか。
Q9: 格式化 tf 文件的命令是什么?
terraform fmtコマンドを使うことで、Terraformのコードを一貫性のあるフォーマットに整形することができ、コードの可読性を向上させることができます。
terraform fmt 命令允许您将 Terraform 代码格式化为一致的格式并提高代码的可读性。
Q10: Terraformにおけるmoduleとは何ですか。moduleを使うメリットは何ですか。
Q10: 什么是 Terraform 中的模块? 使用模块有什么好处?
Terraformにおけるmoduleとは、複数のリソースや設定を組み合わせて再利用可能なコンポーネントを定義するための仕組みです。moduleは特定のディレクトリ内に.tfファイルを配置して定義され、外部から呼び出されることができます。
在 Terraform 中,模块是一种组合多个资源和配置以定义可重用组件的机制。 模块是通过将 .tf 文件放在特定目录中来定义的,并且可以在外部调用。
moduleの主なメリットは以下になります。 模块的主要优点如下。
- 再利用性の向上: コードの重複を減らし、効率的に管理することが可能になる
提高可重用性:减少代码重复并实现高效管理 - 抽象化と階層化:複雑な設定を論理的な単位に分割し、抽象化することでコードの管理が容易になる
抽象和分层:将复杂设置分解为逻辑单元并抽象它们以使代码更易于管理 - 可読性の向上:コードの意図が明確になり、理解しやすくなる
提高可读性:代码意图更清晰、更易于理解 - チーム開発:共通の設定やリソースを提供し、一貫性を保つ
团队开发:提供通用设置和资源以实现一致性
Q11: TerraformにおけるVariableとLocal Valueの違いについて教えてください。
Q11: Terraform 中的变量值和局部值有什么区别?
Variable(変数)は、Terraformコード内で値をパラメータ化するために使用されます。通常、tfファイル(variables.tfなど)で宣言され、使用される箇所では${var.variable_name}として参照されます。主にプロバイダーやモジュール内で共通の値を渡すために利用されます。
变量用于参数化 Terraform 代码中的值。 它通常在 tf 文件中声明(例如 variables.tf),并在使用它的地方称为 ${var.variable_name}。 它主要用于在提供程序和模块中传递公共值。
一方、Local Value(ローカル値)は、Terraformコード内で一時的な計算や変換を行うための仕組みです。通常、Terraformコード内のlocalsブロックで定義され、使用される箇所では${local.local_name}として参照されます。ローカル値は複雑な計算や共通の変換を効率的に行う際に使用されます。
另一方面,本地值是一种用于在 Terraform 代码中进行临时计算和转换的机制。 它通常在 Terraform 代码的局部变量块中定义,并在使用它的地方称为 ${local.local_name}。 局部值用于有效地执行复杂的计算和常见的转换。
どちらもコードの整理と可読性の向上に役に立ちます。
两者都有助于保持代码的组织和可读性。
Q12: Terraform(HCL)におけるデータ型について教えてください。
问题 12:地形 (HCL) 中的数据类型是什么?
主なデータ型は以下です。 主要数据类型有:
- string 字符串
- number 数
- bool 布尔
- list 列表
- map
- set
- tuple 元
- object 对象
- any
- null 零
これらのデータ型を適切に組み合わせて使用することで、Terraformコード内で様々な種類のデータを操作し、リソースの設定や値の管理を行うことができます。
通过使用这些数据类型的正确组合,您可以在 Terraform 代码中操作不同类型的数据、配置资源和管理值。
Q13: Terraformにおけるtfvarsファイルとは何ですか。
Q13: 什么是 Terraform 中的 tfvars 文件?
tfvarsファイルは、変数の実際の値を設定するために使用されるファイルです。
TFVARS文件是用于设置变量的实际值的文件。
tfvarsファイルの主な用途は以下です。 TFVARS文件的主要用途是:
- 環境ごとの設定 每个环境的设置
- 共有の秘密情報 共享机密
- 共通の設定 常用设置
デフォルトでは、terraform planやapplyコマンド実行時に、terraform.tfvars か terraform.tfvars.jsonというファイル名のファイル、または拡張子が.auto.tfvars か .auto.tfvars.jsonのファイルは自動的に読み込まれます。それ以外の場合はコマンド実行時に-var-fileオプションでtfvarsファイルを指定することができます。
默认情况下,文件名为 terraform.tfvars 或 terraform.tfvars.json 的文件或扩展名为 .auto.tfvars 或 .auto.tfvars.json 的文件将在运行 terraform plan 或应用命令时自动加载。 否则,您可以在执行命令时使用 -var-file 选项指定 tfvars 文件。
Q14: terraform plan & apply実行時に、特定のtfvarsファイルを指定したい場合はどうしたらいいですか。
Q14: 如果我想在执行地形规划和应用时指定特定的tfvars文件,该怎么办?
.tfvarsファイルを直接指定してterraform planやterraform applyを実行するには、コマンド実行時に-var-file オプションでファイル名を指定することができます。また-var-fileを複数記述することで、複数の.tfvarsファイルを指定することも可能です。
要通过指定 .tfvars 文件直接运行地形规划或地形应用,可以在执行命令时使用 -var-file 选项指定文件名。 也可以通过写入多个 -var 文件来指定多个 .tfvars 文件。
Q15: terraform plan & apply実行時に、特定のリソースのみを対象にしたい場合はどうしたらいいですか。
问题 15:如果我在执行 Terraform Plan & Apply 时只想定位特定资源,该怎么办?
コマンド実行時に、-target オプションで特定のリソースのみを対象にすることができます。また-targetを複数記述することで、複数のリソースを指定することも可能です。
运行该命令时,可以使用 -target 选项仅面向特定资源。 也可以通过编写多个 -target 来指定多个资源。
Q16: 現在利用中のtfstateで管理していない既存リソースがありますが、importやハードコーディングせずに、該当リソースの情報を参照したい場合はどうしたらいいですか。
问题 16:我有一个现有资源,该资源不受当前使用的 tfstate 管理,但是如果我想引用资源的信息而不导入或硬编码它,该怎么办?
Data Sourceを定義し、参照することで、tfstateに含まれていないリソースの情報をTerraformコード内で利用できます。
通过定义和引用数据源,可以在 Terraform 代码中使用有关 tfstate 中未包含的资源的信息。
Q17: あるmoduleから別のmoduleにあるリソースの情報を参照したい場合はどうしたらいいですか。(Data Sourceを使用しない場合)
Q17: 如果我想从一个模块引用另一个模块中的资源信息,该怎么办? (不使用数据源时)
リソースの情報を共有するモジュールで、outputs ブロックを使って必要な出力値を定義して、出力値を受け取るモジュールで該当出力値を参照することで実現できます。
这可以通过使用输出块在共享资源信息的模块中定义所需的输出值,然后在接收输出值的模块中引用输出值来实现。
Q18: Terraformにおけるログレベルの種類とコンソール出力時の設定方法を教えてください。
Q18: 请告诉我 Terraform 中的日志级别类型,以及在输出到控制台时如何设置它们。
主なログレベルは以下です。 主要日志级别包括:
- TRACE 跟踪
- DEBUG 调试
- INFO 信息
- WARN 警告
- ERROR 错误
環境変数 TF_LOG を使ってTerraformのログレベルを設定することができます。環境変数 TF_LOG にログレベルを設定してから、Terraformコマンドを実行することで、コンソール出力時のログレベルが変更されます。
您可以使用环境变量TF_LOG来设置 Terraform 的日志级别。 在环境变量TF_LOG中设置日志级别,然后执行 Terraform 命令会在发出到控制台时更改日志级别。
Q19: あるリソースの特定の属性や設定値を変更適用の対象から外したい場合はどうしたらいいですか。
问题 19:如果我想从应用中排除资源的某些属性或设置,该怎么办?
lifecycleのignore_changesを使います。
使用生命周期ignore_changes。
リソースの定義内で ignore_changes ブロックを使って、特定の属性や設定値を変更の対象から外すことができます。このブロックに指定された属性は、変更があってもTerraformが変更差分を無視します。
在资源的定义中,可以使用ignore_changes块来排除某些属性或设置的更改。 此块中指定的属性会导致 Terraform 忽略更改增量,即使存在更改也是如此。
Q20: Terraformで特定のリソースを複数回作成したい場合はどうしたらいいですか。
Q20: 如果我想在 Terraform 中多次创建特定资源,该怎么办?
countまたはfor_eachを使います。 使用计数或for_each。
countの場合は、count に数値を指定し、その回数分だけリソースを作成することができます。リソースにインデックスが付きます。
对于计数,您可以为计数指定一个数字,并为该次数创建资源。 资源已编制索引。
for_eachの場合は、mapまたは文字列のsetの各要素に対して、リソースを作成することができます。リソースはkeyとvalueのペアで作成されます。
对于for_each,您可以为映射或字符串集的每个元素创建资源。 资源是在键值对中创建的。
Q21: Terraformで特定のリソースにある特定のブロックを複数回作成したい場合はどうしたらいいですか。
问题 21:如果我想在 Terraform 中为特定资源多次创建特定块,该怎么办?
dynamic ブロックを使うことで、リソース内で複数のブロックを動的に生成することができます。
动态块允许您在资源中动态生成多个块。
Q22: Terraform管理下のあるリソースは手動再作成によって、リソースを一意に識別する識別子が変更されました。該当リソースを削除せずにそのままTerraformで管理するにはどうしたらいいですか。
问题 22:已手动重新创建 Terraform 管理下的资源,并且唯一标识该资源的标识符已更改。 如何在不删除的情况下管理地形中的资源?
手動再作成によって、実機値とtfstateとの乖離が生じるため、Terraformが再度正しく管理できるようにするためには、以下の方法があります。
由于手动重新创建会导致实际设备值与 tfstate 之间存在差异,因此有以下方法可确保 Terraform 可以再次正确管理它。
- terraform state rm コマンドで旧リソースをtfstateから削除する
Terraform State rm 命令从 tfstate 中删除旧资源 - terraform import コマンドで新リソースをTerraformの管理下に取り込む
用于将新资源置于地形控制下的地形导入命令 - terraform planコマンドを実行し、該当リソースで差分が表示されないことを確認する
运行地形规划命令并验证是否未显示资源的增量
おまけ:実際の面接で聞かれそうな正解のない問題(問題文のみ)
奖励:在实际面试中可能会被问到的没有正确答案的问题(仅限问题文本)
Q1: Terraform利用時に気をつけていることあれば教えてください。
Q1: 请告诉我们在使用Terraform时有什么需要注意的。
Q2: Terraformに関するトラブルシューティングの経験があれば教えてください。
Q2:你对Terraform有任何故障排除经验吗?
Q3: Terraform利用時に大変だったこととその解決方法を教えてください。
Q3: 请告诉我们使用Terraform时有哪些困难以及如何解决。
Q4: Terraformにおけるユニットテスト等のテスティングの経験があれば教えてください。
Q4:请告诉我们您是否有在Terraform上进行单元测试的经验。
Q5: CI/CDツールを使ったTerraformの自動テスト&デプロイを実施した経験があれば教えてください。
问题 5:您是否在使用 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/
原文始发于qiita:Terraform面接質問集を作ってみた