Issue
I have 2 API calls, the second uses AMI-ID from the first
aws ec2 describe-instances \
--query "Reservations[*].{ \
OWNERID:OwnerId, \
IP:Instances[0].PublicIpAddress, \
ImageID:Instances[0].ImageId, \
AZ:Instances[0].Placement.AvailabilityZone, \
STATE:Instances[0].State.Name, \
KEY:Instances[0].KeyName, \
VPC:Instances[0].VpcId, \
ID:Instances[0].InstanceId, \
INSTANCETYPE:Instances[0].InstanceType \
}" --output text
and
aws ec2 describe-images \
--image-ids ami-xxx\
--query "Images[*].{ImageName:Name, AWSDescription:Description}" \
--output text
I am trying to have individual instances with the image name and description from their respective images on the same lines, for a single table with all the columns from both calls.
Is it possible to do it in the same command (i strongly doubt it)? If not, how would I go about in a shell script? Do I have to grep the AMI-ID from the first call and use it? But that first call returns a whole table, how can i then "append" the extra columns next to the first ones and not under?
Solution
JSON output and JQ is one method for manipulating awscli data
The following approach selects fields from both awscli calls and combines them into a CSV file. For larger tasks, use JQ to merge the JSON outputs and the @csv
filter.
echo "InstanceId,InstanceName,ImageId,ImageName,ImageDescription" > ec2-instances.csv
instances_data=$(echo $instances | jq -r '.Reservations[].Instances[] | [.InstanceId, (.Tags[] | select(.Key=="Name") | .Value), .ImageId] | join(",")')
for instance in $instances_data
do
image_id=$(echo $instance | cut -f3 -d',')
image_data=$(aws ec2 describe-images --image-ids $image_id | jq -r '.Images[] | [.Name, .Description] | join(",")')
echo "${instance},${image_data}" >> ec2-instances.csv
done
ec2-instances.csv:
InstanceId,InstanceName,ImageId,ImageName,ImageDescription
i-abc123,nat-instance,ami-e7ee9edd,amzn-ami-vpc-nat-hvm-2015.03.0.x86_64-gp2,Amazon Linux AMI VPC NAT x86_64 HVM GP2
Answered By - naaman Answer Checked By - Marilyn (WPSolving Volunteer)