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