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 ...!
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.
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.
cf version 6.14.0+2654a47-2015-11-18
--Framework verwendet
--Flask (Keine Version angegeben, auf der PaaS-Seite pipen lassen)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
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
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.
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: //
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.
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).
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: // $ 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.
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).
.cfignore
_darcs
.DS_Store
.git
.gitignore
.hg
/manifest.yml
.svn
Der Beispielcode ist so eingestellt, dass "README.md" und "LICENSE" ignoriert werden.
Wenn Sie beispielsweise "cf ssh
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.
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: //
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: //
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.
Recommended Posts