Lambda + Python est efficace pour restreindre l'accès à un grand nombre de listes d'adresses IP

Contexte

Nous exploitons un service appelé Système e-learning de type cloud eden LMS, et l'autre jour, nous avons eu un tel échange avec un client.

"Eden LMS peut-il définir des restrictions d'adresse IP?" "Oui, vous pouvez." "Il existe un modèle comme 192.168.1.0/24, pouvez-vous le gérer?" "Bien sûr. Au fait, combien de modèles autorisez-vous?" "Il y en a plus de 2000" "2000 ou plus" "Et le contenu de la liste change souvent." "Oh, oh ..."

Comment mettre en œuvre?

eden LMS est écrit en Python, et si vous utilisez une bibliothèque appelée netaddr faite par Python, vous pouvez facilement implémenter le jugement lui-même tel que "192.168.1.100/32 est-il inclus dans 192.168.1.0/24?". Cependant, si les sous-réseaux sont disjoints, il sera nécessaire de déterminer s'ils sont inclus ou non dans la liste d'adresses IP autorisées pour le nombre d'éléments de la liste. Il est probable que cela représente une charge processeur considérable si elle est implémentée de manière stupide et honnête. Puisqu'il s'agit d'un service cloud multi-locataire, un tel traitement doit être évité.

Développez toutes les listes telles que "192.168.1.0/24" sous la forme d'une liste de chaînes de caractères telles que "192.168.1.1, 192.168.1.2, 192.168.1.3 ..." et la chaîne de caractères de l'adresse IP de la source d'accès. Il semble que l'implémentation (jugement comme ipaddr dans allowed_list) si la liste est incluse sera assez rapide ... Cependant, j'ai décidé d'utiliser AWS Lambda pour en faire un micro service.

Avec AWS Lambda, vous pouvez simplifier votre implémentation pour les raisons suivantes:

Code source réel

Tout d'abord, du côté AWS Lambda, tout ce que vous avez à faire est de faire correspondre la détermination de l'adresse IP à l'aide de la bibliothèque netaddr au format AWS Lambda.

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")
]

Après avoir compressé ce dossier de bibliothèque lambda_function.py et netaddr et l'avoir téléchargé vers AWS Lambda, ajoutez le point de terminaison de l'API. Maintenant, vous êtes prêt à partir.

L'appelant de l'API ressemble à ceci: (La sécurité est définie sur Ouvert pour le moment, mais en réalité, IAM, etc. devrait être utilisé)

lambda_call.py


# -*- coding: utf-8 -*-
import urllib2
endpoint = "https://xxx.amazonaws.com/prod/apiname" #Contient le point final réel
req = urllib2.Request(endpoint)
req.add_header('Content-Type','application/json')
response = urllib2.urlopen(req,'{"ipaddr":"192.168.4.1"}')
print response.read()

Après cela, si vous mettez en cache le résultat déterminé dans KVS tel que Memcached, il semble que l'appel à AWS Lambda sera minimal.

Résumé

Pour traiter que «la différence de volume de traitement entre les heures de pointe et les heures creuses est grande» et «la transparence de référence», il serait plus facile d'en faire un micro-service avec AWS Lambda.

Recommended Posts

Lambda + Python est efficace pour restreindre l'accès à un grand nombre de listes d'adresses IP
Accélérez un grand nombre de requêtes simples dans MySQL
[Python] Générer de manière aléatoire un grand nombre de noms de personne en anglais
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Scrapy-Redis est recommandé pour l'exploration d'un grand nombre de domaines
L'exécution d'un grand nombre de Python3 Executor.submit peut consommer beaucoup de mémoire.
[Python] Qu'est-ce qu'une instruction with?
Une bonne description des décorateurs Python
Quel est le fichier XX à la racine d'un projet Python populaire?
Traitement ETL pour un grand nombre de fichiers GTFS Realtime (édition Python)
Connectez un grand nombre de vidéos ensemble!
[python] [meta] Le type de python est-il un type?
One-liner qui crée un grand nombre de fichiers de test à la fois sous Linux
Transformez plusieurs listes avec l'instruction for en même temps en Python
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Téléchargez un grand nombre d'images sur Wordpress
Calculez le nombre total de combinaisons avec python
Résolvez A ~ D du codeur yuki 247 avec python
Réécrire des éléments dans une boucle de listes (Python)
Organisez un grand nombre de fichiers dans des dossiers
Juger s'il s'agit d'un nombre premier [Python]
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide
Un outil pour suivre les affiches avec un grand nombre de likes sur instagram [25 minutes à 1 seconde]
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python