[DOCKER] Je souhaite utiliser une bibliothèque externe avec IBM Cloud Functions

Différentes bibliothèques sont fournies par défaut pour les langues prises en charge par IBM Cloud Functions en standard. Cependant, pour développer en utilisant une bibliothèque qui n'est pas dans la bibliothèque par défaut, le développement en ligne de commande est essentiel. De plus, Java n'a pas d'environnement de développement GUI, donc le développement sur la ligne de commande est essentiel. Donc, cette fois, je vais résumer ce que je suis resté bloqué lors du développement de Cloud Functions à partir de la ligne de commande en utilisant Python comme exemple. De plus, cette fois, nous procéderons en supposant que docker est installé à l'avance. (Si vous développez dans une autre langue, je pense que vous pouvez le développer si vous le lisez correctement.)

Tout d'abord, essayez de le faire selon le document

Cette fois, je voudrais installer le SDK LINE bot de python. Ici Reportez-vous au document et créez le contenu de `` requirements.txt '' comme suit Je vais.

# 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

Après avoir créé le fichier texte, utilisez la commande docker pour obtenir l'environnement d'exploitation de Functions et créer un package de l'environnement virtuel de Python.

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

Voici le code (`` `__ main__. Py '') qui s'exécute une fois déployé.

__main__.py


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

Compressez le package et le code que vous venez de créer dans un zip et créez l'action à partir de la ligne de commande. De plus, continuez tout en étant connecté avec la commande IBM Cloud.

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

Ensuite, le résultat de l'exécution a été affiché dans ce qui suit.

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

Oh? Pourquoi ai-je cette erreur même si je ne l'ai pas tapée?

J'ai essayé de découvrir la cause

Après avoir étudié la cause de cette erreur, j'ai trouvé cet article sur Stackoverflow. IBM Cloud functions - Unable to create an action Selon la réponse de la personne responsable d'IBM Cloud Functions, cela semble être un bogue côté ligne de commande, et il semble que les actions ne peuvent pas être créées de cette façon. (Écrivez-le dans le document)

Créez des actions à l'aide de Docker Hub (lisez ici si vous êtes occupé)

Non seulement le débordement Stack mentionné plus tôt indiquait qu'il ne pouvait pas être utilisé car c'était un bogue, mais il offrait également une solution alternative, alors j'aimerais l'essayer la prochaine fois. Reportez-vous à here, créez votre propre environnement virtuel, téléchargez-le sur Docker Hub, puis agissez. Créer. Cette méthode est facile pour ceux qui ont l'habitude d'utiliser Docker, mais elle peut être difficile pour ceux qui ne l'ont jamais touchée.

Créer un environnement d'exécution

Tout d'abord, préparez un Dockerfile pour l'environnement d'exécution des actions.

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

Comme vous pouvez le voir dans le Dockerfile, le requirements.txt``` qui apparaît ici est le même que celui créé précédemment, donc le contenu est omis. Maintenant que vous disposez de tous les fichiers nécessaires, exécutez la commande suivante pour créer une image. Cela prendra un certain temps.

$ docker build -t linebot_function .

Téléchargez l'image créée sur Docker Hub. Si vous ne vous êtes pas inscrit sur Docker Hub, veuillez vous inscrire depuis ici. Après votre inscription, connectez-vous à Docker Hub à partir de l'écran de l'interface graphique Docker. Une fois connecté, utilisez la commande suivante pour baliser et télécharger l'image créée.

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

Créer une action

Maintenant que l'environnement d'exécution est prêt, préparons le code pour l'exécuter. Cette fois, j'ai installé le SDK Python du bot LINE en tant que bibliothèque externe, alors vérifiez s'il est correctement inclus. Préparez donc le code suivant.

first-linebot.py


import linebot

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

Une fois que vous avez le code, il est temps de créer l'action. Tout d'abord, installez le plug-in IBM Cloud Functions.

$ ibmcloud plugin install cloud-functions

Ciblez le groupe de ressources avec la commande suivante. Pour le nom du groupe, connectez-vous depuis ici et vérifiez.

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

Maintenant que vous avez le code, créez une action avec la commande suivante.

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

Si le résultat est renvoyé sans aucune erreur, il réussit.

Contrôle de fonctionnement

Vérifiez le fonctionnement de l'action créée. Cependant, comme l'opération de l'action créée dans l'environnement d'exécution Docker ne peut pas être confirmée à partir de l'interface graphique, cela est également effectué en utilisant la ligne de commande. Exécutez la commande suivante.

$ ibmcloud fn action invoke first-linebot --result

Si la version du SDK du bot LINE est générée après l'exécution, l'action fonctionne correctement dans votre propre environnement.

{
    "LINEbot": "1.15.0"
}

Je pense que cela élargira la gamme d'actions que vous pouvez créer. Je vais essayer de créer un bot LINE sans serveur en utilisant l'environnement créé cette fois-ci.

Vous pouvez voir l'article qui a créé le bot LINE à partir de ici.

Recommended Posts

Je souhaite utiliser une bibliothèque externe avec IBM Cloud Functions
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
Je veux utiliser MATLAB feval avec python
Je veux être OREMO avec setParam!
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
Je souhaite utiliser ip vrf avec SONiC
Je veux convertir une image en WebP avec sucette
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je veux faire ○○ avec les Pandas
Je veux déboguer avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Comment utiliser un éditeur externe pour le développement Python avec Grasshopper
Je veux vraiment utiliser GitHub Flavored Markdown (GFM) avec Pelican!
Je veux détecter des objets avec OpenCV
Je veux écrire un blog avec Jupyter Notebook
Je veux utiliser jar de python
Je veux utiliser Linux sur mac
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je souhaite utiliser la console IPython Qt
Je veux faire un programme d'automatisation!
Je souhaite utiliser DB en utilisant l'ORM de Django à partir d'une application externe
Conseils pour manipuler numpy.ndarray à partir de c ++ -Je veux utiliser un itérateur-
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
Je souhaite créer un profil utilisateur Ubuntu Chrome avec Colab uniquement
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
Je veux moquer datetime.datetime.now () même avec pytest!
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
J'ai essayé de détecter un objet avec M2Det!
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
Bot LINE sans serveur conçu avec IBM Cloud Functions
Je veux recommencer avec Migrate de Django
Je veux écrire dans un fichier avec Python
Je souhaite utiliser la fonction d'activation Mish
Je souhaite envoyer Gmail avec Python, mais je ne peux pas en raison d'une erreur
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Je veux obtenir / exécuter des variables / fonctions / classes de fichiers externes à partir de Python
Je veux utiliser mkl avec numpy et scipy sous l'environnement pyenv + poetry
[Python] Je veux ajouter un répertoire statique avec Flask [Je veux utiliser autre chose que statique]
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Je souhaite détecter une connexion non autorisée à Facebook avec Jubatus (1)
Je veux faire la transition avec un bouton sur le ballon
Je veux utiliser self avec Backpropagation (tf.custom_gradient) (tensorflow)
Je veux gérer l'optimisation avec python et cplex
Je souhaite développer des applications Android sur Android (débogage)
Je voulais utiliser la bibliothèque Python de MATLAB
J'ai essayé d'implémenter le perceptron artificiel avec python
Je veux hériter de l'arrière avec la classe de données python
J'ai essayé de créer un pipeline ML avec Cloud Composer
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je veux AWS Lambda avec Python sur Mac!
Je souhaite créer manuellement une légende avec matplotlib