Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen

Überblick

Dieser Eintrag verwendet den OSS-FaaS-Server "Fn Project", um Muster zu verarbeiten, mit denen Python-Funktionen ausgeführt werden.

Stellen Sie die Multiplikationsfunktion von Python bereit und führen Sie sie aus, wie unten auf dem Fn-Server gezeigt.

calcfn_multiply.png

Angenommener Leser

Vorbereitung

Bevor Sie Fn Project ausführen, lesen Sie bitte einen anderen Eintrag "Versuchen Sie, den Fn Project-Server unter CentOS mit Micro Instance of OCI zu installieren".

In diesem Eintrag arbeite ich an der Mikroinstanz von OCI.

Führen Sie die Funktion in Python aus

Der grundlegende Arbeitsablauf folgt dem, was in Einführung in Fn mit Python geschrieben ist.

App auf Fn

In einem anderen Eintrag "Versuchen Sie, eine in JavaScript geschriebene Funktion mit Fn Project on Node auszuführen" mit "fn create app" auf fn Es besteht darin, der erstellten App "calc-fn-app" eine Funktion hinzuzufügen.

Anmeldung

Führen Sie "fn in it" aus, um eine Funktion in Python an der Position / Multiplikation zu erstellen.

$ fn init --runtime python --trigger http multiply
Creating function at: ./multiply
Function boilerplate generated.
func.yaml created.

Die folgenden drei Dateien werden erstellt.

$ ls
func.py  func.yaml  requirements.txt

Code ändern

Schreiben Sie es als eine Funktion um, die durch Multiplizieren des Eingabewerts nach links und rechts wie unten gezeigt zurückkehrt.

import io
import json
from decimal import *

from fdk import response


def handler(ctx, data: io.BytesIO=None):
    value = Decimal('NaN')
    try:
        body = json.loads(data.getvalue())
        left = Decimal(body.get('left'))
        right = Decimal(body.get('right'))
        value = left * right
    except (Exception, ValueError) as ex:
        print(str(ex))

    return response.Response(
        ctx, response_data=json.dumps(
            {"result": str(value)}),
        headers={"Content-Type": "application/json"}
    )

Stellen Sie die App bereit. Das Arbeitsverzeichnis wird mit "-w" angegeben und registriert.

fn --verbose deploy --app calc-fn-app --local -w /home/opc/calc-fn-app/multiply

Bei der ersten Ausführung scheint der Fluss wie folgt zu sein.

$ fn --verbose deploy --app calc-fn-app --local -w /home/opc/calc-fn-app/multiply
Deploying multiply to app: calc-fn-app
Bumped to version 0.0.2
Building image fndemouser/multiply:0.0.2
FN_REGISTRY:  fndemouser
Current Context:  default
Sending build context to Docker daemon  6.144kB
Step 1/12 : FROM fnproject/python:3.6-dev as build-stage
3.6-dev: Pulling from fnproject/python
80369df48736: Pull complete
aaba0609d543: Pull complete
a97b990f94a5: Pull complete
af4a941e5376: Pull complete
709c35256bb6: Pull complete
3c3deb8445b4: Pull complete
Digest: sha256:8ac8c28a68fd0442b9ddcdf6a41f30230482d72d1024cafca06c9f1ac0bd821c
Status: Downloaded newer image for fnproject/python:3.6-dev
 ---> c5dbe9a0175b
Step 2/12 : WORKDIR /function
 ---> Running in f7aaa0e58f7a
Removing intermediate container f7aaa0e58f7a
 ---> 697f68e69e7c
Step 3/12 : ADD requirements.txt /function/
 ---> c4472f73a275
Step 4/12 : RUN pip3 install --target /python/  --no-cache --no-cache-dir -r requirements.txt &&                         rm -fr ~/.cache/pip /tmp* requirements.txt func.yaml Dockerfile .venv
 ---> Running in 4f758b74080b
Collecting fdk
  Downloading https://files.pythonhosted.org/packages/1d/b8/41b81bf76766f7e810627728647a8076626070a6e1d01a18a8ed16bd3d3f/fdk-0.1.12-py3-none-any.whl (46kB)
Collecting iso8601==0.1.12
  Downloading https://files.pythonhosted.org/packages/ef/57/7162609dab394d38bbc7077b7ba0a6f10fb09d8b7701ea56fa1edc0c4345/iso8601-0.1.12-py2.py3-none-any.whl
Collecting httptools>=0.0.10
  Downloading https://files.pythonhosted.org/packages/1b/03/215969db11abe8741e9c266a4cbe803a372bd86dd35fa0084c4df6d4bd00/httptools-0.0.13.tar.gz (104kB)
Collecting pbr!=2.1.0,>=2.0.0
  Downloading https://files.pythonhosted.org/packages/7a/db/a968fd7beb9fe06901c1841cb25c9ccb666ca1b9a19b114d1bbedf1126fc/pbr-5.4.4-py2.py3-none-any.whl (110kB)
Collecting pytest==4.0.1
  Downloading https://files.pythonhosted.org/packages/81/27/d4302e4e00497448081120f65029696070806bc8e649b83f644de006d710/pytest-4.0.1-py2.py3-none-any.whl (217kB)
Collecting pytest-asyncio==0.9.0
  Downloading https://files.pythonhosted.org/packages/33/7f/2ed9f460872ebcc62d30afad167673ca10df36ff56a6f6df2f1d3671adc8/pytest_asyncio-0.9.0-py3-none-any.whl
Collecting py>=1.5.0
  Downloading https://files.pythonhosted.org/packages/99/8d/21e1767c009211a62a8e3067280bfce76e89c9f876180308515942304d2d/py-1.8.1-py2.py3-none-any.whl (83kB)
Collecting pluggy>=0.7
  Downloading https://files.pythonhosted.org/packages/a0/28/85c7aa31b80d150b772fbe4a229487bc6644da9ccb7e427dd8cc60cb8a62/pluggy-0.13.1-py2.py3-none-any.whl
Collecting attrs>=17.4.0
  Downloading https://files.pythonhosted.org/packages/a2/db/4313ab3be961f7a763066401fb77f7748373b6094076ae2bda2806988af6/attrs-19.3.0-py2.py3-none-any.whl
Collecting setuptools
  Downloading https://files.pythonhosted.org/packages/a7/c5/6c1acea1b4ea88b86b03280f3fde1efa04fefecd4e7d2af13e602661cde4/setuptools-45.1.0-py3-none-any.whl (583kB)
Collecting more-itertools>=4.0.0
  Downloading https://files.pythonhosted.org/packages/72/96/4297306cc270eef1e3461da034a3bebe7c84eff052326b130824e98fc3fb/more_itertools-8.2.0-py3-none-any.whl (43kB)
Collecting six>=1.10.0
  Downloading https://files.pythonhosted.org/packages/65/eb/1f97cb97bfc2390a276969c6fae16075da282f5058082d4cb10c6c5c1dba/six-1.14.0-py2.py3-none-any.whl
Collecting atomicwrites>=1.0
  Downloading https://files.pythonhosted.org/packages/52/90/6155aa926f43f2b2a22b01be7241be3bfd1ceaf7d0b3267213e8127d41f4/atomicwrites-1.3.0-py2.py3-none-any.whl
Collecting importlib-metadata>=0.12; python_version < "3.8"
  Downloading https://files.pythonhosted.org/packages/8b/03/a00d504808808912751e64ccf414be53c29cad620e3de2421135fcae3025/importlib_metadata-1.5.0-py2.py3-none-any.whl
Collecting zipp>=0.5
  Downloading https://files.pythonhosted.org/packages/be/69/4ac28bf238f287f1677f41392e24d2c4ffafcf11648c23824f5f62ef6ccb/zipp-2.1.0-py3-none-any.whl
Building wheels for collected packages: httptools
  Building wheel for httptools (setup.py): started
  Building wheel for httptools (setup.py): finished with status 'done'
  Created wheel for httptools: filename=httptools-0.0.13-cp36-cp36m-linux_x86_64.whl size=217310 sha256=51eb19168c0639662416a8ad83b9df7d7ceb8eb14a58ce3bec5ffe3ab3b07a7f
  Stored in directory: /tmp/pip-ephem-wheel-cache-pwxrmfa5/wheels/e8/3e/2e/013f99b42efc25cf3589730cf380738e46b1e5edaf2f78d525
Successfully built httptools
Installing collected packages: iso8601, httptools, pbr, py, zipp, importlib-metadata, pluggy, attrs, setuptools, more-itertools, six, atomicwrites, pytest, pytest-asyncio, fdk
Successfully installed atomicwrites-1.3.0 attrs-19.3.0 fdk-0.1.12 httptools-0.0.13 importlib-metadata-1.5.0 iso8601-0.1.12 more-itertools-8.2.0 pbr-5.4.4 pluggy-0.13.1 py-1.8.1 pytest-4.0.1 pytest-asyncio-0.9.0 setuptools-45.1.0 six-1.14.0 zipp-2.1.0
WARNING: You are using pip version 19.3.1; however, version 20.0.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Removing intermediate container 4f758b74080b
 ---> 5246c18d4e6f
Step 5/12 : ADD . /function/
 ---> c6181bb33bd1
Step 6/12 : RUN rm -fr /function/.pip_cache
 ---> Running in 695fe059e692
Removing intermediate container 695fe059e692
 ---> 5ea69eaafc3a
Step 7/12 : FROM fnproject/python:3.6
3.6: Pulling from fnproject/python
80369df48736: Already exists
aaba0609d543: Already exists
a97b990f94a5: Already exists
af4a941e5376: Already exists
709c35256bb6: Already exists
671870542c6c: Pull complete
936a6f40830a: Pull complete
Digest: sha256:3b438ba11405bba0f6e1e8d8819c9b8be38249da7253491f3cf9f7e5ed6c0ec6
Status: Downloaded newer image for fnproject/python:3.6
 ---> e8e10863d7cd
Step 8/12 : WORKDIR /function
 ---> Running in ddbc794f4bd9
Removing intermediate container ddbc794f4bd9
 ---> 4e3bed62a7f5
Step 9/12 : COPY --from=build-stage /python /python
 ---> b1c7d4fd7598
Step 10/12 : COPY --from=build-stage /function /function
 ---> 87446e069bd2
Step 11/12 : ENV PYTHONPATH=/function:/python
 ---> Running in af075fbcae2c
Removing intermediate container af075fbcae2c
 ---> 98a9f515e7e0
Step 12/12 : ENTRYPOINT ["/python/bin/fdk", "/function/func.py", "handler"]
 ---> Running in 555033ab1e55
Removing intermediate container 555033ab1e55
 ---> 9942a3d98858
Successfully built 9942a3d98858
Successfully tagged fndemouser/multiply:0.0.2

Updating function multiply using image fndemouser/multiply:0.0.2...
Successfully created function: multiply with fndemouser/multiply:0.0.2
Successfully created trigger: multiply
Trigger Endpoint: http://127.0.0.1:18080/t/calc-fn-app/multiply

Überprüfen Sie mit dem Befehl fn. (Plus, Minus werden in einem anderen Eintrag gemacht)

$ fn list fn calc-fn-app
NAME            IMAGE                           ID
multiply        fndemouser/multiply:0.0.2       01E086F2D6NG8G00GZJ000001E
plus            fndemouser/plus:0.0.2           01E0393FDCNG8G00GZJ000000E
subtract        fndemouser/subtract:0.0.3       01E05KAKGENG8G00GZJ0000013

Wenn Sie mit dem Docker-Befehl überprüfen, können Sie sehen, dass das entsprechende Container-Image erstellt wird.

$ docker images | grep multiply
fndemouser/multiply   0.0.2               9942a3d98858        About a minute ago   175MB

Lauf

Versuchen Sie, mit curl auf die URL am Ende der Registrierung zuzugreifen.

$ curl -d '{"left":"2", "right":"4"}' http://127.0.0.1:18080/t/calc-fn-app/multiply
{"result": "8"}

8, das das Ergebnis von 2 * 4 ist, wird zurückgegeben.

abschließend

In diesem Eintrag habe ich versucht, eine in Python geschriebene Funktion mit dem Fn-Projekt auszuführen.

Der in diesem Eintrag verwendete Code lautet https://github.com/hrkt/calc-fn-app/releases/tag/0.0.3. Es wird im Tag von Releases / Tag / 0.0.3) gespeichert.

Ergänzung: Externe Bibliothek

Ich habe keine externe Bibliothek für diesen Eintrag verwendet, aber Sie können pip verwenden, indem Sie es in der Datei "resources.txt" auflisten.

Hinweis: Schreiben Sie diesen Eintrag

Beim Schreiben dieses Eintrags habe ich die folgende Situation auf der OCI-Mikroinstanz erstellt und sie per Fernzugriff vom Notebook-PC mit der Cloud-Seite mit ssh verbunden.

Recommended Posts

Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen
Erstellen Sie eine Funktion in Python
Versuchen Sie es mit LevelDB mit Python (plyvel)
So geben Sie char * in einer Rückruffunktion mit ctypes in Python zurück
Versuchen Sie, ein neuronales Netzwerk in Python aufzubauen, ohne eine Bibliothek zu verwenden
Ein Memo, dass ich eine Grundfunktion in Python mit Wiederholung geschrieben habe
Versuchen Sie es mit LeapMotion mit Python
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Scraping von Websites mit JavaScript in Python
Zeichnen Sie mit graphviz eine Baumstruktur in Python 3
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Zeichnen Sie in Python ein Diagramm einer quadratischen Funktion
Erstellen Sie eine GIF-Datei mit Pillow in Python
Holen Sie sich den Aufrufer einer Funktion in Python
Anzeigen von Arzneimittelbewertungen mithilfe von Listen in Python
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Versuchen Sie, die ChatWork-API und die Qiita-API in Python zu verwenden
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Versuchen Sie gRPC in Python
Probieren Sie 9 Slices in Python aus
Versuchen Sie es mit Tweepy [Python2.7]
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Versuchen Sie, eine komprimierte Datei mit Python und zlib zu erstellen
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Versuchen Sie, in Python nach einem Profil mit einer Million Zeichen zu suchen
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Was bedeutet das letzte () in einer Funktion in Python?
So testen Sie eine Funktion, die die aktuelle Zeit enthält, mit Freezegun in Python
Machen Sie einen Screenshot in Python
Versuchen Sie es mit GUI, PyQt in Python
Versuchen Sie, das DeepZoom-Dateiformat .DZI in Python zu erstellen
[Python] Versuchen Sie, Tkinters Leinwand zu verwenden
Verwenden Sie die Rückruffunktion in Python
Versuchen Sie die Funktionsoptimierung mit Hyperopt
ntile (Dezil) -Funktion in Python
Versuchen Sie es mit Kubernetes Client -Python-
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
Ein Hinweis beim Erstellen eines gerichteten Diagramms mit Graphviz in Python
Versuchen Sie LINE Notify mit Python
Zeichne die Yin-Funktion in Python
[Python] Verwalten Sie Funktionen, indem Sie sie in ein Wörterbuch einfügen (Befehlstabelle, Funktionstabelle, Funktionszeiger).
Versuchen Sie, Python mit Try Jupyter auszuführen
Lassen Sie uns Yuma in Python 3 implementieren
Sofortige Funktion (Lüge) in Python
Gacha geschrieben in Python -BOX Gacha-
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Zeichne ein Herz in Python
Wrapper mit Hadoop in Python