我想在IBM Cloud Functions中使用外部库
使用IBM Cloud Functions时,支持各种标准语言,并提供了各种默认库。但是,如果要使用不在默认库中的库进行开发,则必须在命令行中进行开发。此外,由于Java没有GUI开发环境,因此必须使用命令行进行开发。因此,本次将总结在使用命令行开发Cloud Functions时遇到的问题,以Python为例。请注意,在继续讨论之前,我们假设您已经预先安装了docker。(如果使用其他语言进行开发,按照相关适宣进行阅读,应该可以进行开发。)
首先按照文件中的指示尝试进行制作。
我想要安装Python的LINE bot SDK这次。请根据这份文件,创建以下内容的requirements.txt。
# 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
在创建文本文件之后,使用Docker命令获取Functions的运行环境,并创建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"
以下是部署时执行的代码(__main__.py):
def main(args):
return {"result":"OK!"}
将刚刚创建的软件包和代码压缩成zip文件,并使用命令行创建一个操作。需要注意的是,在已登录IBM Cloud命令行的状态下继续进行。
$ zip -r hellobot.zip virtualenv __main__.py
$ ibmcloud fn action create hellobot hellobot.zip --kind python:3.7
然后,执行的结果被输出如下。
error: Unable to create action 'my-action-name': The connection failed, or timed out. (HTTP status code 413)
哎呀?明明没有打错字,为什么会出现这样的错误呢?
我进行了原因调查。
当我调查了一下这个错误,我在Stackoverflow上找到了这篇文章。
IBM Cloud functions – 无法创建一个操作
根据IBM Cloud Functions的负责人的回答,这似乎是命令行端的一个错误,看起来无法通过这种方式创建一个操作。(这个应该写在文档上啊)
使用Docker Hub创建操作(如果时间紧张,请从这里开始阅读)。
不仅在先前的Stackoverflow问题中指出了无法使用因为存在bug,还提供了替代解决方案,因此我希望下次能够尝试那个解决方案。我将参考这个方案自己构建虚拟环境并将其上传到Docker Hub,然后创建操作。这种方法对于熟悉Docker操作的人来说很简单,但对于没有接触过的人可能会有些难以理解。
建立执行环境
首先,准备操作环境的Dockerfile。
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
根据Dockerfile中的内容,您可以看出requirements.txt是直接使用之前创建的文件,所以省略了其内容。现在我们已经准备好了所有必要的文件,接下来执行以下命令来创建镜像。这个过程可能需要花费一些时间才能完成。
$ docker build -t linebot_function .
将创建的镜像上传到Docker Hub。如果您还没有注册Docker Hub,请从这里注册。注册后,在Docker的GUI界面中登录到Docker Hub。登录成功后,使用以下命令给创建的镜像打上标签并上传。
$ docker tag linebot_function YOUR_USER_NAME/linebot_function
$ docker push YOUR_USER_NAME/linebot_function
创建一个动作
既经为准备好执行环境,现在我们将准备要运行的代码。这次作为外部库,我们安装了LINE Bot的Python SDK,现在要确认它是否已正确安装。因此,我们准备了以下代码。
import linebot
def main(args):
return {"LINEbot":linebot.__version__}
一旦准备好代码,我们就可以开始创建行动了。首先,我们需要安装IBM Cloud Functions插件。
$ ibmcloud plugin install cloud-functions
请使用以下命令定位资源组。关于组名,您可以登录并确认。
$ ibmcloud target -o <org> -s <space>
因为我已经准备好了代码,所以将使用下面的命令来创建动作。
$ ibmcloud fn action create first-linebot --docker YOUR_USER_NAME/linebot_function first-linebot.py
如果没有错误并成功返回结果,那就是成功。
确认行动
我們將進行所創建的動作的操作確認。但是,使用Docker環境創建的動作無法從圖形用戶界面進行操作確認,所以我們需要在命令行中執行操作。執行以下命令。
$ ibmcloud fn action invoke first-linebot --result
如果在执行后输出了LINE bot SDK的版本,则意味着自己的环境中的操作正常运行。
{
"LINEbot": "1.15.0"
}
我认为可以通过这种方式扩大可创建的行动范围。我打算利用这次构建的环境来创建一个无服务器的LINE机器人。
您可以通过这里查看有关创作LINE机器人的文章。