Auto Shutdown and Start Amazon EC2 Instance

后端 未结 14 1046
执念已碎
执念已碎 2020-12-04 06:49

Can I automatically start and terminate my Amazon instance using Amazon API? Can you please describe how this can be done? I ideally need to start the instance and stop the

相关标签:
14条回答
  • 2020-12-04 07:27

    If it's not mission critical - A simplistic thing to do is to schedule batch file to run 'SHUTDOWN' (windows) at 3am every day. Then at least you don't run the risk of accidentally leaving an unwanted instance running indefinitely.

    Obviously this is only half the story!

    0 讨论(0)
  • 2020-12-04 07:27

    Yes, you can do that using AWS Lambda. You can select the trigger in Cloudwatch which runs on Cron expressions on UTC.

    Here is a related link https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/

    Another alternative is to use awscli which is available from pip, apt-get, yum or brew, and then running aws configure with your credentials exported from IAM and executing the following bash script, to stop an EC2 that has been tagged with Name: Appname and Value: Appname Prod. You can use awscli to tag your instances or tag it manually from the AWS console. aws ec2 stop-instances will stop the instance and jq is used to filter the json query and fetch the correct instance id using the tags from aws ec2 describe-instances.

    To verify that aws configure was successful and returns json output run aws ec2 describe-instances and your running instance id should be there in the output. Here is a sample output

    {
        "Reservations": [
            {
                "Instances": [
                    {
                        "Monitoring": {
                            "State": "disabled"
                        },
                        "PublicDnsName": "ec2-xxx.ap-south-1.compute.amazonaws.com",
                        "State": {
                            "Code": xx,
                            "Name": "running"
                        },
                        "EbsOptimized": false,
                        "LaunchTime": "20xx-xx-xxTxx:16:xx.000Z",
                        "PublicIpAddress": "xx.127.24.xxx",
                        "PrivateIpAddress": "xxx.31.3.xxx",
                        "ProductCodes": [],
                        "VpcId": "vpc-aaxxxxx",
                        "StateTransitionReason": "",
                        "InstanceId": "i-xxxxxxxx",
                        "ImageId": "ami-xxxxxxx",
                        "PrivateDnsName": "ip-xxxx.ap-south-1.compute.internal",
                        "KeyName": "node",
                        "SecurityGroups": [
                            {
                                "GroupName": "xxxxxx",
                                "GroupId": "sg-xxxx"
                            }
                        ],
                        "ClientToken": "",
                        "SubnetId": "subnet-xxxx",
                        "InstanceType": "t2.xxxxx",
                        "NetworkInterfaces": [
                            {
                                "Status": "in-use",
                                "MacAddress": "0x:xx:xx:xx:xx:xx",
                                "SourceDestCheck": true,
                                "VpcId": "vpc-xxxxxx",
                                "Description": "",
                                "NetworkInterfaceId": "eni-xxxx",
                                "PrivateIpAddresses": [
                                    {
                                        "PrivateDnsName": "ip-xx.ap-south-1.compute.internal",
                                        "PrivateIpAddress": "xx.31.3.xxx",
                                        "Primary": true,
                                        "Association": {
                                            "PublicIp": "xx.127.24.xxx",
                                            "PublicDnsName": "ec2-xx.ap-south-1.compute.amazonaws.com",
                                            "IpOwnerId": "xxxxx"
                                        }
                                    }
                                ],
                                "PrivateDnsName": "ip-xxx-31-3-xxx.ap-south-1.compute.internal",
                                "Attachment": {
                                    "Status": "attached",
                                    "DeviceIndex": 0,
                                    "DeleteOnTermination": true,
                                    "AttachmentId": "xxx",
                                    "AttachTime": "20xx-xx-30Txx:16:xx.000Z"
                                },
                                "Groups": [
                                    {
                                        "GroupName": "xxxx",
                                        "GroupId": "sg-xxxxx"
                                    }
                                ],
                                "Ipv6Addresses": [],
                                "OwnerId": "xxxx",
                                "PrivateIpAddress": "xx.xx.xx.xxx",
                                "SubnetId": "subnet-xx",
                                "Association": {
                                    "PublicIp": "xx.xx.xx.xxx",
                                    "PublicDnsName": "ec2-xx.ap-south-1.compute.amazonaws.com",
                                    "IpOwnerId": "xxxx"
                                }
                            }
                        ],
                        "SourceDestCheck": true,
                        "Placement": {
                            "Tenancy": "default",
                            "GroupName": "",
                            "AvailabilityZone": "xx"
                        },
                        "Hypervisor": "xxx",
                        "BlockDeviceMappings": [
                            {
                                "DeviceName": "/dev/xxx",
                                "Ebs": {
                                    "Status": "attached",
                                    "DeleteOnTermination": true,
                                    "VolumeId": "vol-xxx",
                                    "AttachTime": "20xxx-xx-xxTxx:16:xx.000Z"
                                }
                            }
                        ],
                        "Architecture": "x86_64",
                        "RootDeviceType": "ebs",
                        "RootDeviceName": "/dev/xxx",
                        "VirtualizationType": "xxx",
                        "Tags": [
                            {
                                "Value": "xxxx centxx",
                                "Key": "Name"
                            }
                        ],
                        "AmiLaunchIndex": 0
                    }
                ],
                "ReservationId": "r-xxxx",
                "Groups": [],
                "OwnerId": "xxxxx"
            }
        ]
    }
    

    The following bash script is stop-ec2.sh in /home/centos/cron-scripts/ which is inspired from this SO post

    (instance=$(aws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) |  select(.[].Tags[].Key == "Appname") |  {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags}  | [.]' | jq -r .[].InstanceId) && aws ec2 stop-instances --instance-ids ${instance} )
    

    Run the file using sh /home/centos/cron-scripts/stop-ec2.sh and verify that the EC2 instance gets stopped. To debug run aws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) | select(.[].Tags[].Key == "Appname") | {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags} | [.]' | jq -r .[].InstanceId and see that it returns the correct instance ID which has been tagged.

    Then in crontab -e the following line can be added

    30 14 * * * sh /home/centos/cron-scripts/stop-ec2.sh >> /tmp/stop

    which will log the output to /tmp/stop. The 30 14 * * * is the UTC cron expression that you can check in https://crontab.guru/. Similarly replacing with aws ec2 start-instances can start an instance.

    0 讨论(0)
提交回复
热议问题