Chalice ist ein sehr nützliches Framework für die schnelle Entwicklung von REST-APIs mit Python, die auf AWS Lambda gehostet und über das AWS API Gateway bereitgestellt werden, ohne dass eine Infrastruktur bereitgestellt werden muss. Sie haben also Ihre Anwendung geschrieben, möchten sie aber nicht dem weltweiten Internet aussetzen. Dieser Blogbeitrag zeigt Ihnen, wie Sie in Chalice eine Ressourcenrichtlinie anwenden, die den Zugriff auf eine bestimmte (Reihe von) IP-Adresse(n) beschränkt.
Bereitstellen einer Demo-Anwendung
Lassen Sie uns zu Demonstrationszwecken eine kleine Chalice-Anwendung einsetzen, die die aktuelle Zeit in der angegebenen Zeitzone liefert:
kelch neues projekt weltzeit
In app.py:
importieren datetime importieren pytz von Kelch importieren Kelch, UnprocessableEntityError von pytz importieren UnknownTimeZoneError app = Kelch(app_name="Weltzeit") @app.route("/timezone/{timezone}", Methoden=["GET"]) def gettime(Zeitzone): Versuchen Sie: return f"Es ist momentan {datetime.datetime.now(pytz.timezone(timezone))} in {timezone}." außer UnknownTimeZoneError: erhöhen UnprocessableEntityError(msg=f"Zeitzone '{timezone}' unbekannt für pytz.")
Stellen Sie mit chalice deploy bereit, um die URL zu erhalten, unter der die Anwendung bereitgestellt wird (die Kontodaten werden verschleiert):
$ Kelch einsetzen
Bereitstellungspaket erstellen.
IAM-Rolle erstellen: worldtime-dev
Lambda erstellen Funktion: weltzeit-dev
Rest API erstellen
Eingesetzte Ressourcen:
- Lambda ARN: arn:aws:lambda:eu-west-1:012345678999:function:worldtime-dev
- Rest API URL: https://urwolo1et3.execute-api.eu-west-1.amazonaws.com/api/
Chalice hat die erforderlichen Ressourcen (u.a. Lambda & API Gateway) erstellt und wir können nun die bereitgestellte API von jedem Ort der Welt aus aufrufen, zum Beispiel:
locken https://urwolo1et3.execute-api.eu-west-1.amazonaws.com/api/timezone/utc
Es's derzeit 2019-10-26 09:50:04.948863+00:00 in utc.
curl -i https://urwolo1et3.execute-api.eu-west-1.amazonaws.com/api/timezone/donotcompute HTTP/2 422 ... {"Code":"UnprocessableEntityError","Nachricht":"UnprocessableEntityError: Zeitzone 'donotcompute' unbekannt für pytz."}
Beschränkung des Zugriffs auf das API Gateway
Wenn Sie möchten, dass Ihre Anwendung z.B. nur von Ihrem Unternehmen aus zugänglich ist, können Sie den Zugriff auf das API Gateway mit Ressourcenrichtlinien steuern. Diese können auf der Registerkarte API Gateway -> Ressourcenrichtlinie konfiguriert werden. Zunächst benötigen Sie den ARN des bereitgestellten Endpunkts:
Als nächstes fügen Sie auf der Registerkarte Ressourcenrichtlinie die folgende Richtlinie ein, die Ihre IP-Adresse enthält (entfernen Sie /GET/timezone/*, um die Richtlinie auf alle Endpunkte anzuwenden):
{ "Version": "2012-10-17", "Erklärung": [ { "Wirkung": "Zulassen", "Prinzipal": "*", "Aktion": "execute-api:Invoke", "Ressource": "arn:aws:execute-api:eu-west-1:012345678999:urwolo1et3/*/GET/timezone/*", "Zustand": { "IpAdresse": { "aws:SourceIp": [ "123.123.123.123" ] } } } ] }
Nach dem Speichern der Ressourcenrichtlinie ist das API-Gateway jedoch weiterhin von überall aus zugänglich. Um die Ressourcenrichtlinie durchzusetzen, müssen wir die Chalice-Anwendung erneut bereitstellen. Wenn Sie jedoch
Konfigurieren der Chalice-Anwendung
Bei der Bereitstellung generiert Chalice automatisch Richtlinien und wendet sie an. Der gesamte Status wird in einem mit dem Projekt erstellten Verzeichnis .chalice gespeichert und der AWS-Projektstatus wird nicht überprüft. Daher wird die manuell konfigurierte Richtlinie in diesem Fall mit nichts überschrieben, da wir noch keine Richtlinien konfiguriert haben. Lassen Sie uns also die Richtlinie in Chalice statt in der AWS-Konsole konfigurieren.
Im Verzeichnis .chalice haben Sie eine Datei config.json. Die leere config.json sieht wie folgt aus1:
{ "Version": "2.0", "app_name": "Weltzeit", "Bühnen": { "dev": { "api_gateway_stage": "api" } } }
Um die Ressourcenrichtlinie auf den API-Gateway anzuwenden, fügen Sie ein Konfigurationselement api_gateway_policy_file hinzu:
{ "Version": "2.0", "app_name": "Weltzeit", "api_gateway_policy_file": "ipwhitelist.json", "Bühnen": { "dev": { "api_gateway_stage": "api" } } }
Chalice sucht nach dem angegebenen Dateinamen ipwhitelist.json aus dem Verzeichnis .chalice, also erstellen Sie eine Datei .chalice/ipwhitelist.json mit der Ressourcenrichtlinie darin. Führen Sie anschließend
$ curl https://urwolo1et3.execute-api.eu-west-1.amazonaws.com/api/timezone/utc {"Nachricht":"Benutzer: anonymous hat keine Berechtigung zur Ausführung von: execute-api:Invoke auf Ressource: arn:aws:execute-api:eu-west-1:********8999:urwolo1et3/api/GET/timezone/utc"}
Chalice ist sehr konfigurierbar und ermöglicht eine viel detailliertere Konfiguration als die "globale" Einschränkung, die oben auf die gesamte Anwendung angewandt wird, z.B. eine Richtlinie pro Stufe, um den Entwicklungsendpunkt auf die IP Ihres Unternehmens zu beschränken und den Produktionsendpunkt für die ganze Welt zuzulassen. Es ist auf jeden Fall hilfreich, die Chalice-Dokumentation durchzulesen.
- Dokumentation der Chalice-Konfigurationsdatei: Konfigurationsdatei
Unsere Ideen
Weitere Blogs
Contact




