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