使用JQ将AWS JSON输出转换为CSV



我正在使用脚本来组合我的AWS安全组和实例,因此我可以使用Excel/CSV格式的合并列表,看起来像这样:

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

请注意,我对JQ非常陌生,并且确实在黑暗中摸索。

我使用一系列API调用和JQ格式化我的数据,但是我的最后一个字符串格式为FlatJSON。

我的脚本:

#!/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信息。我的问题现在找到了一种以我上面描述的格式输出的方法...

我知道我可能缺少一些简单的东西,但是如果你们中的任何一个人都可以将我指向正确的方向,我会很喜欢。我在这里看到了使用Perl和其他语言提及的其他问题,但我真的很想将其保留在JQ/Shell中。

预先感谢!

没有某些实际数据很难做到很多

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

也许可能有帮助。

最新更新