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.
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.
auto-stop
true
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": "*"
}
]
}
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é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)
É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