CodeBuildにおける下記エラーの原因と対処法を整理します。
YAML_FILE_ERROR Message: Expected Commands[0] to be of string type: found subkeys instead at line 6, value of the key tag on line 5 might be empty
はじめに
こんにちは、@bioerrorlogです。
CodeBuildはAWS上で手軽にPipelineのジョブを実行するのに便利なサービスですね。
先日、CodeBuildで下記のエラーに遭遇しました:
YAML_FILE_ERROR Message: Expected Commands[0] to be of string type: found subkeys instead at line 6, value of the key tag on line 5 might be empty
今回はこのエラーの原因と解決策を整理します。
原因は"コロン+スペース"
"コロン+スペース" :
がコマンドに含まれていませんか?
例えば、下記のミニマルなbuildspecでこのエラーを再現することが出来ます。
version: 0.2 phases: build: commands: - echo "Hello: world"
結果:
Phase context status code: YAML_FILE_ERROR Message: Expected Commands[0] to be of string type: found subkeys instead at line 6, value of the key tag on line 5 might be empty
echo "Hello: world"
に含まれる"コロン+スペース"によって、yamlの解釈に問題が生じた (subkeyとして解釈された) のがエラーの原因です。
解決策
コマンドをクオーテーションで囲う
一つ目の解決策は、コマンド全体をクオーテーションで囲うことです。
このやり方はドキュメントにも記載されています。
If a command contains a character, or a string of characters, that is not supported by YAML, you must enclose the command in quotation marks ("").
たとえば先の不正なbuildspecは、下記のように変更することでエラーを解消できます。
version: 0.2 phases: build: commands: - "echo Hello: world"
結果:
Running command echo Hello: world Hello: world
"コロン+スペース"を使わない
もちろん、もしエラーの原因である"コロン+スペース"を使わないことが可能なら、単純に使わなければよいという話でもあります。
先述のクオーテーションで囲うやり方はコードの読み手を少し戸惑わせるかもしれないので、できればこちらでシンプルに対処したいところです。
コロンのみ、またはスペースのみ、であれば問題ありません。
※ コロンのみ
version: 0.2 phases: build: commands: - echo "Hello:world"
結果:
Running command echo "Hello:world" Hello:world
※ スペースのみ
version: 0.2 phases: build: commands: - echo "Hello world"
結果:
Running command echo "Hello world" Hello world
おわりに
以上、CodeBuildエラーの原因と対処法を整理しました。
yamlはjsonに比べ人間に優しいフォーマットですが、落とし穴には十分注意していきたいところです。
[関連記事]
参考
Build specification reference for CodeBuild - AWS CodeBuild
YAML syntax error when string contains a colon + space · Issue #2769 · ansible/ansible · GitHub