Lambda + Python kann den Zugriff auf eine große Anzahl von IP-Adresslisten gut einschränken

Hintergrund

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 ..."

Wie zu implementieren?

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:

Tatsächlicher Quellcode

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.

Zusammenfassung

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

Lambda + Python kann den Zugriff auf eine große Anzahl von IP-Adresslisten gut einschränken
Beschleunigen Sie eine große Anzahl einfacher Abfragen in MySQL
[Python] Generieren Sie zufällig eine große Anzahl englischer Personennamen
Konsolidieren Sie eine große Anzahl von CSV-Dateien in Ordnern mit Python (Daten ohne Header).
Scrapy-Redis wird zum Crawlen einer großen Anzahl von Domänen empfohlen
Das Ausführen einer großen Anzahl von Python3 Executor.submit verbraucht möglicherweise viel Speicher.
[Python] Was ist eine with-Anweisung?
Eine gute Beschreibung der Python-Dekorateure
Was ist die XX-Datei im Stammverzeichnis eines beliebten Python-Projekts?
ETL-Verarbeitung für eine große Anzahl von GTFS-Echtzeitdateien (Python Edition)
Verbinde eine große Anzahl von Videos miteinander!
[Python] [Meta] Ist der Python-Typ ein Typ?
Einzeiler, der unter Linux eine große Anzahl von Testdateien gleichzeitig erstellt
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Laden Sie eine große Anzahl von Bildern in Wordpress hoch
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Löse A ~ D des Yuki-Codierers 247 mit Python
Umschreiben von Elementen in einer Listenschleife (Python)
Organisieren Sie eine große Anzahl von Dateien in Ordnern
Beurteilen Sie, ob es sich um eine Primzahl handelt [Python]
Holen Sie sich mit Python eine große Menge von Starbas Twitter-Daten und probieren Sie die Datenanalyse Teil 1 aus
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
[Shell Art] Nur wenn es ein Vielfaches von 3 ist und eine Zahl mit 3 dumm wird
Ein Tool zum Verfolgen von Postern mit einer großen Anzahl von Likes auf Instagram [25 Minuten bis 1 Sekunde]
Ich dachte darüber nach, warum Python selbst mit dem Gefühl eines Python-Interpreters notwendig ist