[PYTHON] Realisieren Sie den automatischen Stopp der EC2-Instanz mit Lambda + CloudWatch-Ereignissen

Ich denke, es gibt einen ähnlichen Code, wenn ich ihn google, aber ich behalte ihn als Memorandum.

Ich habe oft Code gesehen, der AWS Instance Scheduler verwendet, eine Zeit in einem Tag festlegt und stoppt, wenn Lambda regelmäßig ausgeführt wird, aber ich wollte auch die Anzahl der Lambda-Läufe reduzieren, um die Kosten zu maximieren. Daher nahm ich an, dass die Zeit festgelegt war.

Was du machen willst

Ich möchte den automatischen Stopp der Instanz ausführen, die wie folgt im Tag der EC2-Instanz um 21:00 Uhr an Wochentagen festgelegt ist.

Verfahren

Erstellen einer IAM-Rollenrichtlinie

Erstellen Sie mit dieser Art von Richtlinie eine IAM-Rolle


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StopInstances",
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

Einstellungen für CloudWatch-Ereignisse

Ich möchte jeden Abend um 21:00 Uhr automatisch herunterfahren

cron(0 12 ? * MON-FRI *)

Und setzen. Beachten Sie, dass die Zeit UTC ist. Konvertieren Sie JST in UTC und stellen Sie sie ein.

Lambda erstellen

Erstellen Sie Lambda, indem Sie die oben genannten IAM-Rollen- / CloudWatch-Ereignisse angeben. Die Standardausführungszeit beträgt 3 Sekunden, reicht jedoch nicht aus. Stellen Sie sie daher auf etwa 1 Minute ein. Die Laufzeit ist Python 3.8.


import json

def lambda_handler(event, context):
    import boto3
    ec2 = boto3.client('ec2')

    #Rufen Sie die Ziel-EC2-Instanz-IDs ab
    instances = targetInstances(ec2,'auto-stop', 'true')
    if len(instances) != 0:
        print("--- stop instances ---")
        print(instances)
        #Halt
        ec2.stop_instances(InstanceIds=instances)

#Rufen Sie die Ziel-EC2-Instanz-IDs ab
def targetInstances(ec2, tag_name, tag_value):

    query = [
        {"Name": "instance-state-name", "Values": ["running"]},
        {'Name': 'tag-key', "Values": [tag_name]},
    ]
    fetch_instances = ec2.describe_instances(Filters=query)['Reservations']
    instances = []

    for i in fetch_instances:
        for tags in i['Instances'][0]['Tags']:
            if tag_name in tags['Key']:
                if tags['Value'] == tag_value:
                    instanceId = i['Instances'][0]["InstanceId"]
                    instances.append(i['Instances'][0]["InstanceId"])

    return(instances)

Zusammenfassung

Sparen wir die Instanzgebühr, indem wir häufig EC2-Instanzen für die Entwicklungsumgebung löschen.

Wenn Sie auch automatisch starten möchten, fügen Sie der Richtlinie "ec2: StartInstances" hinzu, erstellen Sie Cloudwatch-Ereignisse mit einer neuen Startzeit, erstellen Sie Lambda und schreiben Sie den obigen Code für den Start neu.

Recommended Posts

Realisieren Sie den automatischen Stopp der EC2-Instanz mit Lambda + CloudWatch-Ereignissen
Versuchen Sie, Start / Stop für EC2-Instanzen mit AWS Lambda zu automatisieren
Starten / stoppen Sie den Cloud-Server von Sakura regelmäßig mit AWS Lambda + CloudWatch-Ereignissen
Bereiten Sie die Umgebung von Chainer auf der EC2-Spot-Instanz mit AWS Lambda vor
Machen Sie es sich einfach, die Zeit von AWS CloudWatch-Ereignissen mit CDK anzugeben.