49638


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

[code]

    {
      "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"
                  }
                }
              ]
            }
          }
        }
      ]
    }
    
[/code]

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

[code]

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

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

[code]

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

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


CC BY-SA 4.0
2018-10-24T23:51:33.393
49629
2018-10-25T04:06:16.260
2018-10-25T00:44:15.793
3060
30677
question
aws json jq
jqでCloudTrailのJSON形式ログからCSV形式で抽出する方法


例えば下記は如何でしょうか。

[code]

    jq --raw-output ".Records[] | . as $r | $r.responseElements.instancesSet.items[] | . as $i | [$r.eventTime, $r.eventName] + [$i.instanceId, $i.currentState.code] | @csv"
    
[/code]

テスト動作はこちらでご確認頂けます。 [jqplay.org](https://jqplay.org/s/KWnXPuLjTe)

### 注意点:

  * jqplayではシングルコーテーションを使用していますが、windowsのdocプロンプトで実行されているようですので、ダブルコーテーションを使用してください。

### 参考:

  * [jq Manual](https://stedolan.github.io/jq/manual/)


CC BY-SA 4.0
2018-10-25T02:29:36.807
49636
2018-10-25T02:29:36.807
19460
49629
answer


map を使ってみました。

[code]

    $ 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
    
[/code]


CC BY-SA 4.0
2018-10-25T04:06:16.260
49638
2018-10-25T04:06:16.260
49629
answer