BioErrorLog Tech Blog

試行錯誤の記録

エラー対処: YAML_FILE_ERROR Message: Expected Commands[0] to be of string type | CodeBuild

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に比べ人間に優しいフォーマットですが、落とし穴には十分注意していきたいところです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

Build specification reference for CodeBuild - AWS CodeBuild

amazon web services - YAML_FILE_ERROR Message: Expected Commands[0] to be of string type: - Stack Overflow

YAML syntax error when string contains a colon + space · Issue #2769 · ansible/ansible · GitHub