問題
for_each
でstring型をキーとするリソースを作成しました。terraform state rm
でsteteファイルからリソースを削除しようとしたところ、エラーが出て削除ができませんでした。
main.tf
resource "random_pet" "main" {
for_each = toset(["a", "b", "c"])
}
❯ terraform state list
random_pet.main["a"]
random_pet.main["b"]
random_pet.main["c"]
❯ terraform state rm random_pet.main["c"]
╷
│ Error: Index value required
│
│ on line 1:
│ (source code not available)
│
│ Index brackets must contain either a literal number or a literal string.
原因
ダブルクォーテーションをエスケープしていないからです。
このエラーの原因は、コマンドライン引数の解釈にあります。Terraformは、リソース名に含まれるダブルクォーテーション("
)をコマンドの一部として誤って解釈してしまいます。これは、シェルの引数解析メカニズムとTerraformの期待する入力形式の不一致から生じる問題です。
解決方法
Linux, macOSの場合、リソース名をシングルクォーテーション('
)で囲ってください。
これにより、シェルがダブルクォーテーションを特別な文字として解釈することを防ぎ、Terraformに正しい形式でリソース名を渡すことができます。
正しいコマンド形式は以下の通りです:
❯ terraform state rm 'random_pet.main["c"]'
Removed random_pet.main["c"]
Successfully removed 1 resource instance(s).
まとめ
Terraformの terraform state rm
コマンドを使用するときは、リソース名の正しい指定が重要です。特に、ダブルクォーテーションを含むリソース名を扱う場合は、シングルクォーテーションでコマンド全体を囲むことで、意図した通りの操作を実現できます。
確認をした環境
- Terraform v1.9.2
参考