我有2个API调用,第二个使用AMI-ID从第一个
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
和
aws ec2 describe-images
--image-ids ami-xxx
--query "Images[*].{ImageName:Name, AWSDescription:Description}"
--output text
我试图有单独的实例与图像名称和描述从他们各自的图像在同一行,为一个表与所有的列从两个调用。
有可能在同一个命令中做到这一点吗(我强烈怀疑)?如果没有,我该如何使用shell脚本呢?我是否必须从第一次呼叫中获取AMI-ID并使用它?但是第一次调用返回的是一个完整的表,我怎么能"追加"呢?额外的列在第一列旁边而不是下面?
JSON输出,JQ是操纵awscli数据的一种方法
下面的方法从两个awscli调用中选择字段,并将它们组合到一个CSV文件中。对于较大的任务,使用JQ合并JSON输出和@csv
过滤器。
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