2017-04-19 45 views
0

我上的腳本工作,我的AWS安全組和實例相結合的轉換AWS JSON輸出到CSV,所以我可以有一個統一的列表看起來像這樣,在Excel/CSV格式:使用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 

請注意,我是jq的新手,真的只是在黑暗中摸索。

我使用一系列的API調用和jq來格式化我的數據,但我的最後一個字符串格式化爲扁平json。

我的腳本:

#!/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 

這讓我哦,這麼近,但我似乎無法弄清楚的最後一站了。我有實例ID,現在我擁有所有的SG信息。我現在的問題找到一種方式來輸出它的格式我上面描述...

我知道我可能錯過了一些簡單的東西,但會愛,如果任何你的jq/shell的大師的可以指向我在正確的方向。我在這裏看到了其他一些提到使用Perl和其他語言的問題,但我真的希望將它保留在jq/shell中。

在此先感謝!

+0

好消息是,這可以使用jq完成。的確,我懷疑你甚至需要使用shell來執行內部的「for」循環;你可能甚至不需要用於外部「for」循環的「shell」。如果您可以告訴我們更多關於「$ all_instances」和「$ all_securitygroups」的信息,那麼幫助您會更容易。請參閱http://stackoverflow.com/help/mcve – peak

+0

嗨,高峯,感謝您的迴應。所以我昨天使用jqplay.com取得了一些進展,並獲得了我現在需要的數據。我的最後一個障礙是獲得格式化數據,正如我在問題的頂部所描述的那樣。我不知道格式化JQ並通過shell以不同的方式加入它是前進的方向,或者是什麼。 我知道我的問題需要一點關鍵,但我仍然試圖完成相同的目標。 任何和所有的輸入值得讚賞! – user2253884

+0

如果沒有你的數據,我只能提供一個溫和的提醒,要想成功地使用'@ csv',你必須安排它的輸入是一個標量數組。這可以很容易地在jq中完成。順便說一下,如果我是你,我會盡量使用'@ tsv'而不是'@ csv'。 – peak

回答

0

很難做太多沒有一些實際的數據,但this answera similar question

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

輸出端產生一個報告也許會有所幫助。