无伺服器 (Serverless) 是一个新兴的技术,是一个基于函数既服务 (Function as a Service, FaaS) 实作的一个架构,让开发者可以更专注在开发功能,改变了开发人员构建和交付软件的方式,它将基础设施和代码分离来简化开发过程,降低成本并提升效率。无伺服器平台提供各式接口,可以是网页服务形式或是 API 接口,允许开发人员运行代码函数并返回每个函数的结果,这些接口可以用作其他函数的输入,从而提供相关函数的触发事件。
以下就介绍亚马逊 AWS 所提供的无伺服器服务- AWS Lambda,将我们所撰写的 Python 代码项目,部署到 AWS 云上,开发者完全不用担心太多人调用伺服器是否能够负荷,主机的操作系统是 Windows 或是 Linux ,核心版本多少等等问题。
以下是亚马逊对于 AWS Lambda 的描述:AWS Lambda 无服务器计算具有自动扩展、内置高可用性以及按价值付费的计费模型。Lambda 是一种事件驱动的计算服务,使您能够运行代码来响应来自 150 多个本地集成的 AWS 和 SaaS 源的事件 — 所有这些都无需管理任何服务器。
接下来依据 AWS 官方手册所提供的方法来进行部署- Python 中的 AWS Lambda 部署程序包。AWS Lambda 提供了多个不同的方式来进行部署。
操作界面可分为网页式的 Lambda 控制台编辑器与 AWS 命令行界面 CLI。如下图所示
图 5-3-1 Lambda 控制台编辑器与 AWS CLI
而部署的内容则是有分成没有依赖项的函数与具有额外依赖项的函数,没有依赖项的 Lambda 比较单纯,只要直接写完 .py 的代码,透过上述的两种方式中的任何一种方式上传就可以,但如果考虑到要调用 AWS 的内部资源,就必须要 import boto3 包方可调用,但因为还涉及调用权限的问题,比较复杂,这里就不举例说明。而如果是要建立具有额外依赖项的 Lambda 函数,则需要把额外依赖项一并打包上传,而产生额外依赖项的方式有以下这些选项:
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 pip install -r requirements.txt --no-deps -t ${PKG_DIR}
图 5-3-2 Lambda 控制台编辑器添加层
以下我们练习将一个具有额外依赖项的函数,在 WSL (Windows subsystem for Linux) 环境下使用 venv 虚拟环境来来安装额外依赖项的类库包,再透过 Lambda 控制台编辑器来建立一个Lambda 函数。注意,部署程序包是包含函数代码和依赖项的 ZIP 存档。如果您使用 Lambda API 管理函数,或者需要包含 AWS 开发工具包以外的库和依赖项,则需要创建部署程序包。您可以将程序包直接上传到 Lambda,也可以使用 Amazon S3 存储桶、然后再将其上传到 Lambda。如果部署包大于 50 MB,则必须使用 Amazon S3。
步骤 1. 进入 WSL 控制台窗口
按下 Windows 徽标键 + R,然后键入“wsl”,选择“确定”,启动另一个新的 WSL 控制台窗口,在控制台窗口中输入下列命令,先更新 WSL 的环境套件到最新版本,目前使用的 WSL 环境是 Ubuntu 18.04.5 LTS ,安装建立虚拟环境所需包 python3-pip, python3-venv,切换到 Python 代码所在文件夹, WSL 文件夹的规划方式是,Windows 主机的 C 盘或 D 盘对应到 WSL 环境内的 /mnt 文件夹下,接着建立虚拟环境 serverless 。
# 显示 Ubuntu 版本信息
lsb_release -d
# 更新并升级所有安装包到最新版本
sudo apt-get update -y
sudo apt-get upgrade -y
# 安装建立虚拟环境所需包
sudo apt-get install python3-pip python3-venv
# 将 pip 升级到最新版本,并设定国内安装用的镜像站
sudo pip3 install --upgrade pip
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 切换到 Python 代码所在文件夹,并建立虚拟环境
cd /mnt/d/czcit
python3 -m venv serverless
步骤 2. 建立 Lambda 函数
以下为一个导入 requests 包并显示版本的 Python 代码,主要是将此代码上传到 AWS Lambda 并进行调用,因为 requests 包并非是内建包,所以需要在虚拟环境中安装。而撰写规则是需要定义一个 handler 作为 AWS Lambda 函数调用,而 handler 的组成方式就是 文件名.函数名称 ,以下范例而言 handler 就是 serverless4req.lambda_handler 。
serverless4req.py
import json
import requests
def lambda_handler(event, context):
# TODO implement
string = requests.__version__
return {
'statusCode': 200,
'body': json.dumps(string)
}
步骤 3. 在虚拟环境中建立所需元件
进入 serverless 虚拟环境,并在虚拟环境中设定可运行的组态,再来是把这些组态打包压缩,准备上传到 AWS Lambda 中。
source ./serverless/bin/activate
pip3 list
python serverless4req.py
pip3 install --no-cache-dir requests
python serverless4req.py
deactivate
图 5-3-3 虚拟环境中设定可运行的组态
export PYPATH=/mnt/d/czcit
cd serverless/lib/python3.6/site-packages/
zip -r9 ${PYPATH}/function.zip . > /dev/null
cd $PYPATH
zip -g function.zip serverless4req.py
图 5-3-4 打包压缩虚拟环境和运行代码
步骤 4. 透过 AWS Lambda 控制台编辑器上传
进入 AWS 管理控制台,登入后选择 Lambda 服务,进入 Lambda 控制台,可以看到 1. AWS Lambda 主功能侧边栏 2. 按下右手边的 创建函数
图 5-3-5 AWS Lambda 主画面
在创建函数画面中选择:
从头开始创作
基本信息
函数名称: czcit-func
运行时: Python 3.7
图 5-3-6 AWS Lambda 创建函数画面
接着在函数代码区中上传刚刚建立好的 zip 压缩包即可,系统建议 10 MB 以上的压缩包最好是透过 S3 来上传, S3 是 AWS 所提供的云端存储空间,开发者可以先将文档放到 S3 ,而不用直接上传到 Lambda。
图 5-3-7 AWS Lambda 函数代码上传 zip 文件
上传成功后,还需要指定处理程序,这样 AWS Lambda 才知道要启动那个程序来运行,而处理程序的命名规则是文件名称加上函数名称 serverless4req.lambda_handler
图 5-3-8 AWS Lambda 设定处理程序
接着配置测试是键,因为这个案例并没有需要输入,所以画面下的输入是可以删除的。
图 5-3-9 AWS Lambda 配置测试事件
最后进行测试并观察输出结果,程式的运行是导入 requests 包,并显示包的版本号 2.25.0。
图 5-3-10 AWS Lambda 进行测试并观察结果
步骤 5. 透过 AWS 命令行界面 CLI 上传
AWS Lambda 也可以透过命列行的方式来完成步骤 4 的操作,关于 AWS CLI 的设定,请自行参阅 AWS 的官方文件,因为运行 AWS CLI 需要取得认证权证,不然没办法确保安全性,以下只说明相关命令。透过 create-function 选项建立一个 Lambda 函数,需要指定函数名称,上传文件,处理程序,执行解释器以及运行时的角色,因为角色代表着运行时所具备的权限, lambdaExecutionRole 是系统预设具有运行 Lambda 函数的角色。 invoke 是调用 Lambda 函数的选项,会产生一个输出文件,最后检视文件内容是否正确。
aws lambda create-function --function-name my-function --zip-file fileb://function.zip --handler serverless4req.lambda_handler --timeout 3 --runtime python3.7 --role arn:aws:iam::950646218716:role/service-role/lambdaExecutionRole
aws lambda invoke --function-name my-function outfile
more outfile
图 5-3-11 AWS CLI 创建并调用 AWS Lambda 函数
Python数据处理-文章目录