Blog

IP-Whitelisting Ihrer Chalice-Anwendung

Aktualisiert Oktober 21, 2025
4 Minuten

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:

API-Gateway ARN

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 erneut ausführen, verschwindet die soeben konfigurierte Ressourcenrichtlinie, und der Endpunkt bleibt für die ganze Welt offen! Warum ist das so?

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 erneut aus, und Sie finden nun den Inhalt von in der AWS-Konsole. Wenn Sie die API von einer IP aus aufrufen, die nicht in der Richtlinie definiert ist, erhalten wir nun eine Fehlermeldung:

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


  1. Dokumentation der Chalice-Konfigurationsdatei: Konfigurationsdatei

Contact

Let’s discuss how we can support your journey.