2017-04-19 3 views
0

ich an einem Skript arbeite auf meine AWS-Sicherheitsgruppen und Instanzen zu verbinden, damit ich eine konsolidierte Liste haben kann, die etwa wie folgt aussieht, in Excel/CSV-Format:Konvertieren von AWS JSON Ausgabe in CSV mit jq

Security Groups | Security Group Name | Instances | Rules | Source 
SG1    | GroupName   | Instance1 | :80 | 0.0.0.0\0 
       |      | Instance2 | :443 | 0.0.0.0\0 

Bitte beachten Sie, ich bin sehr neu zu jq, und habe wirklich nur im Dunkeln gefummelt.

Ich verwende eine Reihe von API-Aufrufen und jq, um meine Daten zu formatieren, aber meine letzte Zeichenfolge ist als flache JSON formatiert.

Mein Skript:

#!/bin/bash 

### Get ALL data for all Instances 
all_instances=$(aws ec2 describe-instances \ 
--query 'Reservations[].Instances[]' \ 
--profile dev) 

### Get Only the Instance ID's 
instanceids=$(aws ec2 describe-instances \ 
--query 'Reservations[].Instances[].InstanceId' \ 
--output text \ 
--profile dev) 

### Get all data from Security Groups 
all_securitygroups="$(aws ec2 describe-security-groups --profile dev)" 

### Match the Instances to the SG's, and pull the IP Rules as well 
for instance in $instanceids; do 
instance_sgids=$(echo $all_instances|jq -r "map(select(.InstanceId == \"$instance\"))[].SecurityGroups[].GroupId") 
    for sg in $instance_sgids; do 
    rules=$(echo $all_securitygroups|jq -r "map(select(.[].GroupId == \"$sg\"))[]") 

### Convert that silly Json to beautiful csv... 
newrules=$(echo $rules|jq --compact-output --raw-output '{SGID: .[].GroupId, Description: .[].Description,Protocol: .[].IpPermissions[].IpProtocol, Port: .[].IpPermissions[].FromPort, CIDR: .[].IpPermissions[].IpRanges[].CidrIp} | flatten | @csv') 

#flattenrules=$(echo $rules|jq -r [{ .Description } + (IpPermissions[] | { FromPort } + (IpRanges[] | {CidrIp}))]) 

echo "SecurityGroup, Name, Port, Source" > ~/Documents/output.csv 
echo "$newrules" | sort | uniq >> ~/Documents/output.csv 

    done 
done 

Dies wird mir ach so nah, aber ich kann einfach nicht scheinen, um die letzte Etappe, um herauszufinden. Ich habe die Instanz-IDs, und jetzt habe ich alle SG-Informationen. Mein Problem jetzt einen Weg zu finden, es im oben beschriebenen Format auszugeben ...

Ich weiß, ich vermisse wahrscheinlich etwas einfaches, aber würde mich freuen, wenn jemand von euch jq/shell guru's mir in die richtige Richtung zeigen könnte. Ich habe hier andere Fragen gesehen, die erwähnen, Perl und andere Sprachen zu verwenden, aber ich würde das wirklich gerne in jq/shell behalten.

Vielen Dank im Voraus!

+0

Die gute Nachricht ist, dass dies alles mit jq getan werden kann. In der Tat bezweifle ich, dass Sie sogar die Shell verwenden müssen, um die innere "for" -Schleife auszuführen; Sie brauchen vielleicht nicht einmal die "Shell" für die äußere "for" -Schleife. Wenn Sie uns etwas mehr über "$ all_instances" und "$ all_securitygroups" erzählen könnten, wäre es einfacher, Ihnen zu helfen. Siehe http://StackOverflow.com/Help/Mcve – peak

+0

Hallo Höhepunkt, danke für die Antwort. Also habe ich gestern mit jqplay.com einige Fortschritte gemacht und habe jetzt die Daten, die ich haben möchte. Meine letzte Hürde ist, die Daten so zu formatieren, wie ich oben in meiner Frage beschrieben habe. Ich weiß nicht, ob das Formatieren des JQ und das Verbinden über die Shell der Weg nach vorne ist oder was. Ich weiß, dass meine Frage ein wenig in Frage gestellt hat, aber ich versuche immer noch, das gleiche Ziel zu erreichen. Alle Eingänge sind willkommen !!! – user2253884

+0

Ohne Ihre Daten, kann ich nur eine sanfte Erinnerung daran, dass '@ csv' fruchtbar zu sein, müssen Sie veranlassen, dass seine Eingabe eine Reihe von Skalaren ist. Dies kann sehr einfach in jq erfolgen. Übrigens, wenn ich Sie wäre, würde ich versuchen, '@ tsv' zu verwenden, wenn überhaupt möglich anstelle von' @ csv'. – peak

Antwort

0

Es ist schwer, ohne einige aktuelle Daten viel zu tun, aber this answer zu a similar question erstellt einen Bericht aus der Ausgabe von

aws ec2 describe-security-groups --group-ids sg-0000001 sg-0000002 

Vielleicht kann es hilfreich sein.

Verwandte Themen