Difference between revisions of "AWS CLI"

From Michael's Information Zone
Jump to navigation Jump to search
(Created page with "==Purpose== To manage AWS resources remotely with scripts. <br> <br> Initial use case is to create and manage snapshots of EC2 instances. I want to create new snapshots then d...")
 
Line 25: Line 25:
 
                         "Code": 80,  
 
                         "Code": 80,  
 
                         "Name": "stopped"
 
                         "Name": "stopped"
 +
...
 +
                    "InstanceId": "i-xxxxxxxxxxad6183c",
 
...
 
...
  
Line 34: Line 36:
 
                     ],  
 
                     ],  
 
</pre>
 
</pre>
Since the information I need is nested, I will need to drill down.<ref>https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-filter</ref>
+
Since the information I need is nested, I will need to drill down.<ref>https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-filter</ref> Starting with Reservations, then Instances, I can then select the information I need.
 +
<br>
 +
NOTE: This is case sensitive
 +
<br>
 +
<pre>
 +
[root@aws-cli ~]# aws ec2 describe-instances --query 'Reservations[].Instances[].{Instance_name:Tags[?Key==`Name`].Value,ID:InstanceId,State:State.Name}'
 +
[
 +
    {
 +
        "Instance_name": [
 +
            "My-VM"
 +
        ],
 +
        "State": "stopped",
 +
        "ID": "i-xxxxxxxxxxad6183c"
 +
    },
 +
</pre>
 +
To break this down:
 +
*"Reservations[]" This will query ALL reservations.
 +
*"Instances[]" This will query ALL instances
 +
*"{}" This is creating an array, since we want multiple values found inside of Instances.
 +
*"Instance_name" is an arbitrary name, you can put anything you want here without spaces. There might be a way to use spaces, but you shouldn't use them anyway.
 +
*":Tags[?Key==`Name`].Value" I do not fully understand this as of yet.<ref>https://github.com/aws/aws-cli/issues/621</ref> However I needed it to parse the human readable name I gave the instance.
 +
*"ID" is an arbitrary name.
 +
*":InstanceId" will pull the instance ID.
 +
*"State" is an arbitrary name.
 +
*":State.Name" will pull the human readable state of the instance. In this case "Stopped".

Revision as of 08:29, 2 May 2018

Purpose

To manage AWS resources remotely with scripts.

Initial use case is to create and manage snapshots of EC2 instances. I want to create new snapshots then delete old ones. This could be managed internally with AWS, but it looks like that would cost more and I don't mind learning something new.

Listing EC2 Instances

I need to list the instances and parse that list so I know what I am working with. Though not needed for creating snapshots, this was helpful in learning how aws-cli functions. I started with a serverfault post[1] and broke down the steps contained within. The example provided was

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

But the query statement didn't make much sense to me. At this point I started to replicate this in my lab. The key here is that you want to look at the output of the standard describe-instances command

{
    "Reservations": [
        {
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    }, 
                    "PublicDnsName": "ec2-xxx-xxx-xxx-xxx.us-east-2.compute.amazonaws.com", 
                    "StateReason": {
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown", 
                        "Code": "Client.UserInitiatedShutdown"
                    }, 
                    "State": {
                        "Code": 80, 
                        "Name": "stopped"
...
                    "InstanceId": "i-xxxxxxxxxxad6183c",
...

                    "Tags": [
                        {
                            "Value": "My-VM", 
                            "Key": "Name"
                        }
                    ], 

Since the information I need is nested, I will need to drill down.[2] Starting with Reservations, then Instances, I can then select the information I need.
NOTE: This is case sensitive

[root@aws-cli ~]# aws ec2 describe-instances --query 'Reservations[].Instances[].{Instance_name:Tags[?Key==`Name`].Value,ID:InstanceId,State:State.Name}'
[
    {
        "Instance_name": [
            "My-VM"
        ], 
        "State": "stopped", 
        "ID": "i-xxxxxxxxxxad6183c"
    }, 

To break this down:

  • "Reservations[]" This will query ALL reservations.
  • "Instances[]" This will query ALL instances
  • "{}" This is creating an array, since we want multiple values found inside of Instances.
  • "Instance_name" is an arbitrary name, you can put anything you want here without spaces. There might be a way to use spaces, but you shouldn't use them anyway.
  • ":Tags[?Key==`Name`].Value" I do not fully understand this as of yet.[3] However I needed it to parse the human readable name I gave the instance.
  • "ID" is an arbitrary name.
  • ":InstanceId" will pull the instance ID.
  • "State" is an arbitrary name.
  • ":State.Name" will pull the human readable state of the instance. In this case "Stopped".
  • https://serverfault.com/questions/578921/how-would-you-go-about-listing-instances-using-aws-cli-in-certain-vpc-with-the-t
  • https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html#controlling-output-filter
  • https://github.com/aws/aws-cli/issues/621