Can I use the metadata API to check if an instance is being terminated?

Using Windows server 2016 instances.

I want the instance to run a local command before it terminates.

I can have a script run when windows is shutting down.

I would like the script to check if the instance itself is in the terminating state and if so run some clean up stuff.

Not sure from the docs, is there a way to check if the local instance is being terminated from the instance itself? https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#instancedata-data-categories

This returns InstanceStatuses:

aws ec2 describe-instance-status --include-all-instances --instance-ids i-123123123

Which looks like:

{
    "InstanceStatuses": [
        {
            "AvailabilityZone": "us-west-2a",
            "InstanceId": "i-123123123",
            "InstanceState": {
                "Code": 16,
                "Name": "running"
            },
            "InstanceStatus": {
                "Details": [
                    {
                        "Name": "reachability",
                        "Status": "passed"
                    }
                ],
                "Status": "ok"
            },
            "SystemStatus": {
                "Details": [
                    {
                        "Name": "reachability",
                        "Status": "passed"
                    }
                ],
                "Status": "ok"
            }
        }
    ]
}

What does the state looks like when the instance is "terminating"? Not already terminated but pending termination? How can I check if an instance is in the pending termination state?


What you're calling the terminating state AWS refers to as shutting-down.

You can use describe-instances and use --query or jq to parse out the information you want.

Example with --query:

aws ec2 describe-instances --instance-ids i-070ca5c669933b949 --query 'Reservations[].Instances[].State.Code

Will return the instance status code (details below):

[ 48 ]

Example with jq:

aws ec2 describe-instances --instance-ids i-070ca5c669933b949 |jq .Reservations[].Instances[].State.Code

Outputs:

48

You can also get the output in text:

aws ec2 describe-instances --instance-ids i-070ca5c669933b949 |jq .Reservations[].Instances[].State.Name

Will output:

"terminated"

Below is the pertinent Output from the command and the codes that correspond to instance state:

State -> (structure)
    The current state of the instance.

    Code -> (integer)
        The low byte represents the state. The high byte is used for internal purposes and should be ignored.

        0 : pending
        16 : running
        32 : shutting-down
        48 : terminated
        64 : stopping
        80 : stopped
    Name -> (string)
        The current state of the instance.

References

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html