質問: ### 前提・実現したいこと AWS S3上に保存されている ClowdTrail のログファイル(~.gz形式)をローカルに取り込み、 ログのイベント発生時間でソートしたファイルを作成するスクリプトをCronで毎時動かしています。 今までは、処理のに時間は掛っていましたがエラーは発生していなかったみたいなのですが、 最近以下のエラーメッセージが発生しているのが見つかりました。 ※メッセージはCronからメールで送られてきました。 エラーメッセージを検索してみたのですが、原因がわからなかったため、質問させていただきました。 OS:CentOS6.7 jq - commandline JSON processor [version 1.4] ### 発生している問題・エラーメッセージ jq: error: Cannot iterate over string jq: error: string and array cannot be sorted, as they are not both arrays jq: error: Cannot iterate over string jq: error: string and array cannot be sorted, as they are not both arrays ~以下同じ~ 現在、手動で実行、cronで実行してもメッセージは発生していません。 ### ソースコード スクリプトの中で、jqを使用しているのは、以下のコマンドなのですが、何が問題なのでしょうか。 ``` find /var/log/trail-log/ -name "*.json.gz" | sort | xargs gunzip -c | /usr/bin/jq '.[] | sort_by(.eventTime) | .[]' | /usr/bin/jq '{awsRegion, eventName, eventTime, userName: .userIdentity.userName, requestParameters}' | /usr/bin/jq '"[\(.eventTime)] \(.awsRegion) \(.userName) \(.eventName) \(.requestParameters)"' > trail.log ``` ### 補足情報(言語/FW/ツール等のバージョンなど) ※参考として、.gzを解凍したファイルの中身を記載致します。 {"Records":[{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:44Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{}]}}]}},"responseElements":null,"requestID":"xxxxxxxxxx-6e0f-434e-a5e7-xxxxxxxxxx","eventID":"xxxxxxxx-00c5-43a6-944a-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxxxx"},{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:49Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{"value":"i-xxxxxxxx"}]}}]}},"responseElements":null,"requestID":"xxxxxxxx-25ee-465c-9a1f-xxxxxxxx","eventID":"xxxxxxxx-0c36-49cb-924e-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxx"},{"eventVersion":"1.03","userIdentity":{"type":"IAMUser","principalId":"xxxxxxxxxx","arn":"arn:aws:iam::xxxxxxxxxx:user/xxxxxxxxxx-user","accountId":"xxxxxxxxxx","accessKeyId":"xxxxxxxxxx","userName":"xxxxxxxxxx-user"},"eventTime":"2016-02-23T13:22:47Z","eventSource":"ec2.amazonaws.com","eventName":"DescribeInstances","awsRegion":"ap-northeast-1","sourceIPAddress":"xxx.xxx.xxx.xxx","userAgent":"aws-cli/1.9.7 Python/2.6.6 Linux/2.6.32-573.7.1.el6.x86_64 botocore/1.3.7","requestParameters":{"instancesSet":{},"filterSet":{"items":[{"name":"instance-id","valueSet":{"items":[{"value":"?i-xxxxxxxx?"}]}}]}},"responseElements":null,"requestID":"xxxxxxxx-3163-4b2f-88c0-xxxxxxxx","eventID":"xxxxxxxx-53af-4e93-abe4-xxxxxxxx","eventType":"AwsApiCall","recipientAccountId":"xxxxxxxxxx"}]}
回答: "Cannot iterate over string"というメッセージはexecute.cの698行目、 "cannot be sorted, as they are not both arrays"というメッセージはbuiltin.cに2箇所にあります。 おそらく、「sort」処理の対象になっているフィールドにStringとArrayが混在していてソートに失敗しているのではないでしょうか。 おそらく不正データなので該当するデータを削除するか、補正してやればエラーは回避できると思います。