Der Schlüssel zum Bereitstellen von Flask-Apps mit Python Buildpack in Cloud Foundry (Diego)

Über diesen Artikel

Der Einfachheit halber habe ich PaaS auf Cloud Foundry (Diego) -Basis berührt und versucht, die App mit Flask bereitzustellen, das ich normalerweise verwende. Da ich CF zum ersten Mal ernsthaft berührt habe, wurden einige Punkte abgefangen, daher werde ich es als einfachen Punkt beschreiben. Ich hoffe, es ist nützlich für diejenigen, die PaaS noch nicht kennen und es verwenden möchten, aber nicht damit vertraut sind.

Wenn Sie mit CF vertraut sind, erzählen Sie mir bitte verschiedene Dinge, wie zum Beispiel das Aufzeigen der Fehler ...!

Beispielcode zum Erlernen der CF-Umgebung

Ich habe den Beispielcode unten angegeben. Für diejenigen, die neu in CF-Apps sind, kommentieren Sie es. & Funktionen Super einfach, aber bitte verzeihen Sie mir.

Diese Umgebung

Ich versuche, Enterprise Cloud PaaS von NTT Communications zu verwenden, wo Diego of Cloud Foundry bereitgestellt wird. Es scheint, dass Diego Pivotal Web Service bereits bereitgestellt hat, daher denke ich, dass es funktionieren wird.

So verschieben Sie den Beispielcode

Installation und Konfiguration von cf_cli

Installieren Sie zunächst cf_cli und stellen Sie es so ein, dass Cloud Foundry verwendet wird. Ich denke, es ist schnell, Official hier zu sehen, aber Max OS 64 Bit, Windows 64 Bit, Das Paket für Linux 64 Bit ist verteilt [^ 1], laden Sie es einfach herunter und öffnen Sie es.

[^ 1]: Beim Schreiben dieses Artikels habe ich gelernt, dass Mac auch mit Homebrew ...

Melden Sie sich nach der Installation mit dem Befehl cf an.

cf login [-a API_URL] [-u USERNAME] [-p PASSWORD] [-o ORG] [-s SPACE]

Dies wird anhand der vom Dienstanbieter bereitgestellten Kontoinformationen festgelegt. Leerzeichen und Organisation können weggelassen werden, wenn es nur eine gibt.

Wenn Sie sich erfolgreich anmelden, werden die folgenden Informationen zurückgegeben.

--API-Endpunkt und API-Version

API endpoint: https://paas-uk1-ecl.api.ntt.com (API version: 2.47.0)
User: ecid1*********0@econ1*********1
Org: econ1*********1
Space: demonstration

Nach dem Anmelden wird standardmäßig "~ / .cf / config.json" erstellt und in Ihrem Home-Verzeichnis gespeichert. Dies kann mit der Umgebungsvariablen "CF_HOME" verschoben werden.

Holen Sie sich die Benutzerliste und überprüfen Sie sie, falls Sie angemeldet sind.

$ cf org-users econ1*********1 -a
Getting users in org econ1*********1 as 2*****************P8****nV...
USERS
2*****************P8****nV

Beispielcode abrufen

Holen Sie sich den Code von Git

$ git clone [email protected]:yuta-hono/flask-cloudfoundry-sample.git

Führen Sie "cf push" im entsprechenden Verzeichnis aus. Dies wird für CF mit dem aktuellen Verzeichnis als App bereitgestellt. Dieses Mal wird das Python-Buildpack von der externen URL und dem CF-Community-Buildpack mit der Option -b aufgerufen.

$ cf push <App Name> -b https://github.com/cloudfoundry/python-buildpack

Nach einer Weile ist der Build abgeschlossen und das folgende Ergebnis wird zurückgegeben. Wenn Sie laufen, sind Sie erfolgreich!

requested state: started
instances: 1/1
usage: 128M x 1 instances
urls: <yourapp>.uk1.eclpaas.com
last uploaded: Tue May 23 10:50:05 UTC 2016
stack: cflinuxfs2
buildpack: python_buildpack

     state     since                    cpu    memory          disk             details
#0   running   2016-05-24 10:50:52 PM   0.0%   18.8M of 128M   147.6M of 256M

Verschiedene Dinge, die sich von der normalen Umgebung unterscheiden, die Sie selbst herstellen

Fast Original CF Document stellt Fragen und Lösungen, mit denen Sie Ihre Anwendung auf PaaS stellen möchten, aber nicht wissen, worauf Sie achten müssen. -deploy.html # "Prepare to Deploy"), aber ich habe es im obigen Beispielcode zusammengestellt. Ich habe nicht alles implementiert, aber ich habe die grundlegenden Teile in einfachem Code zusammengefasst. Ich denke, es ist einfacher zu verstehen, wenn Sie es lesen, während Sie sich den Beispielcode ansehen.

Was soll ich mit dem Listen-Port der App tun?

Weisen Sie in CF den Bereitstellungsport dynamisch in [Container] zu (https://docs.cloudfoundry.org/concepts/diego/diego-architecture.html#cell-components). Der zugewiesene Port und die zugewiesene IP können angezeigt werden. In diesem Fall können Port und IP jedoch geändert werden, da die Anwendung im Falle einer erneuten Bereitstellung oder eines Ausfalls einer anderen Infrastruktur oder eines Containers neu gestartet wird. Mit anderen Worten, es kann nicht in Static beschrieben werden.

CF ist eine [Umgebungsvariable] namens "PORT" in dem Container, in dem die App bereitgestellt wird (http://docs.cloudfoundry.org/devguide/deploy-apps/environment-variable.html#PORT "Cloud Foundry-Umgebungsvariablen Es macht ") einfacher, daher müssen Sie es dynamisch als App-Port festlegen.

Im Beispielcode wird wie folgt geschrieben. (Auszug aus hello.py)

hello.py


import os

~snip~

cf_port = int(os.getenv("PORT"))

~snip~

app.run(port=cf_port)

Wenn Sie versuchen, den Beispielcode für CF bereitzustellen, können Sie als Referenz die Liste der Umgebungsvariablen des Bereitstellungszielcontainers unter "http: // / vars" überprüfen. Es ist also leicht zu verstehen, ob Sie die von CF bereitgestellten Umgebungsvariablen überprüfen. Ich denke.

So sehen Sie das App-Protokoll

Das Anwendungsprotokoll kann durch Ausgabe an die Standardausgabe "STDOUT" oder die Standardfehlerausgabe "STDERR" erhalten werden. (Stellen Sie sicher, dass die Ausgabe entweder auf [http://docs.cloudfoundry.org/devguide/deploy-apps/streaming-logs.html#app) erfolgt. Dies scheint der Schlüssel zu sein.) In CF ist eine Funktion zum Beenden von Anwendungsprotokollen in Betrieb, mit der Sie diese Funktion protokollieren können. Es kann bestätigt werden.

$ cf logs blue
Connected, tailing logs for app blue in org econ1*********1 / space demonstration as 2*1...

2016-05-24T22:51:21.02+0900 [RTR/0]      OUT demonstration.uk1.eclpaas.com - [24/05/2016:13:51:21 +0000] "GET / HTTP/1.1" 200 0 12 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" 10.0.0.7:35858 x_forwarded_for:"192.168.0.43, 10.0.0.7" x_forwarded_proto:"http" vcap_request_id:8d5086b2-9ffd-4901-4ce5-80bcef39557c response_time:0.005617514 app_id:ae1b5d8f-2159-4259-947e-c4b01e1cd513
2016-05-24T22:51:21.02+0900 [APP/0]      ERR 10.0.50.151 - - [24/May/2016 13:51:21] "GET / HTTP/1.1" 200 -

Es gibt mehrere Arten von Protokollen, der APP-Typ ist der Anwendungstyp und die anderen sind von CF bereitgestellte Protokolle. Weitere Informationen finden Sie unter Anwendungsprotokollierung in Cloud Foundry.

Es scheint notwendig zu sein, beim Betrieb etwas mehr zu berücksichtigen, aber ich möchte es separat zusammenfassen, wenn sich eine Gelegenheit ergibt.

Bitte sagen Sie mir, wer detaillierter ist

Ich möchte einen Planungsjob (cron) verwenden!

Es scheint keine native CF-Funktion zu sein. Es scheint, dass einige Dienstanbieter, die CF bereitstellen, ihren eigenen Taskplaner als externes Modul implementieren. Laut Pivotal, einem großen Entwickler von CF, [können Sie den Job jedoch als App ausführen, wenn Sie nicht über Cron verfügen. Nicht gut](https://blog.pivotal.io/labs/labs/scheduling-tasks-on-cloud-foundry "Planen von Aufgaben in der Cloud Foundry" ") (Viel Übersetzung).

Ich möchte Umgebungsvariablen selbst festlegen, oder?

können. Im Beispielcode ist .profile.d das Verzeichnis dafür.

In diesem Beispielcode ist beispielsweise "MY_OWN_ENV_VAR" festgelegt, andernfalls werden von CF Umgebungsvariablen bereitgestellt. Als Referenz können Sie im Fall der Beispielcode-App sehen, dass sie unter "http: // / vars" festgelegt werden kann. Alternativ können Sie sich mit $ cf ssh <IhreApp> bei dem Container anmelden, in dem die App bereitgestellt wird. Nach dem Anmelden können Sie die Liste der Umgebungsvariablen mit $ printenv überprüfen. Kann ich die Daten aus der App ausspucken und lokal ablegen? ** Ist nutzlos. ** In einer CF-Umgebung sind die Daten in dem Container, in dem die Anwendung bereitgestellt wird, flüchtig, mit Ausnahme derjenigen, die zum Zeitpunkt der Bereitstellung enthalten waren. Daher verschwindet es leicht, wenn die App in einem anderen Container neu gestartet wird. Persistente Daten verwenden externen Speicher. Statische verwenden s3-Objektspeicher und anderen Speicher, und Daten verwenden wahrscheinlich einen externen RDB-Dienst. Je nach Anbieter gibt es auch Stellen, an denen dies integriert und bereitgestellt wird. Bitte überprüfen Sie dies vor der Verwendung.

Ich werde die spezifische Verwendungsmethode weglassen, da sie etwas komplizierter als der Beispielcode ist, aber Dienste binden und verwenden ), Es scheint, dass Sie dies leicht tun können.

Ich möchte Dateien in mein Repository aufnehmen, die ich während der Bereitstellung ignorieren möchte

Sie möchten README.md und .git und darunter ignorieren. Verwenden Sie in diesem Fall ".cfignore".

Dies ist fast der gleiche Mechanismus wie ".gitignore". Standardmäßig werden die folgenden Dateien und Verzeichnisse ignoriert (https://docs.cloudfoundry.org/devguide/deploy-apps/prepare-to-deploy.html#exclude).

Der Beispielcode ist so eingestellt, dass "README.md" und "LICENSE" ignoriert werden. Wenn Sie beispielsweise "cf ssh " in der bereitgestellten Anwendung versuchen,

vcap@gisruph1uo0:~$ ls
app  logs  staging_info.yml  tmp

Es sieht aus wie das. Werfen wir einen Blick auf die App, die in app bereitgestellt wird.

vcap@gisruph1uo0:~$ cd app
vcap@gisruph1uo0:~/app$ ls
hello.py  Procfile  requirements.txt  runtime.txt  templates

Es wird richtig ignoriert. Sie können den Effekt ausprobieren, indem Sie .cfignore bearbeiten. Verwenden Sie ihn daher bitte.

Ich möchte den Zugriff in einem Netzwerk einschränken

In Bezug auf das Netzwerk wird es auf "0.0.0.0 / 0" gehört. Außerdem wird der Bindungsport der Anwendung selbst mit "0.0.0.0 / 0" abgehört. Daher sind Netzwerkzugriffsbeschränkungen (fast) nicht verfügbar.

Da die CF-Seite die Client-IP jedoch in den HTTP-Anforderungsheader mit dem Namen "X-Forwarded-For" einfügt, ist es möglich, den Zugriff der Quell-IP auf der Anwendungsseite auf diese Weise einzuschränken. (X-Forwarded-For ist in ELB von AWS usw. bekannt.)

Im Beispielcode wird wie folgt vorgegangen. (Auszug / Bearbeitung nur des relevanten Teils)

from flask import request

srcIp = request.access_route[0]

# List of IP addresses to allow the access
allowed_ip = ['192.0.2.1', '192.0.2.2']

@app.route('/ip')
def showIp():
if srcIp not in allowed_ip:
    abort(403)

    return 'Your IP %s is allowed' % srcIp

Ich kann X-Forwarded-For mit flask.request.access_route erhalten, aber Flask speichert den Wert, der X-Forwarded-For hinzugefügt wurde, als Array. Die hier angegebene "access_route [0]" ist die erste, wenn der Wert von "X-Forwarded-For" "192.0.2.1, 192.0.2.2" ist, dh "192.0.2.1". Es wird dir ein Gefühl geben.

In Bezug auf CF wird die Client-Quell-IP nur in "X-Forwarded-For" eingegeben, aber je nach Anbieter kann ein Load Balancer usw. vorangestellt sein und es können mehrere Werte gespeichert werden Die Anpassung ist je nach Fall erforderlich.

Im Beispielcode wird die Zugriffsbeschränkung durch die Client-Quell-IP unter "http: // / IP" implementiert. Wenn Sie die Liste von "allow_ip" ändern, können Sie die zulässige IP-Adresse ändern. Versuchen Sie es also bitte.

Beilage (Kolbengeschichte)

Im Beispielcode ist der Einfachheit halber eine Methode für die Ressource "/ ip" definiert, um die Zugriffsberechtigung zu bestimmen. Im Fall von Flask wird das Verhalten vor dem Akzeptieren der Anforderung im Dekorator für "before_request" festgelegt. Ja, Sie können den Zugriff auf alle Seiten einfach einschränken. Weitere Informationen finden Sie unter Offizielle Dokumentation zu Flask, API-Kapitel.

In der Beispielcode-Umgebung sehen Sie den HTTP-Anforderungsheader am unteren Bildschirmrand unter "http: // / vars".

Schließlich

Dieses Mal habe ich versucht, den Prozess der Bereitstellung und Ausführung der App auf CF vorerst zusammenzustellen. Wenn es um die Betriebsphase geht (Bereitstellung, Protokollerfassung, Überwachung usw.), denke ich, dass es wieder viele Probleme geben wird, aber da es lange dauern wird, möchte ich es in einem anderen Artikel zusammenfassen, wenn sich eine Gelegenheit ergibt.

Referenzmaterial

Recommended Posts

Der Schlüssel zum Bereitstellen von Flask-Apps mit Python Buildpack in Cloud Foundry (Diego)
[Heroku] Memo zum Bereitstellen von Python-Apps mit Heroku unter Windows [Python]
Der Weg zur Installation von Python und Flask auf einem Offline-PC
So aktualisieren Sie die Python-Version von Cloud Shell in GCP
Arbeitsnotiz zum Migrieren und Aktualisieren von Skripten der Python 2-Serie in der Cloud auf 3-Serien
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Python: Versuchen Sie, die Benutzeroberfläche von Pythonista 3 auf dem iPad zu verwenden
Führen Sie Python-Webanwendungen mit NGINX + NGINX Unit + Flask aus
Einführung in Python mit Atom (unterwegs)
Lassen Sie den Summer mit Python auf Raspberry Pi 3 erklingen!
Führen Sie die Kolben-App auf Cloud 9 und Apache Httpd aus
Überlegen Sie, wie Sie Python auf Ihrem iPad programmieren können
Schritte zum Installieren des neuesten Python auf Ihrem Mac
Schreiben Sie Daten mit dem Python-Anforderungsmodul in KINTONE
Posten Sie mit der API auf Twitter in Ihrem Konto
[Einführung in Python] Wie stoppe ich die Schleife mit break?
Ausgabe auf "7 Segment LED" mit Python mit Raspberry Pi 3!
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
Verwenden Sie Python, um Windows und Mac zu überwachen und Informationen zu den Apps zu sammeln, an denen Sie arbeiten
Wie man die Anzahl der GPUs aus Python kennt ~ Hinweise zur Verwendung von Multiprocessing mit pytorch ~
Steuern Sie Smart Light "Yeelight" von Python aus, ohne die Cloud zu verwenden
[Python3] Formatieren Sie die Zeichenfolge mit dem Variablennamen als Schlüssel
[Python] Ändern Sie die Cache-Steuerung von Objekten, die in den Cloud-Speicher hochgeladen wurden
[Python] So überprüfen Sie, ob der Schlüssel im Wörterbuch vorhanden ist
[Hyperledger Iroha] Hinweise zur Verwendung des Python SDK
Beispiel zum Einfügen der Python Flask-Webanwendung in den Azure App Service (Webanwendung)
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
So stellen Sie Pybot, das einfachste Python-Lehrbuch, auf Heroku bereit
Stellen Sie mit Pycoin (Python Cryptocoin Utili) eine Verbindung zum Bitcoin-Netzwerk her.
Ermöglichen Sie die schnelle Ausführung von Python-Skripten in Cloud Run mithilfe des Responders
Speichern Sie Bilder im Web mit Python (Colab) auf einem Laufwerk.
Berühren Sie NoSQL mit Python mithilfe des Oracle NoSQL Database Cloud Simulators
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert