[PYTHON] Réalisez l'arrêt automatique de l'instance EC2 avec Lambda + CloudWatch Events

Je pense qu'il existe un code similaire si je le recherche sur Google, mais je le garde en mémoire.

J'ai souvent vu du code qui utilise AWS Instance Scheduler, définit une heure dans une balise et s'arrête lorsque Lambda s'exécute régulièrement, mais je souhaitais également réduire le nombre d'exécutions Lambda pour maximiser les coûts. Par conséquent, j'ai supposé que l'heure était fixée.

Chose que tu veux faire

Je souhaite exécuter l'arrêt automatique de l'instance définie comme ci-dessous dans la balise de l'instance EC2 à 21h00 en semaine.

procédure

Création d'une stratégie de rôle IAM

Créer un rôle IAM avec ce type de stratégie


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

Paramètres des événements CloudWatch

Je veux m'arrêter automatiquement à 21h00 tous les soirs

cron(0 12 ? * MON-FRI *)

Et mettre. Notez que l'heure est UTC, alors convertissez JST en UTC et réglez-la.

Création de Lambda

Créez Lambda en spécifiant le rôle IAM / les événements CloudWatch ci-dessus. Le temps d'exécution par défaut est de 3 secondes, mais ce n'est pas suffisant, réglez-le donc à environ 1 minute. Le runtime est Python 3.8.


import json

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

    #Obtenez les ID d'instance EC2 cibles
    instances = targetInstances(ec2,'auto-stop', 'true')
    if len(instances) != 0:
        print("--- stop instances ---")
        print(instances)
        #Arrêtez
        ec2.stop_instances(InstanceIds=instances)

#Obtenez les ID d'instance EC2 cibles
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)

Résumé

Économisons les frais d'instance en supprimant fréquemment les instances EC2 pour l'environnement de développement.

Si vous souhaitez également démarrer automatiquement, ajoutez ʻec2: StartInstances` à la stratégie, créez des événements Cloudwatch avec une nouvelle heure de début, créez Lambda et réécrivez le code ci-dessus pour le démarrage.

Recommended Posts

Réalisez l'arrêt automatique de l'instance EC2 avec Lambda + CloudWatch Events
Essayez d'automatiser le démarrage / l'arrêt des instances EC2 avec AWS Lambda
Démarrez / arrêtez régulièrement le serveur cloud de Sakura avec AWS Lambda + CloudWatch Events
Préparer l'environnement de Chainer sur l'instance spot EC2 avec AWS Lambda
Facilitez la spécification de l'heure d'AWS CloudWatch Events avec CDK.