Search code examples
amazon-web-servicessusesles

I'm trying to get results returned from bash for each line returned to console from an aws cli call. Please advise


I'm trying to collect all the Instances in an AWS region (describe-instances) and then grep certain lines out of the specific AMI's (describe-images) for each instance found with the first command. I don't want to dump it to a file first.

for AMI in "aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}'";
do "aws ec2 describe-images --image-ids $AMI |grep '"Name"\|ProductCodeId\|ProductCodeType'";done 

What is wrong with my syntax? Thank you!

The Error: ec2-user@ip-172-31-20-000:~> ./Get-Instance-Meta.sh ./Get-Instance-Meta.sh: line 4: syntax error near unexpected token aws' ./Get-Instance-Meta.sh: line 4:aws ec2 describe-instances --region=us-west-2 |grep ImageId |grep -o -P 'ami.{0,18}';'

First command output expected:

ec2-user@ip-172-31-20-000:~> grep ImageId | aws ec2 describe-instances --region=us-west-2 |grep -o -P 'ami.{0,18}'
ami-02bf6f88fab67448b
ami-0d59109fccbbc4da2
ami-01a80cb1b7a431fb9
ami-0d86f04dd6dfc89df

Second command output expected:

ec2-user@ip-172-31-20-214:~> aws ec2 describe-images --image-ids ami-01a80cb1b7a431fb9 |grep '"Name"\|ProductCodeId\|ProductCodeType'
                    "ProductCodeId": "51luq5gebk3opt7gcvkdrrm89",
                    "ProductCodeType": "marketplace"
            "Name": "OpenSUSE_Leap15.1TaskcatPython3_",

I'm basically looking across all instances for ProductCodeID or ProductCodeType of 'null'


Solution

  • Alternative to your first command using --query:

    aws ec2 describe-instances \
        --region=us-east-1 \
        --query 'Reservations[*].Instances[*].ImageId' \
        --output text
    

    Then for the for loop:

    AMIs=$(aws ec2 describe-instances \
            --region=us-east-1 \
            --query 'Reservations[*].Instances[*].ImageId' \
            --output text)  
    
    for AMI in ${AMIs};    
    do 
       echo ${AMI}
    
       aws ec2 describe-images \
           --image-ids ${AMI} \
           --query 'Images[*].[Name, ProductCodeId, ProductCodeType]' \
           --output text
    
    done