トキヌク

Terraform サンプル問題

HashiCorp Certified: Terraform Associate(Terraform)対策のオリジナル問題50問を無料公開。アプリの無料枠と同じ問題で、全210問収録のTerraform問題集から抜粋しています。「答えと解説を見る」を開くと、正解だけでなく全選択肢の解説を読めます。

50問無料公開 全210問収録 全選択肢解説付き
アプリで解く(無料・登録不要)→

IaCの概念とTerraformの目的

IaCの利点/マルチクラウド

Q1. Terraformの構成言語が「宣言的(declarative)」であると言われるのは、どの性質を指していますか?

  1. A. リソースを作成する手順を上から順に実行する命令の並びとして記述する
  2. B. 望ましい最終状態を記述し、そこに到達するための操作順序はTerraformが決定する
  3. C. 実行のたびに必ずすべてのリソースを削除してから作り直す
  4. D. 構成ファイルを書かずに、対話的なプロンプトで設定値を毎回入力する
答えと解説を見る

正解:B

A それは手続き的(imperative)なアプローチの説明。シェルスクリプトやSDKを使った自動化がこれにあたる

B(正解) 正解。構成ファイルには「あるべき姿」だけを書き、依存関係の解析と実行順序の決定はTerraformが担う

C 宣言的であることは再作成を意味しない。Terraformは差分のみを適用し、一致しているリソースには手を触れない

D 対話的な操作はコード化の対極にあり、宣言的という語とは無関係

IaCの利点/マルチクラウド

Q2. 手作業でコンソールから設定を変更した結果、実際の環境と管理者が想定している構成がずれていく現象を何と呼びますか?

  1. A. ロールバック
  2. B. 冪等性
  3. C. ブルーグリーンデプロイ
  4. D. 構成ドリフト
答えと解説を見る

正解:D

A 変更を以前の状態に戻す操作のこと。ずれが生じる現象そのものを指す語ではない

B 同じ操作を何度実行しても結果が変わらない性質。ずれを防ぐ側の概念であり、ずれの名称ではない

C 新旧2系統の環境を切り替えるリリース手法。構成のずれとは別の話題

D(正解) 正解。IaCではplanで実環境と構成の差分を検出できるため、ドリフトを早期に発見して収束させられる

IaCの利点/マルチクラウド

Q3. Terraformが単一のワークフローで複数のクラウドやSaaSを扱えるのは、どのアーキテクチャによるものですか?

  1. A. 各サービスのAPIを呼び出すプロバイダをプラグインとして読み込む仕組み
  2. B. すべてのクラウドAPIがTerraform本体のバイナリに組み込まれている
  3. C. 各クラウドが提供する管理エージェントを仮想マシンに常駐させる
  4. D. クラウド間の差異を吸収する共通リソースタイプだけを提供している
答えと解説を見る

正解:A

A(正解) 正解。Terraform Coreは構成とステートの差分計算を担い、実際のAPI呼び出しはプロバイダプラグインが行う

B 本体には同梱されない。プロバイダはinit時にレジストリから個別にダウンロードされる

C Terraformはエージェントレスで、APIを直接呼び出す。常駐エージェントは不要

D リソースタイプはプロバイダ固有(aws_instance、azurerm_virtual_machineなど)。共通化された抽象リソースは提供されない

IaCの利点/マルチクラウド

Q4. 「Terraformはマルチクラウド対応である」という説明の正しい理解はどれですか?

  1. A. 同じ構成ファイルをそのまま別のクラウドに向ければ、同等のリソースが作られる
  2. B. Terraformがクラウド間でリソースを自動的に移行してくれる
  3. C. 複数のプロバイダを同一の構成・同一のワークフローで一貫して管理できる
  4. D. クラウド事業者ごとに別々のTerraformバイナリを使い分ける
答えと解説を見る

正解:C

A よくある誤解。リソースタイプも引数もプロバイダ固有なので、クラウドを変えれば構成の書き直しが必要

B 移行機能は持たない。Terraformはあくまで各プロバイダのAPIを呼ぶだけ

C(正解) 正解。AWSとCloudflareとDatadogを1つのplan/applyで扱うといった、ツールとワークフローの統一が本質

D バイナリは共通で、差分はプロバイダプラグインが吸収する

IaCの利点/マルチクラウド

Q5. インフラ構成をコードとしてバージョン管理システムに置くことの利点として、最も適切なものはどれですか?

  1. A. クラウドの利用料金が自動的に最適化される
  2. B. 変更履歴が残り、レビューを経てから適用でき、過去の版に戻せる
  3. C. ステートファイルが不要になる
  4. D. 適用作業に管理者権限が不要になる
答えと解説を見る

正解:B

A コスト最適化はコード管理の直接の効果ではない。料金はどのリソースをどれだけ作るかで決まる

B(正解) 正解。差分レビュー、変更理由の追跡、リバートといったソフトウェア開発の実践をインフラ変更に持ち込める

C 構成をGitに置いてもステートは必要。ステートは構成と実リソースの対応を保持するもので、役割が異なる

D 実際にAPIを呼ぶ際の資格情報と権限は依然として必要

IaCの利点/マルチクラウド

Q6. 構成に変更がない状態でterraform applyを続けて2回実行した場合、期待される挙動はどれですか?

  1. A. 同じリソースがもう1組追加で作成される
  2. B. 既存リソースがいったん破棄されてから再作成される
  3. C. 差分がないため何も変更されず、0 added, 0 changed, 0 destroyedとなる
  4. D. 2回目はエラーになり、先にdestroyを実行するよう促される
答えと解説を見る

正解:C

A ステートに既存リソースが記録されているため重複作成はされない。ステートを持たないスクリプトとの決定的な違い

B 差分がなければ破棄も再作成も行われない。再作成は引数の変更や-replaceの指定で起こる

C(正解) 正解。同じ操作を繰り返しても結果が変わらないこの性質を冪等性と呼ぶ

D エラーにはならない。差分ゼロは正常な結果

Terraformの基本

プロバイダ/初期化

Q7. 新しい作業ディレクトリで最初にterraform initを実行したとき、Terraformが行う処理として正しいものはどれですか?

  1. A. 構成に定義されたリソースを実際にクラウド上へ作成する
  2. B. 必要なプロバイダプラグインとモジュールを取得し、バックエンドを初期化する
  3. C. 既存リソースの現状をステートファイルに読み込んで同期する
  4. D. 構成ファイルを正規のフォーマットに整形する
答えと解説を見る

正解:B

A リソースの作成はapplyの役割。initはリソースに一切触れない

B(正解) 正解。作業ディレクトリを使用可能な状態に整える初期化コマンドで、他のほとんどのコマンドの前提となる

C 実リソースの読み取りと同期はrefresh(planやapplyの一部)が行う処理

D 整形はterraform fmtの役割

プロバイダ/初期化

Q8. 使用するプロバイダのソースとバージョン制約を宣言するブロックはどれですか?

  1. A. providerブロックの中のversion引数
  2. B. moduleブロックのproviders引数
  3. C. terraformブロックの中のrequired_providersブロック
  4. D. variableブロック
答えと解説を見る

正解:C

A providerブロックはリージョンや資格情報などの設定用。かつてはversionも書けたが非推奨で、バージョン宣言はrequired_providersに集約された

B これは呼び出し元のプロバイダ設定をモジュールへ引き渡すための引数。どのバージョンを使うかの宣言とは役割が異なる

C(正解) 正解。terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } の形で宣言する

D variableは入力変数の宣言用で、プロバイダの依存関係とは無関係

プロバイダ/初期化

Q9. プロバイダのバージョン制約にversion = "~> 4.16" と書いた場合、インストールが許可されるバージョンはどれですか?

  1. A. 4.16以上5.0未満のすべてのバージョン
  2. B. 4.16.0以上4.17.0未満のバージョンのみ
  3. C. 4.16ちょうどのみ
  4. D. 4.16以上のすべてのバージョン(上限なし)
答えと解説を見る

正解:A

A(正解) 正解。悲観的制約演算子は指定した最も右の桁だけ増加を許すため、~> 4.16はマイナーバージョンの上昇を許し、メジャーの5.0は許さない

B その範囲になるのは ~> 4.16.0と3桁で書いた場合。桁数によって意味が変わる点が頻出のひっかけ

C 1つに固定したい場合はversion = "4.16.0" のように等号で書く

D 上限なしにしたい場合は ">= 4.16" と書く。~> には必ず上限がある

プロバイダ/初期化

Q10. .terraform.lock.hclファイルの役割として正しいものはどれですか?

  1. A. ステートファイルへの同時書き込みを防ぐロックを保持する
  2. B. 実行中のapplyの進捗を記録する一時ファイル
  3. C. プロバイダの資格情報をローカルに保存する
  4. D. 選択されたプロバイダのバージョンとパッケージのハッシュを記録し、実行環境間で同じ依存関係を再現する
答えと解説を見る

正解:D

A ステートのロックはバックエンド側の機能で、このファイルとは無関係。名前が似ているための頻出の取り違え

B 進捗の記録用ではなく、init時に生成・更新される永続的なファイル

C 資格情報は保存されない。秘匿情報を含まないためリポジトリにコミットできる

D(正解) 正解。依存関係ロックファイルと呼ばれ、バージョン管理にコミットしてチーム全員で同じプロバイダを使うようにする

プロバイダ/初期化

Q11. バージョン制約の範囲内でプロバイダを新しい版に更新し、ロックファイルを更新したいときに使うコマンドはどれですか?

  1. A. terraform init -reconfigure
  2. B. terraform init -upgrade
  3. C. terraform apply -refresh-only
  4. D. terraform providers upgrade
答えと解説を見る

正解:B

A -reconfigureはバックエンド設定を既存の設定を無視して初期化し直すオプション。プロバイダの更新は行わない

B(正解) 正解。制約を満たす最新のプロバイダとモジュールを取得し直し、.terraform.lock.hclを更新する

C 実リソースの現状をステートに反映するだけで、プラグインの更新はしない

D架空 このサブコマンドは存在しない。terraform providersにはlockやmirrorといったサブコマンドはあるがupgradeはない

プロバイダ/初期化

Q12. required_providersにsource = "hashicorp/aws" と書いたとき、この文字列の意味として正しいものはどれですか?

  1. A. GitHubのhashicorp/awsリポジトリからソースコードを取得する
  2. B. ローカルディレクトリhashicorp/aws配下のプラグインを読み込む
  3. C. 既定のレジストリregistry.terraform.ioにおける名前空間hashicorpのawsプロバイダを指す
  4. D. hashicorpという名前のバックエンドのawsという設定を参照する
答えと解説を見る

正解:C

A GitHubリポジトリの指定ではない。プロバイダはビルド済みバイナリとしてレジストリから配布される

B ローカルパスではない。ローカルの実装を使う場合はdev_overridesなど別の仕組みを用いる

C(正解) 正解。完全形はregistry.terraform.io/hashicorp/awsで、ホスト名を省略すると公開レジストリが既定になる

D バックエンドとは無関係。sourceはプロバイダの配布元アドレス

プロバイダ/初期化

Q13. 多数の作業ディレクトリで同じプロバイダを使うため、initのたびに同じプラグインをダウンロードするのを避けたいときに設定する環境変数はどれですか?

  1. A. TF_PLUGIN_CACHE_DIR
  2. B. TF_DATA_DIR
  3. C. TF_LOG_PATH
  4. D. TF_CLI_ARGS_init
答えと解説を見る

正解:A

A(正解) 正解。指定したディレクトリを共有キャッシュとして使い、既に取得済みのプラグインは再ダウンロードせず再利用する

B 作業ディレクトリ内の .terraformに相当する作業用ディレクトリの場所を変える変数。ディレクトリ間の共有キャッシュにはならない

C デバッグログの出力先ファイルを指定する変数で、プラグイン取得とは無関係

D initに既定の引数を毎回付け足す変数。オプションを書く手間は省けるが、ダウンロードの重複そのものは解消しない

プロバイダ/初期化

Q14. 同一構成の中で、あるリソース群は東京リージョン、別のリソース群は大阪リージョンのAWSに作りたい場合の正しい方法はどれですか?

  1. A. 作業ディレクトリを2つに分けるしか方法はない
  2. B. resourceブロックにregion引数を追加してリージョンを上書きする
  3. C. required_providersにawsを2回宣言する
  4. D. aliasを付けた2つ目のproviderブロックを定義し、リソース側でprovider = aws.osakaのように指定する
答えと解説を見る

正解:D

A 分割するのも設計上ありうるが、単一構成でも実現できるため「しかない」は誤り

B リージョンはプロバイダ設定の引数であり、個々のリソースにregion引数は存在しない

C required_providersでは同じプロバイダを重複して宣言できない。宣言は1つで、設定を複数持たせるのが正しい

D(正解) 正解。エイリアスによって同一プロバイダの複数設定を使い分けられる。エイリアスなしの設定が既定として使われる

コアワークフローとCLI

init/plan/apply/destroy

Q15. terraform planを実行したときの挙動として正しいものはどれですか?

  1. A. 現状と構成を比較して実行計画を表示するが、インフラは変更しない
  2. B. 計画を表示し、承認なしで小さな変更だけを自動的に適用する
  3. C. ステートファイルを新規作成し、既存リソースを自動的に取り込む
  4. D. 構成ファイルの整形と検証だけを行う
答えと解説を見る

正解:A

A(正解) 正解。planは読み取りと差分計算のみを行う。適用は別途applyが必要

B planは規模にかかわらず一切の変更を行わない

C 既存リソースの取り込みはimportの役割で、planは自動では行わない

D 整形はfmt、検証はvalidate。planはそれらより先の、実環境との差分計算まで行う

init/plan/apply/destroy

Q16. CI/CDパイプラインの中でterraform applyを対話的な確認なしに実行するには、どのオプションを使いますか?

  1. A. terraform apply -force
  2. B. terraform apply -input=false
  3. C. terraform apply -auto-approve
  4. D. terraform apply -lock=false
答えと解説を見る

正解:C

A -forceは古いバージョンの名残で、現在のapplyでは承認スキップの正規のオプションではない

B -input=falseは未指定の変数などを対話的に尋ねる動作を止めるための指定で、適用の承認そのものを省くものではない。承認を省くには -auto-approveか保存済みプランの指定が要る

C(正解) 正解。yesの入力を求めずにそのまま適用する。保存済みプランファイルを渡す場合も確認は省略される

D ステートのロック取得を無効にするオプション。承認プロンプトとは無関係で、むしろ同時実行によるステート破損を招く

init/plan/apply/destroy

Q17. terraform destroyと等価な操作はどれですか?

  1. A. terraform apply -refresh-only
  2. B. terraform apply -destroy
  3. C. terraform state rmを全リソースに対して実行する
  4. D. 作業ディレクトリの .tfファイルをすべて削除してapplyする
答えと解説を見る

正解:B

A 実リソースの現状をステートに反映するだけで、リソースは削除されない

B(正解) 正解。destroyは、管理下の全リソースを削除する計画を作って適用するapply -destroyの別名にあたる

C state rmはステートから外すだけで実リソースは残る。むしろ課金され続ける取り残しを生む危険な取り違え

D 結果的に削除計画にはなるが、コードを失う破壊的な操作であり等価な手段とは言えない

init/plan/apply/destroy

Q18. terraform plan -target=aws_instance.webの説明として最も適切なものはどれですか?

  1. A. 日常の運用で、変更範囲を絞るために推奨される標準的な手法である
  2. B. 指定したリソースだけをステートから除外する
  3. C. 指定したリソースの依存先は無視され、対象リソースだけが単独で評価される
  4. D. 計画の対象を指定リソースとその依存関係に限定するもので、障害復旧などの例外的な状況で使う
答えと解説を見る

正解:D

A 公式には例外的な用途とされ、常用は推奨されない。構成全体との整合が崩れやすい

B ステートからの除外はstate rm。-targetは計画の対象を絞るオプション

C 依存先も必要に応じて計画に含まれる。完全に単独で評価されるわけではない

D(正解) 正解。エラーからの回復やデバッグのための一時的な手段であり、常用すると構成ドリフトを招く

CLIサブコマンド/デバッグ

Q19. クラウドの資格情報を持たないCI環境で、構成ファイルの構文と内部整合性だけを素早く確認したい場合に適したコマンドはどれですか?

  1. A. terraform plan
  2. B. terraform validate
  3. C. terraform fmt -check
  4. D. terraform show
答えと解説を見る

正解:B

A planは実リソースを読み取るためプロバイダの認証が必要になる。資格情報のない環境では失敗しうる

B(正解) 正解。属性名の誤りや型の不一致などを構成内で完結して検査する。事前にinitでプロバイダのスキーマが必要な点に注意

C 確認できるのは書式が正規形かどうかだけで、構文エラーや参照ミスの検出は目的ではない

D ステートや保存済みプランの内容を人が読める形で表示するコマンドで、構成の検証は行わない

CLIサブコマンド/デバッグ

Q20. リポジトリ内の .tfファイルがHashiCorpの標準スタイルに沿っているかをCIで検査し、違反があれば失敗させたい場合のコマンドはどれですか?

  1. A. terraform fmt -check -recursive
  2. B. terraform fmt -diff
  3. C. terraform validate -style
  4. D. terraform fmt -write=false -recursive
答えと解説を見る

正解:A

A(正解) 正解。-checkは書き換えずに差分の有無だけを判定し、整形が必要ならゼロ以外の終了コードを返す。-recursiveでサブディレクトリも対象になる

B -diffは変更内容を表示するオプション。単体では書き換えが行われ、CIの失敗判定にも使えない

C validateにこのオプションはなく、そもそも書式の検査は担当外

D 書き換えずに対象ファイル名を列挙するだけで、整形が必要でも終了コードは成功のまま。CIで失敗させるには -checkが要る

CLIサブコマンド/デバッグ

Q21. プロバイダとのやり取りを含む詳細なデバッグログをファイルに出力したい場合、どの環境変数を設定しますか?

  1. A. TF_LOG_PROVIDER=TRACEとTF_DATA_DIR=debug.log
  2. B. TF_LOG_LEVEL=TRACEとTF_LOG_FILE=debug.log
  3. C. TF_LOG=TRACEとTF_LOG_PATH=debug.log
  4. D. terraform apply -verbose > debug.log
答えと解説を見る

正解:C

A TF_LOG_PROVIDERはプロバイダのログだけに絞る変数、TF_DATA_DIRは作業用ディレクトリの場所を変える変数。どちらもログの出力先指定ではない

B 変数名が誤り。レベルを渡すのはTF_LOG、出力先はTF_LOG_PATH

C(正解) 正解。TF_LOGにはTRACE/DEBUG/INFO/WARN/ERRORを指定でき、TRACEが最も詳細。TF_LOG_PATHの指定でファイルにも書き出される

D -verboseというオプションはなく、ログレベルの制御は環境変数で行う

CLIサブコマンド/デバッグ

Q22. 同じ構成コードでdev用とstg用のステートを分けたい場合、CLIワークスペースを使う手順として正しいものはどれですか?

  1. A. terraform workspace clone default stgで既定のワークスペースを複製する
  2. B. terraform init -workspace=stgで初期化時に指定する
  3. C. terraform workspace select stgを実行すれば、未作成でも自動的に作られる
  4. D. terraform workspace new stgで作成し、以後terraform workspace selectで切り替える
答えと解説を見る

正解:D

A架空 cloneというサブコマンドは存在しない

B initにこのオプションはない。ワークスペースの操作は専用のサブコマンドで行う

C selectは既存のワークスペースへの切り替え専用で、存在しない名前を指定するとエラーになる

D(正解) 正解。newは作成と同時に切り替えも行う。構成内ではterraform.workspace式で現在の名前を参照できる

init/plan/apply/destroy

Q23. レビュー担当者が承認した計画とまったく同じ内容だけが適用されることを保証したい場合、正しいワークフローはどれですか?

  1. A. terraform plan -out=tfplanで計画を保存し、承認後にterraform apply tfplanを実行する
  2. B. terraform planの出力をテキストファイルに保存し、承認後にterraform apply -auto-approveを実行する
  3. C. terraform apply -targetで承認されたリソースだけを指定する
  4. D. terraform plan -lock=falseを使い、計画中に他者が変更できないようにする
答えと解説を見る

正解:A

A(正解) 正解。保存済みプランを渡すと計画は再計算されず、承認された変更だけが適用される。この場合は確認プロンプトも表示されない

B テキストは人が読むための記録に過ぎない。applyが改めて計画を作り直すため、その間の変更が入り込みうる

C -targetは対象を絞るだけで、計画内容の同一性は保証しない

D -lock=falseはむしろロックを無効化する指定で、意味が逆

CLIサブコマンド/デバッグ

Q24. applyで作成したロードバランサのDNS名を、他ツールから機械的に読み取れる形で取得したい場合に適したコマンドはどれですか?

  1. A. terraform state list
  2. B. terraform output -json
  3. C. terraform console
  4. D. terraform show -json
答えと解説を見る

正解:B

A ステートに含まれるリソースアドレスの一覧が出るだけで、属性値は得られない

B(正解) 正解。outputブロックで公開した値をJSONで取得できる。単一の値ならterraform output -raw <名前> も使える

C 式を評価する対話シェルで、スクリプトからの機械的な取得には向かない

D ステート全体をJSONで出せるが構造が大きく、目的の値を取るだけならoutputのほうが適切

ステート管理

ステートの仕組み

Q25. Terraformがステートファイルを必要とする最も本質的な理由はどれですか?

  1. A. 構成ファイルのバックアップとして保管するため
  2. B. クラウドの資格情報を安全に保管するため
  3. C. 構成上のリソースと実世界のリソースの対応付けを保持するため
  4. D. planの実行結果を永続化して次回のapplyで再利用するため
答えと解説を見る

正解:C

A ステートは構成のバックアップではない。構成のバックアップはバージョン管理システムの役割

B 資格情報の保管場所ではない。むしろステートには機密の属性値が平文で入りうるため、保護すべき対象

C(正解) 正解。どの定義がどの実IDに対応するかを記録することで、次回以降に作成・更新・削除のどれが必要かを判断できる

D 計画の永続化はplan -outで作るプランファイルの役目で、ステートとは別物

ステートの仕組み

Q26. バックエンドを明示的に設定していない作業ディレクトリで初めてapplyを実行した場合、ステートはどこに保存されますか?

  1. A. 作業ディレクトリ内のterraform.tfstateというローカルファイル
  2. B. .terraformディレクトリの中に暗号化されて保存される
  3. C. HashiCorpのサーバーに自動的にアップロードされる
  4. D. 保存されず、毎回クラウドAPIから状態を再構築する
答えと解説を見る

正解:A

A(正解) 正解。既定はlocalバックエンドで、更新時には直前の内容がterraform.tfstate.backupとして残される

B .terraformにはプラグインやモジュールが置かれる。ステートは作業ディレクトリ直下で、しかも暗号化されない

C 設定なしに外部へ送信されることはない。リモート保存には明示的なバックエンドやcloudブロックの設定が要る

D APIからの全再構築はできないためステートが必要になる。これがTerraformの設計の前提

バックエンド/ロック

Q27. 個人開発から5人チームでの運用に移行するにあたり、ローカルステートで起きる問題を解消する最も適切な対応はどれですか?

  1. A. terraform.tfstateをGitリポジトリにコミットして共有する
  2. B. S3などのリモートバックエンドを設定し、ステートを共有かつロック可能な場所に置く
  3. C. 各メンバーが自分のワークスペースを作り、それぞれローカルにステートを持つ
  4. D. applyを実行できる担当者を1人に限定する
答えと解説を見る

正解:B

A 機密値が平文で入るうえ、同時編集でコンフリクトやロックの欠如による破損を招く。明確なアンチパターン

B(正解) 正解。共有・排他制御・暗号化・バージョニングをまとめて満たせる

C ワークスペースは環境の分離のための機能。同じ環境を複数人で扱う課題は解決せず、むしろ別々の実環境ができてしまう

D 運用上の緩和策にはなるが、その担当者のPCにステートが依存する単一障害点は残る

バックエンド/ロック

Q28. ステートのロックについての説明として正しいものはどれですか?

  1. A. すべてのバックエンドがロックに対応している
  2. B. ロックは読み取り専用の操作を含むすべてのコマンドで常に取得される
  3. C. ロックはTerraform CLIがローカルのメモリ上で管理する
  4. D. 対応バックエンドではステート書き込み時に自動でロックが取得され、同時実行によるステート破損を防ぐ
答えと解説を見る

正解:D

A 対応状況はバックエンドごとに異なる。ロックを提供しないものもある

B ステートを書き換えうる操作で取得される。ロックが不要な参照系の操作もある

C ローカルのメモリでは別のマシンからの同時実行を防げない。ロックはバックエンド側の共有資源で管理される

D(正解) 正解。S3バックエンドでは長らくDynamoDBテーブルの指定でロックを実現してきた。-lock=falseで無効化できるが原則として避ける

バックエンド/ロック

Q29. applyの実行中にCIジョブが強制終了し、以後すべての操作が「Error acquiring the state lock」で失敗するようになりました。最初に検討すべき対応はどれですか?

  1. A. 以後の全コマンドに -lock=falseを付けて回避する
  2. B. リモートのステートファイルを削除して作り直す
  3. C. 他に実行中の操作がないことを確認したうえで、terraform force-unlock <ロックID> を実行する
  4. D. terraform init -reconfigureでバックエンドを初期化し直す
答えと解説を見る

正解:C

A ロックを無効にしたまま運用すると、同時実行でステートを破壊しかねない。恒久的な回避策にしてはいけない

B 管理対象の追跡情報をすべて失う破壊的な操作。実リソースが全て管理外になる

C(正解) 正解。エラーメッセージに表示されたIDを指定して解除する。実行中の操作が本当にないことの確認が前提

D バックエンド設定の再構成であり、残置されたロックは解除されない

import/state操作/taint

Q30. リソースのラベルをaws_instance.webからaws_instance.apiにリネームしました。実リソースを再作成せずに済ませる方法はどれですか?

  1. A. terraform state mv aws_instance.web aws_instance.apiを実行する
  2. B. terraform state rm aws_instance.webを実行する
  3. C. terraform apply -replace=aws_instance.apiを実行する
  4. D. terraform state syncを実行する
答えと解説を見る

正解:A

A(正解) 正解。ステート上のアドレスだけを付け替えるため、実リソースには一切変更が入らない。1.1以降はmovedブロックでコードとして表現することもできる

B ステートから外れるだけで新アドレスには結び付かず、次のapplyで新しいインスタンスが作られてしまう

C -replaceは意図的に再作成させるオプション。避けたい結果をむしろ引き起こす

D架空 このサブコマンドは存在しない

import/state操作/taint

Q31. terraform state rm aws_s3_bucket.logsを実行した直後の状態として正しいものはどれですか?

  1. A. S3バケットが削除され、ステートからも消える
  2. B. S3バケットは残るが、Terraformの管理対象から外れる
  3. C. バケットが読み取り専用としてステートに残る
  4. D. 次回のapplyでステートに自動的に復帰する
答えと解説を見る

正解:B

A 実リソースは削除されない。削除まで行うのはdestroyやapplyによる破棄計画

B(正解) 正解。以後planには現れず、構成に定義が残っていれば新規作成の対象として扱われる点に注意

C 読み取り専用という状態は存在しない。エントリ自体が削除される

D 自動では戻らない。管理下に戻すにはimportが必要

import/state操作/taint

Q32. コンソールで手動作成済みのVPCをTerraformの管理下に置きたい場合の正しい手順はどれですか?

  1. A. 対応するresourceブロックを書いてapplyすれば、既存リソースが自動的に検出されて紐付く
  2. B. terraform state mvで既存VPCのIDをステートに追加する
  3. C. 対応するresourceブロックを用意したうえでterraform import aws_vpc.main vpc-0abc123を実行する
  4. D. terraform apply -refresh-onlyを実行する
答えと解説を見る

正解:C

A 自動検出はされない。同名でも新しいリソースを作ろうとするか、名前衝突でエラーになる

B state mvはステート内のアドレス移動用で、外部の既存リソースを取り込む機能はない

C(正解) 正解。importはステートに既存リソースを結び付けるだけなので、構成側の定義は自分で用意する必要がある。1.5以降はimportブロックと -generate-config-outで定義の生成も可能

D 既にステートにあるリソースの状態を更新するだけで、未管理のリソースは取り込まれない

import/state操作/taint

Q33. 設定は正しいのに起動スクリプトが失敗した特定のインスタンスを、次のapplyで作り直させたいときの現在の推奨方法はどれですか?

  1. A. terraform taint aws_instance.webを実行する
  2. B. terraform state rmしてからimportし直す
  3. C. resourceブロックにlifecycle { create_before_destroy = true } を追加する
  4. D. terraform apply -replace=aws_instance.webを実行する
答えと解説を見る

正解:D

A 同じ効果は得られるが非推奨(deprecated)。ステートを直接書き換える点も後継の方法に劣る

B 管理を外して戻すだけで、再作成にはならない

C 置き換えが起きるときの順序を変える設定であり、置き換え自体を起こす指示ではない

D(正解) 正解。置き換えを計画に含めたうえで通常どおり確認・適用できるため、taintより安全で見通しがよい

構成記述とモジュール

変数/出力/優先順位

Q34. 同じ変数instance_typeに対して、terraform.tfvarsの値、TF_VAR_instance_type環境変数、コマンドラインの -varの3つが同時に与えられました。採用されるのはどれですか?

  1. A. TF_VAR_ 環境変数の値
  2. B. terraform.tfvarsの値
  3. C. -varで渡した値
  4. D. エラーになり、重複を解消するまで実行できない
答えと解説を見る

正解:C

A 環境変数はデフォルト値を除けば最も優先度が低い。「環境変数が最優先」という思い込みが典型的なひっかけ

B 環境変数よりは優先されるが、コマンドラインの指定には負ける

C(正解) 正解。優先順位は高いほうから -var / -var-file、*.auto.tfvars、terraform.tfvars、TF_VAR_ 環境変数、variableブロックのdefaultの順

D 重複してもエラーにはならず、優先順位に従って1つが採用される

変数/出力/優先順位

Q35. variable "db_user" を環境変数から与えたい場合、正しい環境変数名はどれですか?

  1. A. TERRAFORM_db_user
  2. B. TF_VAR_db_user
  3. C. TF_VAR_DB_USER
  4. D. TF_db_user
答えと解説を見る

正解:B

A 接頭辞が誤り。TERRAFORM_ という接頭辞は使われない

B(正解) 正解。TF_VAR_ に続けて変数名をそのまま(大文字小文字を含めて一致させて)書く

C 変数名は大文字小文字が区別されるため、db_userという宣言にはこの名前は対応しない

D TF_ で始まる環境変数はCLIの動作設定用(TF_LOGなど)で、入力変数の受け渡しにはTF_VAR_ を使う

変数/出力/優先順位

Q36. ファイル名を指定しなくてもTerraformが自動的に読み込む変数定義ファイルはどれですか?

  1. A. variables.tf
  2. B. prod.tfvars
  3. C. terraform.tfvars.example
  4. D. terraform.tfvarsと *.auto.tfvars
答えと解説を見る

正解:D

A 変数の宣言(variableブロック)を書く慣習的なファイル名で、値を与えるファイルではない

B 自動では読み込まれない。-var-file=prod.tfvarsと明示的に指定する必要がある

C 拡張子が .tfvarsで終わらないため対象外。雛形を配布するための慣習的なファイル

D(正解) 正解。terraform.tfvars(および .json版)と、任意の名前に .auto.tfvarsを付けたファイルが自動的に読み込まれる

変数/出力/優先順位

Q37. environment変数にdev / stg / prod以外の値が渡されたら、planの段階で分かりやすいエラーを出したい。適切な方法はどれですか?

  1. A. variableブロック内にvalidationブロックを書き、conditionとerror_messageを定義する
  2. B. variableブロックにnullable = falseを書く
  3. C. type = stringの代わりにtype = enum(dev, stg, prod)と書く
  4. D. lifecycleブロックのpreconditionで検査する
答えと解説を見る

正解:A

A(正解) 正解。条件を満たさない値が与えられると、指定したメッセージとともに早い段階で失敗する

B nullを許さないという指定であり、値の中身が3つのいずれかかどうかは検査できない

C Terraformの型システムにenum型はない

D preconditionはlifecycleブロック内でリソースやデータソースに対して書くもの。入力変数そのものの検査にはvalidationが適切

式/関数/メタ引数

Q38. count = 3を指定したresourceブロックの中で、0から始まる連番を参照するために使う式はどれですか?

  1. A. each.key
  2. B. count.index
  3. C. self.index
  4. D. index.count
答えと解説を見る

正解:B

A eachはfor_eachを使ったときに利用できるオブジェクト。countでは参照できない

B(正解) 正解。0, 1, 2と採番され、name = "web-${count.index}" のように使う

C selfはプロビジョナー内で自身の属性を参照する特殊な語で、繰り返しの添字は持たない

D 語順が逆で、このような参照は存在しない

式/関数/メタ引数

Q39. for_eachメタ引数について正しい説明はどれですか?

  1. A. 任意の型のリストを直接渡すことができる
  2. B. 同じブロックにcountと併用できる
  3. C. マップまたは文字列のセットを受け取り、各要素をeach.key / each.valueで参照できる
  4. D. 作成されるインスタンスは0から始まる整数の添字で識別される
答えと解説を見る

正解:C

A 受け付けるのはマップか文字列のセット。リストを使う場合はtoset()などで変換する必要がある

B countとfor_eachは同一ブロックで同時に指定できない

C(正解) 正解。セットを渡した場合はeach.keyとeach.valueが同じ値になる

D 整数の添字で識別されるのはcountのほう。for_eachはキーの文字列で識別される

式/関数/メタ引数

Q40. count = length(var.names)でリソースを作っているとき、var.namesの途中の要素を1つ削除するとどうなりますか?

  1. A. 削除した要素に対応するリソースだけが破棄される
  2. B. 何も起こらず、次のapplyでリストの変更が無視される
  3. C. リソース全体がエラーになり、applyできなくなる
  4. D. 以降の要素の添字がずれるため、削除した位置より後ろのリソースが置き換えられる
答えと解説を見る

正解:D

A そうなるのはfor_eachを使った場合。countでは添字が繰り上がるため影響が波及する

B countの値が変わるため必ず差分が生じる

C エラーにはならず、計画は成立してしまう。だからこそ意図しない再作成に気付きにくい

D(正解) 正解。この副作用を避けるには、要素を安定したキーで識別できるfor_eachを使う

式/関数/メタ引数

Q41. セキュリティグループのingressのような繰り返しのネストブロックを、変数のリストから動的に生成したい場合に使う構文はどれですか?

  1. A. dynamicブロック
  2. B. resourceブロックのcount
  3. C. localsでルールのリストを組み立て、ingressに代入する
  4. D. for式でネストブロックを生成する
答えと解説を見る

正解:A

A(正解) 正解。dynamic "ingress" { for_each = var.rules content { ... } } のように書く。contentの中では、既定でブロックのラベルと同じ名前の変数(この例ではingress.value)で各要素を参照する

B countが増やすのはリソース自体であって、リソース内部のネストブロックではない

C ingressはネストブロックなので、繰り返しの数を変数で決めたいならdynamicが要る。属性のように値を代入する書き方はプロバイダの実装に依存するうえ、省略可能な引数も書き切る必要があり推奨されない

D for式が作れるのはリストやマップなどの値であり、ブロック構造そのものは生成できない

式/関数/メタ引数

Q42. depends_onを使うべき場面として最も適切なものはどれですか?

  1. A. リソースAの属性をリソースBの引数で参照している場合
  2. B. リソースの作成順序を毎回明示して、実行を直列化したい場合
  3. C. 構成上は参照がないが、実際には先に作られていないと動作しない暗黙の依存がある場合
  4. D. モジュール内のリソース同士の依存を定義する場合
答えと解説を見る

正解:C

A 参照があれば依存関係は自動的に推論される。この場合にdepends_onを書くのは冗長

B 不要な直列化は並列実行の利点を損なう。depends_onは必要な箇所に限って使う

C(正解) 正解。IAMポリシーの反映待ちなど、参照関係として表現できない依存を明示するための最終手段

D モジュール内でも参照から自動推論される。depends_onはモジュール呼び出しにも書けるが、それも暗黙依存があるときの手段

式/関数/メタ引数

Q43. 本番データベースが誤ったapplyで削除されないよう、破棄を伴う計画自体を失敗させたい。lifecycleブロックに書く引数はどれですか?

  1. A. ignore_changes = all
  2. B. prevent_destroy = true
  3. C. prevent_update = true
  4. D. create_before_destroy = true
答えと解説を見る

正解:B

A 指定した属性の差分を無視するだけで、破棄は止められない

B(正解) 正解。そのリソースを破棄する計画が作られた時点でエラーになる。恒久的に消せなくなるわけではなく、引数を外せば破棄できる

C架空 このような引数は存在しない

D 置き換え時に新しいリソースを先に作る順序制御。破棄そのものは防げない

式/関数/メタ引数

Q44. マップ型の値から指定キーを取り出し、キーが存在しない場合は既定値を返す組み込み関数はどれですか?

  1. A. element
  2. B. coalesce
  3. C. getordefault
  4. D. lookup
答えと解説を見る

正解:D

A リストから指定した位置の要素を取り出す関数で、マップのキー参照には使えない

B 引数の中から最初のnullでも空でもない値を返す関数。キーの有無を扱うものではない

C架空 このような組み込み関数は存在しない

D(正解) 正解。lookup(var.tags, "env", "dev")のように第3引数で既定値を指定できる

機密値の扱い

Q45. sensitive = trueを指定したoutputの値を、apply後に後続のスクリプトから取り出したい。正しい方法はどれですか?

  1. A. sensitiveを指定したoutputはTerraformからは取り出せないため、クラウドのコンソールで値を確認するしかない
  2. B. terraform output -raw <出力名> またはterraform output -jsonで取り出す
  3. C. いったんsensitive = falseに書き換えてapplyをやり直す必要がある
  4. D. terraform output -sensitiveを付けると伏せ字が解除される
答えと解説を見る

正解:B

A 取り出せないわけではない。sensitiveが抑えているのは通常の表示への露出であって、値の取得そのものではない

B(正解) 正解。-rawや -jsonを指定した場合は機密値も平文で出力されると公式に明記されている。出力先の取り扱いには注意が要る

C 書き換えは不要。指定したままでも明示的に値を求めるコマンドでは取得できる

D架空 このオプションは存在しない。伏せずに取り出すには -rawか -jsonを使う

HCP Terraform

HCP Terraform/ワークスペース

Q46. HCP Terraformのリモート実行(remote operations)を使う利点として、最も適切なものはどれですか?

  1. A. ステートファイルが不要になる
  2. B. 実行環境がないためplanが高速化される
  3. C. 各開発者のローカルPCにクラウドの資格情報を配布する必要がある
  4. D. plan/applyが一貫した管理環境で実行され、実行ログ・承認・資格情報の管理を一元化できる
答えと解説を見る

正解:D

A ステートは引き続き必要で、HCP Terraformが保管とバージョン管理を担う

B リモート側に実行環境がある。速度ではなく一貫性と統制が主な価値

C むしろ逆で、資格情報をワークスペース側に集約でき、個人PCへの配布を避けられる

D(正解) 正解。個人の端末環境の差異に左右されず、誰が何を適用したかの記録も残る

HCP Terraform/ワークスペース

Q47. HCP Terraformのワークスペースと、CLIのワークスペース(terraform workspace)の違いとして正しいものはどれですか?

  1. A. HCP Terraformのワークスペースは、ステートに加えて変数・実行履歴・権限設定などを持つ管理単位である
  2. B. どちらも同じ機能で、名前が違うだけである
  3. C. HCP Terraformのワークスペースはステートを保持しない
  4. D. CLIのワークスペースは変数値もワークスペースごとに保持する
答えと解説を見る

正解:A

A(正解) 正解。CLIのワークスペースが同一バックエンド内でステートを分けるだけなのに対し、HCP側はより広い設定の入れ物になっている

B 含むものが大きく異なる。この取り違えは頻出

C ステートの保管はHCP Terraformの中心的な機能のひとつ

D CLIのワークスペースが分けるのはステート。変数の切り替えは -var-fileなどで別途行う

HCP Terraform/ワークスペース

Q48. 「タグのない本番リソースの作成を組織全体で禁止する」といった規約を、実行のたびに自動で強制したい。HCP Terraformで使う仕組みはどれですか?

  1. A. Terraform Guardrail
  2. B. terraform validateをCIで実行する
  3. C. Sentinelなどのポリシー・アズ・コードによるポリシーチェック
  4. D. lifecycleのprevent_destroy
答えと解説を見る

正解:C

A架空 このような機能名は存在しない

B 検査できるのは構成の内部整合性まで。計画の中身に対する組織的な規約の強制はできない

C(正解) 正解。planとapplyの間で評価され、advisory / soft-mandatory / hard-mandatoryの強制レベルを設定できる

D 個々のリソースの破棄を防ぐだけで、組織横断の規約の強制には使えない

HCP Terraform/ワークスペース

Q49. 社内で標準化したネットワーク構成モジュールを、外部に公開せず社内の各チームからversion指定で利用できるようにしたい。適した機能はどれですか?

  1. A. パブリックのTerraform Registryに公開する
  2. B. HCP Terraformのプライベートレジストリに公開する
  3. C. モジュールを各チームのリポジトリにコピーして配布する
  4. D. ステートファイルを共有してモジュールを参照させる
答えと解説を見る

正解:B

A 誰でも参照できてしまうため、社内限定という要件を満たさない

B(正解) 正解。組織内に限定して発行でき、moduleブロックのsourceとversionで通常のレジストリモジュールと同じように利用できる

C 複製が増えるほど更新の追随が困難になる。バージョン管理された単一の配布元を持つのが狙い

D ステートの共有はモジュールの配布手段ではない。他構成の出力を読むterraform_remote_stateとも別の話

HCP Terraform/ワークスペース

Q50. HCP TerraformのワークスペースをGitリポジトリに接続した場合、プルリクエストを作成した時点で行われる処理はどれですか?

  1. A. 変更が自動的にapplyされ、本番環境に反映される
  2. B. 何も起こらず、マージされるまで待機する
  3. C. 投機的プラン(speculative plan)が実行され、結果がPR上で確認できる
  4. D. ステートがロックされ、他のメンバーがplanを実行できなくなる
答えと解説を見る

正解:C

A PRの時点では適用されない。applyはマージ後の実行で、しかも承認設定に従う

B PR時にフィードバックを返せることがVCS連携の主な価値なので、何も起きないというのは誤り

C(正解) 正解。適用はされない使い捨ての計画で、レビュー時点で変更内容を把握できる

D 投機的プランは適用を伴わないため、ステートをロックしない

続きは演習アプリで

このページの50問は、演習アプリなら弱点に合わせた出題・成績記録つきで解けます。全210問と本番形式の模擬試験は期間パス(1,500円/30日、自動更新なし)で利用できます。

Terraformの演習を無料で始める →

Terraform問題集の詳細(出題範囲・よくある質問)→

掲載している問題はすべてトキヌクのオリジナル問題です。実試験問題の流出コピー(ブレインダンプ)は一切使用していません。本サービスは非公式の学習教材であり、各認定団体とは提携・承認・後援関係にありません。試験名は各団体の商標または登録商標です。
トキヌク トップページへ