jqでCloudTrailのJSON形式ログからCSV形式で抽出する方法

投稿者: Anonymous

以下は、AWSのCloudTrailから取得したイベントログの抜粋です。

{
  "Records": [
    {
      "eventTime": "2018-01-01T01:11:11Z",
      "eventName": "StartInstances",
      "responseElements": {
        "requestId": "r-111",
        "instancesSet": {
          "items": [
            {
              "instanceId": "i-0XXX",
              "currentState": {
                "code": 0,
                "name": "pending"
              },
              "previousState": {
                "code": 80,
                "name": "stopped"
              }
            },
            {
              "instanceId": "i-0YYY",
              "currentState": {
                "code": 9,
                "name": "pending"
              },
              "previousState": {
                "code": 80,
                "name": "stopped"
              }
            }
          ]
        }
      }
    }
  ]
}

上記から、イベントが発生した日時とイベント名、インスタンスIDとcurrentStateのcodeをCSV形式で抽出する際、以下のような形式にしたいです。

eventTime, eventName, instanceId, code
2018-01-01T01:11:11Z, StartInstances, i-0XXX, 0
2018-01-01T01:11:11Z, StartInstances, i-0YYY, 9

ただし、responseElements.instancesSet.itemsの配下は1~N個の要素であり、インデックスを決めうちできないことがわかっています。

type event_history.json | jq-win64.exe -c -r ".Records[] | [.responseElements.instancesSet.items[] | (.instanceId,.currentState.code)] | @csv"

という方式だと、eventTime,eventNameが取得できないのと、
i-0XXX,0,i-0YYY,9
のようになってしまいます。
なにか方法はありますでしょうか?

解決

map を使ってみました。

$ jq --version
jq-1.5-1-a5b5cbe
$ cat event_history.json |
  jq -r '
    .Records | map(
      [.eventTime, .eventName] +
      (.responseElements.instancesSet.items[]|[.instanceId, .currentState.code])
    ) | .[] | @csv'

"2018-01-01T01:11:11Z","StartInstances","i-0XXX",0
"2018-01-01T01:11:11Z","StartInstances","i-0YYY",9
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *