BioErrorLog Tech Blog

試行錯誤の記録

エラー対処: "Missing key/value separator" | Terraform

Terraformのmapでkeyが数字から始まったり、スペースを含んだりするとエラーになる問題の備忘録です。

はじめに

こんにちは、@bioerrorlogです。

Terraformのmapを書いているときに、下記のようなエラーに遭遇しました。

╷
│ Error: Missing key/value separator
│ 
│   on main.tf line 3, in locals:
│    2:   map_example = {
│    3:     123key = "abcd"
│ 
│ Expected an equals sign ("=") to mark the beginning of the attribute value. If you intended to given an attribute name containing periods or spaces, write the name in quotes to create a string
│ literal.
╵

ここで起きたこととその対処法を備忘録としてまとめます。


※ 検証時のTerraformバージョン

$ terraform --version
Terraform v1.3.4
on linux_amd64

Terraformエラー対処: "Error: Missing key/value separator"

検証コードは下記に置いています: github.com

起きたこと

下記のようなmapのコードがエラーを引き起こしました。

locals {
  map_example = {
    123key = "abcd"
  }
}

## エラー発生
# ╷
# │ Error: Missing key/value separator
# │ 
# │   on main.tf line 3, in locals:
# │    2:   map_example = {
# │    3:     123key = "abcd"
# │ 
# │ Expected an equals sign ("=") to mark the beginning of the attribute value. If you intended to given an attribute name containing periods or spaces, write the name in quotes to create a string
# │ literal.
# ╵

原因

数字から始まる文字列をそのままkeyとしたことが原因です。

それによりエラーメッセージ: Error: Missing key/value separatorの通り、keyとvalueを分けるseparatorが適切に付与されていない(とTerraformのパーサーに解釈される)エラーが発生しています。

もともと上記のコードの意図ととしては、

  • key: 123key
  • value: "abcd"

と解釈されたいところですが、パーサーは123keyという文字列の中にkeyとvalueの両方を見出し、それらがseparatorで区切られてないよ!というエラーを出しています。

  • key: 123
  • value: key
  • -> エラー: separatorが存在ない

数字から始まる文字列はnumber型として解釈されるので、途中からstringが入ってくると別ブロックとして解釈される -> separatorが無いのでエラー、ということでしょう(ソースコード読んだ訳ではないので推測です)。

対処法

keyをクォート""で囲うことで解決できます。

locals {
  map_example = {
    "123key" = "abcd"
  }
}

クォートで囲うことで全体をstringブロックとして解釈させることができるので、ブロックが分離して解釈される問題を回避できます。

問題あるmap/問題ないmapまとめ

分かりにくいので、問題あるmap/問題ないmapをいくつかのパターンでまとめておきます。

# map key starting with numbers causes error
locals {
  map_example = {
    key_valid = "abcd" # OK
    123       = "abcd" # OK
    # 123key = "abcd" # Error: Missing key/value separator
    "123key" = "abcd" # OK
    key123   = "abcd" # OK

    # spaces cause same error
    # 123 key = "abcd" # Error: Missing key/value separator
    "123 key" = "abcd" # OK
  }
}

terraform-examples/map_key_separator_error.tf at main · bioerrorlog/terraform-examples · GitHub

"数字から始まる"以外にも、スペースを含む場合にも同じエラーが発生します。

おわりに

以上、TerraformのエラーError: Missing key/value separatorに関する問題をまとめました。

Terraformパーサーの気持ちになってコードを書いていきたいものです。

どなたかの参考になれば。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Variable key names that start with numbers cause error · Issue #6857 · hashicorp/terraform · GitHub

resource names starting with numbers cause error · Issue #19919 · hashicorp/terraform · GitHub