Linux
AWS
Jenkins
aws-cli

headコマンド使ったら"[Errno 32] Broken pipe"がでた件

発生したこと

aws-cliでフィルタリングかけて、AMI-ID情報持ってきて変数にいれようとしたら

■実行コマンド

AMI_ID=`aws ec2 describe-instances --region ${REGION}\
        --filter "availability-zone == ${AZ}" \
                 "Name=tag-key,Values=Resource" "Name=tag-value,Values=${TAG_RESOURCE}"\
        --query "Reservations[].Instances[].ImageId" \
        --output text | head -n 1`

■結果

******** #出力結果

[Errno 32] Broken pipe

とでてしまい、[Errno 32] Broken pipeがでてしまっていた。

最初以下を読んでも何のことか分からず、結構はまってしまった

Broken pipe
データを読み取るプロセスのないパイプへの書込みです。通常この状態が発生すると信号が生成され、その信号が無視されると、エラーが返されます。
引用元:http://software.fujitsu.com/jp/manual/manualfiles/M090098/J2X14260/06Z201/pclmsab/pclms130.html

正しい値は取れているが、ログを出力していたので見た目的によろしくない。

原因

コマンドにより標準出力にすごい長い結果がでてしまい、それをパイプラインを使ってheadで受け取っていたのがよくなかった。

5/21追記
broken pipeは、「読み込むプロセスがいない(headが終了した)にも関わらず書き込もうとした」ことが
原因とコメントでいただいた。

今回の場合だと出力が多く、書き込みが分割されると後にまわされた出力を読み込むプロセスがなくなり
broken pipeがでている可能性が考えられる。

angel_p_57さん、コメントにてご教示いただきありがとうございます。

解決

実行コマンドの最後の一文を以下のように変更し、出力されないようにした。

--output text 2>/dev/null | head -n 1`

どれくらい長いものだとだめなのかは結局分からずだけど・・・。
PIPE_BUF(デフォルト4096byte)の数値によるとコメントでいただきました