Was Sie Tring Dienstleistungen zu tun (Zeitplan Lambda von Lambda) ist es nicht möglich, mit den aktuellen AWS.
, um so eine Always-on-EC2-Instanz zu vermeiden, gibt es andere Möglichkeiten:
1) Verwenden Sie AWS standardmäßigen oder benutzerdefinierten Metriken. Sie können z. B. ApproximateNumberOfMessagesVisible oder CPUUtilization verwenden (wenn Ihre Anwendung beim Verarbeiten einer Anforderung eine große CPU-Auslastung auslöst). Sie können auch einen benutzerdefinierten Messwert erstellen und ihn auslösen, wenn Ihre Instanz inaktiv ist (abhängig von der App, die in Ihrer Instanz ausgeführt wird).
Das Problem mit dieser Option ist, dass Sie bereits bezahlte Minuten verschwenden (AWS berechnet immer eine volle Stunde, unabhängig davon, ob Sie Ihre Instanz 15 Minuten lang verwendet haben).
2) Eine bessere Option, meiner Meinung nach, wäre, eine Lambda-Funktion einmal pro Minute auszuführen, um zu überprüfen, ob Ihre Instanzen inaktiv sind, und sie nur dann herunterzufahren, wenn sie nahe der vollen Stunde sind.
import boto3
from datetime import datetime
def lambda_handler(event, context):
print('ManageInstances function executed.')
environments = [['instance-id-1', 'SQS-queue-url-1'], ['instance-id-2', 'SQS-queue-url-2'], ...]
ec2_client = boto3.client('ec2')
for environment in environments:
instance_id = environment[0]
queue_url = environment[1]
print 'Instance:', instance_id
print 'Queue:', queue_url
rsp = ec2_client.describe_instances(InstanceIds=[instance_id])
if rsp:
status = rsp['Reservations'][0]['Instances'][0]
if status['State']['Name'] == 'running':
current_time = datetime.now()
diff = current_time - status['LaunchTime'].replace(tzinfo=None)
total_minutes = divmod(diff.total_seconds(), 60)[0]
minutes_to_complete_hour = 60 - divmod(total_minutes, 60)[1]
print 'Started time:', status['LaunchTime']
print 'Current time:', str(current_time)
print 'Minutes passed:', total_minutes
print 'Minutes to reach a full hour:', minutes_to_complete_hour
if(minutes_to_complete_hour <= 2):
sqs_client = boto3.client('sqs')
response = sqs_client.get_queue_attributes(QueueUrl=queue_url, AttributeNames=['All'])
messages_in_flight = int(response['Attributes']['ApproximateNumberOfMessagesNotVisible'])
messages_available = int(response['Attributes']['ApproximateNumberOfMessages'])
print 'Messages in flight:', messages_in_flight
print 'Messages available:', messages_available
if(messages_in_flight + messages_available == 0):
ec2_resource = boto3.resource('ec2')
instance = ec2_resource.Instance(instance_id)
instance.stop()
print('Stopping instance.')
else:
print('Status was not running. Nothing is done.')
else:
print('Problem while describing instance.')
Wie [Dokumente sagen] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html): _DynamoDB löscht in der Regel abgelaufene Elemente innerhalb von 48 Stunden nach Ablauf._ So ist dies keine Lösung. – Mentor
@Mentor - du hast Recht. Als ich das schrieb, enthielt die Dokumentation, soweit ich mich erinnere, das nicht. Darüber hinaus kann ich bestätigen, dass ich kürzlich festgestellt habe, dass TTL-Deletionen tatsächlich viel mehr als zuvor benötigen. Ich kann nicht sagen, was sich geändert hat, aber ich kann bestätigen, dass es nicht so nahe an der TTL-Zeit liegt wie früher. Danke für den Kommentar. – justabuzz