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中。
在此先感謝!
好消息是,這可以使用jq完成。的確,我懷疑你甚至需要使用shell來執行內部的「for」循環;你可能甚至不需要用於外部「for」循環的「shell」。如果您可以告訴我們更多關於「$ all_instances」和「$ all_securitygroups」的信息,那麼幫助您會更容易。請參閱http://stackoverflow.com/help/mcve – peak
嗨,高峯,感謝您的迴應。所以我昨天使用jqplay.com取得了一些進展,並獲得了我現在需要的數據。我的最後一個障礙是獲得格式化數據,正如我在問題的頂部所描述的那樣。我不知道格式化JQ並通過shell以不同的方式加入它是前進的方向,或者是什麼。 我知道我的問題需要一點關鍵,但我仍然試圖完成相同的目標。 任何和所有的輸入值得讚賞! – user2253884
如果沒有你的數據,我只能提供一個溫和的提醒,要想成功地使用'@ csv',你必須安排它的輸入是一個標量數組。這可以很容易地在jq中完成。順便說一下,如果我是你,我會盡量使用'@ tsv'而不是'@ csv'。 – peak