Wir betreiben einen Dienst namens Cloud-Typ-E-Learning-System eden LMS, und neulich hatten wir einen solchen Austausch mit einem Kunden.
"Kann Eden LMS IP-Adressbeschränkungen festlegen?" "Ja, du kannst." "Es gibt ein Muster wie 192.168.1.0/24, können Sie damit umgehen?" "Natürlich. Übrigens, wie viele Muster erlauben Sie?" "Es gibt mehr als 2000" "2000 oder mehr" "Und der Inhalt der Liste ändert sich oft." "Oh, oh ..."
eden LMS ist in Python geschrieben. Wenn Sie eine von Python erstellte Bibliothek namens netaddr verwenden, können Sie das Urteil selbst einfach implementieren, z. B. "Ist 192.168.1.100/32 in 192.168.1.0/24 enthalten?". Wenn die Subnetze jedoch getrennt sind, muss für die Anzahl der Elemente in der Liste bestimmt werden, ob sie in der Liste der zulässigen IP-Adressen enthalten sind oder nicht. Dies ist wahrscheinlich eine beträchtliche CPU-Auslastung, wenn es dumm und ehrlich implementiert wird. Da es sich um einen mandantenfähigen Cloud-Dienst handelt, muss eine solche Verarbeitung vermieden werden.
Erweitern Sie alle Listen wie "192.168.1.0/24" als Liste von Zeichenfolgen wie "192.168.1.1, 192.168.1.2, 192.168.1.3 ..." und die Zeichenfolge der IP-Adresse der Zugriffsquelle. Es scheint, dass die Implementierung (Beurteilung wie ipaddr in allow_list), ob die Liste enthalten ist, schnell genug sein wird ... aber ich habe mich entschieden, AWS Lambda zu verwenden, um daraus einen Mikrodienst zu machen.
Mit AWS Lambda können Sie Ihre Implementierung aus folgenden Gründen einfach halten:
Zunächst müssen Sie auf der AWS Lambda-Seite lediglich die IP-Adressermittlung mithilfe der netaddr-Bibliothek an das AWS Lambda-Format anpassen.
lambda_function.py
from netaddr.ip import IPNetwork,IPAddress
def lambda_handler(event, context):
ipaddr = event['ipaddr']
for network in allowed_networks:
if IPAddress(ipaddr) in network:
return True
return False
allowed_networks = [
IPNetwork("192.168.2.1/24")
,IPNetwork("192.168.3.1/24")
,IPNetwork("192.168.4.1/32")
]
Fügen Sie den API-Endpunkt hinzu, nachdem Sie diesen Bibliotheksordner lambda_function.py und netaddr komprimiert und auf die AWS Lambda-Seite hochgeladen haben. Jetzt können Sie loslegen.
Der Aufrufer der API sieht folgendermaßen aus: (Die Sicherheit ist vorerst auf Öffnen eingestellt, aber in Wirklichkeit sollte IAM usw. verwendet werden.)
lambda_call.py
# -*- coding: utf-8 -*-
import urllib2
endpoint = "https://xxx.amazonaws.com/prod/apiname" #Enthält den tatsächlichen Endpunkt
req = urllib2.Request(endpoint)
req.add_header('Content-Type','application/json')
response = urllib2.urlopen(req,'{"ipaddr":"192.168.4.1"}')
print response.read()
Wenn Sie danach das ermittelte Ergebnis in KVS wie memcached zwischenspeichern, scheint der Aufruf von AWS Lambda minimal zu sein.
Für die Verarbeitung, dass "der Unterschied im Verarbeitungsvolumen zwischen Spitzen- und Nicht-Spitzenzeiten groß ist" und "Referenztransparenz", wäre es einfacher, es mit AWS Lambda zu einem Mikrodienst zu machen.
Recommended Posts