[PYTHON] Ich möchte eine externe Bibliothek mit IBM Cloud-Funktionen verwenden

Für die Sprachen, die standardmäßig von IBM Cloud Functions unterstützt werden, werden standardmäßig verschiedene Bibliotheken bereitgestellt. Um jedoch mit einer Bibliothek zu entwickeln, die nicht in der Standardeinstellung enthalten ist, ist die Entwicklung über die Befehlszeile unerlässlich. Da Java keine GUI-Entwicklungsumgebung hat, ist die Entwicklung über die Befehlszeile unerlässlich. Dieses Mal werde ich zusammenfassen, was mir beim Entwickeln von Cloud-Funktionen über die Befehlszeile am Beispiel von Python nicht gelungen ist. Außerdem gehen wir diesmal davon aus, dass Docker im Voraus installiert ist. (Wenn Sie sich in einer anderen Sprache entwickeln, können Sie sie meiner Meinung nach entwickeln, wenn Sie sie richtig lesen.)

Versuchen Sie zunächst, es gemäß dem Dokument zu erstellen

Dieses Mal möchte ich das LINE Bot SDK von Python installieren. Hier Lesen Sie das Dokument und erstellen Sie den Inhalt von `` `require.txt``` wie folgt Ich werde.

# Requirements.txt contains a list of dependencies for the Python Application #

# Setup modules
gevent == 1.4.0
flask == 1.0.2

# default available packages for python3action
beautifulsoup4 == 4.8.0
httplib2 == 0.13.0
kafka_python == 1.4.6
lxml == 4.3.4
python-dateutil == 2.8.0
requests == 2.22.0
scrapy == 1.6.0
simplejson == 3.16.0
virtualenv == 16.7.1
twisted == 19.7.0
PyJWT == 1.7.1

# packages for numerics
numpy == 1.16.4
scikit-learn == 0.20.3
scipy == 1.2.1
pandas == 0.24.2

# packages for image processing
Pillow == 6.2.1

# IBM specific python modules
ibm_db == 3.0.1
cloudant == 2.12.0
watson-developer-cloud == 2.8.1
ibm-cos-sdk == 2.5.1
ibmcloudsql == 0.2.23

# Compose Libs
psycopg2 == 2.8.2
pymongo == 3.8.0
redis == 3.2.1
pika == 1.0.1
elasticsearch == 6.3.1
cassandra-driver == 3.18.0
etcd3 == 0.10.0

#Additional modules
line-bot-sdk

Verwenden Sie nach dem Erstellen der Textdatei den Docker-Befehl, um die Betriebsumgebung von Functions abzurufen und ein Paket der virtuellen Umgebung von Python zu erstellen.

$ docker pull ibmfunctions/action-python-v3.7
$ docker run --rm -v "$PWD:/tmp" ibmfunctions/action-python-v3.7 bash -c "cd /tmp && virtualenv virtualenv && source virtualenv/bin/activate && pip install -r requirements.txt"

Unten finden Sie den Code (`` `__ main__. Py```), der bei der Bereitstellung ausgeführt wird.

__main__.py


def main(args):
    return {"result":"OK!"}

Komprimieren Sie das soeben erstellte Paket und den Code in eine Zip-Datei und erstellen Sie die Aktion über die Befehlszeile. Fahren Sie außerdem fort, während Sie mit dem IBM Cloud-Befehl angemeldet sind.

$ zip -r hellobot.zip virtualenv __main__.py
$ ibmcloud fn action create hellobot hellobot.zip --kind python:3.7

Dann wurde das Ausführungsergebnis wie folgt ausgegeben.

error: Unable to create action 'my-action-name': The connection failed, or timed out. (HTTP status code 413)

Oh? Warum wird dieser Fehler angezeigt, obwohl ich ihn nicht eingegeben habe?

Ich habe versucht, die Ursache herauszufinden

Nachdem ich die Ursache dieses Fehlers untersucht hatte, fand ich diesen Artikel über Stackoverflow. IBM Cloud functions - Unable to create an action Laut der Antwort der Person, die für IBM Cloud-Funktionen verantwortlich ist, scheint dies ein Fehler auf der Befehlszeilenseite zu sein, und es scheint, dass Aktionen nicht auf diese Weise erstellt werden können. (Schreiben Sie es in das Dokument)

Erstellen Sie Aktionen mit Docker Hub (lesen Sie hier, wenn Sie beschäftigt sind)

Der zuvor erwähnte Stapelüberlauf sagte nicht nur, dass er nicht verwendet werden konnte, weil es sich um einen Fehler handelte, sondern bot auch eine alternative Lösung, sodass ich ihn beim nächsten Mal dort ausprobieren möchte. Lesen Sie hier, erstellen Sie Ihre eigene virtuelle Umgebung, laden Sie sie auf Docker Hub hoch und ergreifen Sie dann Maßnahmen. Erstellen. Diese Methode ist für diejenigen, die an die Bedienung von Docker gewöhnt sind, einfach, für diejenigen, die sie noch nie berührt haben, kann sie jedoch schwierig sein.

Erstellen Sie eine Ausführungsumgebung

Bereiten Sie zunächst eine Docker-Datei für die Aktionsausführungsumgebung vor.

FROM openwhisk/actionloop-python-v3.7:36721d6

COPY requirements.txt requirements.txt

RUN pip install --upgrade pip setuptools six && pip install --no-cache-dir -r requirements.txt

Wie Sie in der Docker-Datei sehen können, ist die darin enthaltene `` `require.txt``` dieselbe wie die zuvor erstellte, sodass der Inhalt weggelassen wird. Nachdem Sie alle erforderlichen Dateien haben, führen Sie den folgenden Befehl aus, um ein Bild zu erstellen. Die Fertigstellung wird einige Zeit dauern.

$ docker build -t linebot_function .

Laden Sie das erstellte Image in Docker Hub hoch. Wenn Sie sich nicht bei Docker Hub registriert haben, registrieren Sie sich bitte über hier. Melden Sie sich nach der Registrierung über den Docker-GUI-Bildschirm bei Docker Hub an. Verwenden Sie nach der Anmeldung den folgenden Befehl, um das erstellte Bild zu markieren und hochzuladen.

$ docker tag linebot_function YOUR_USER_NAME/linebot_function
$ docker push YOUR_USER_NAME/linebot_function

Erstellen Sie eine Aktion

Nachdem wir die Ausführungsumgebung bereit haben, bereiten wir den Code für die Ausführung vor. Dieses Mal habe ich das Python SDK des LINE-Bots als externe Bibliothek installiert. Überprüfen Sie daher, ob es ordnungsgemäß enthalten ist. Bereiten Sie also den folgenden Code vor.

first-linebot.py


import linebot

def main(args):
    return {"LINEbot":linebot.__version__}

Sobald Sie den Code haben, ist es Zeit, die Aktion zu erstellen. Installieren Sie zunächst das Plug-in IBM Cloud Functions.

$ ibmcloud plugin install cloud-functions

Richten Sie die Ressourcengruppe mit dem folgenden Befehl aus. Melden Sie sich für den Gruppennamen von hier an und überprüfen Sie.

$ ibmcloud target -o <org> -s <space> 

Nachdem Sie den Code haben, erstellen Sie eine Aktion mit dem folgenden Befehl.

$ ibmcloud fn action create first-linebot --docker YOUR_USER_NAME/linebot_function first-linebot.py

Wenn das Ergebnis fehlerfrei zurückgegeben wird, ist es erfolgreich.

Funktionsprüfung

Überprüfen Sie den Betrieb der erstellten Aktion. Die in der Docker-Ausführungsumgebung erstellten Aktionen können jedoch nicht über die GUI überprüft werden. Dies wird daher auch über die Befehlszeile ausgeführt. Führen Sie den folgenden Befehl aus.

$ ibmcloud fn action invoke first-linebot --result

Wenn die LINE bot SDK-Version nach der Ausführung als Ergebnis ausgegeben wird, funktioniert die Aktion in Ihrer eigenen Umgebung einwandfrei.

{
    "LINEbot": "1.15.0"
}

Ich denke, dies wird den Bereich der Aktionen erweitern, die Sie erstellen können. Ich werde versuchen, einen serverlosen LINE-Bot unter Verwendung der diesmal erstellten Umgebung zu erstellen.

Sie können den Artikel sehen, der den LINE-Bot von [hier] erstellt hat (https://qiita.com/K_M95/items/b389a89941fe9329927c).

Recommended Posts

Ich möchte eine externe Bibliothek mit IBM Cloud-Funktionen verwenden
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Ich möchte MATLAB feval mit Python verwenden
Ich möchte OREMO mit setParam sein!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
Ich möchte ip vrf mit SONiC verwenden
Ich möchte ein Bild mit Lollipop in WebP konvertieren
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Verwendung eines externen Editors für die Python-Entwicklung mit Grasshopper
Ich möchte wirklich GitHub Flavored Markdown (GFM) mit Pelican verwenden!
Ich möchte Objekte mit OpenCV erkennen
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte ein Glas aus Python verwenden
Ich möchte Linux auf dem Mac verwenden
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte IPython Qt Console verwenden
Ich möchte ein Automatisierungsprogramm erstellen!
Ich möchte DB mit Djangos ORM von einer externen Anwendung aus betreiben
Tipps zum Bearbeiten von numpy.ndarray aus c ++ - Ich möchte einen Iterator verwenden -
[AWS] [GCP] Ich habe versucht, die Verwendung von Cloud-Diensten mit Python zu vereinfachen
Ich möchte ein Ubuntu Chrome-Benutzerprofil nur mit Colab erstellen
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich möchte ein Spiel mit Python machen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich möchte Ceres Solver aus Python verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
Serverloser LINE-Bot mit IBM Cloud-Funktionen
Ich möchte mit Djangos Migrate von vorne beginnen
Ich möchte mit Python in eine Datei schreiben
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich möchte Google Mail mit Python senden, kann dies jedoch aufgrund eines Fehlers nicht
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
Ich möchte Variablen / Funktionen / Klassen externer Dateien von Python abrufen / ausführen
Ich möchte mkl mit numpy und scipy unter pyenv + Poesie verwenden
[Python] Ich möchte mit Flask ein statisches Verzeichnis hinzufügen. [Ich möchte etwas anderes als statisch verwenden.]
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Ich möchte mit Jubatus (1) eine nicht autorisierte Anmeldung bei Facebook erkennen.
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mich mit Backpropagation (tf.custom_gradient) (Tensorflow) selbst verwenden.
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte Android-Apps auf Android entwickeln (Debug)
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich möchte mit Python-Datenklasse nach hinten erben
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte manuell eine Legende mit matplotlib erstellen