5-04 无伺服器环境搭建

5.3 无伺服器环境搭建

无伺服器 (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-04 无伺服器环境搭建_第1张图片

图 5-3-1 Lambda 控制台编辑器与 AWS CLI

而部署的内容则是有分成没有依赖项的函数与具有额外依赖项的函数,没有依赖项的 Lambda 比较单纯,只要直接写完 .py 的代码,透过上述的两种方式中的任何一种方式上传就可以,但如果考虑到要调用 AWS 的内部资源,就必须要 import boto3 包方可调用,但因为还涉及调用权限的问题,比较复杂,这里就不举例说明。而如果是要建立具有额外依赖项的 Lambda 函数,则需要把额外依赖项一并打包上传,而产生额外依赖项的方式有以下这些选项:

  • 使用 venv 虚拟环境,再透过 requirements.txt 来安装额外依赖项的类库包,需要有 Python 的环境
  • 使用 Lambda 执行环境兼容的 Docker 镜像内构建部署包的选项,需要有 docker 的环境,执行类似下方的命令来指定环境兼容的 Docker 镜像 (lambci/lambda:build-python3.6),并安装需要的类库包。将目前所在文件夹 $(pwd) 对应到镜像内的 /foo 文件夹,将所需类库包 requirements.txt 安装到指定文件夹 ${PKG_DIR} 中,为了节省空间只安装需要的类库包,不安装这些类库包相依的类库包 --no-deps 。
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 pip install -r requirements.txt --no-deps -t ${PKG_DIR}
  • 使用 AWS 无伺服器框架 (AWS SAM CLI),使用 AWS 定义好的服务 (AWS Serverless Application Model)
  • 使用依赖层,AWS Lambda 可以让使用者再自行开发的 Lambda 函数建构在已定义好的依赖层,这依赖层可以自己定义,也可以用事先定义好的,如下图所示,AWS 已有提供较常见的 numpy, scipy等包。

5-04 无伺服器环境搭建_第2张图片

图 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-04 无伺服器环境搭建_第3张图片

图 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-04 无伺服器环境搭建_第4张图片

图 5-3-4 打包压缩虚拟环境和运行代码

步骤 4. 透过 AWS Lambda 控制台编辑器上传

进入 AWS 管理控制台,登入后选择 Lambda 服务,进入 Lambda 控制台,可以看到 1. AWS Lambda 主功能侧边栏 2. 按下右手边的 创建函数

5-04 无伺服器环境搭建_第5张图片

图 5-3-5 AWS Lambda 主画面

在创建函数画面中选择:

从头开始创作

基本信息

函数名称: czcit-func
运行时: Python 3.7

5-04 无伺服器环境搭建_第6张图片

图 5-3-6 AWS Lambda 创建函数画面

接着在函数代码区中上传刚刚建立好的 zip 压缩包即可,系统建议 10 MB 以上的压缩包最好是透过 S3 来上传, S3 是 AWS 所提供的云端存储空间,开发者可以先将文档放到 S3 ,而不用直接上传到 Lambda。

5-04 无伺服器环境搭建_第7张图片

图 5-3-7 AWS Lambda 函数代码上传 zip 文件

上传成功后,还需要指定处理程序,这样 AWS Lambda 才知道要启动那个程序来运行,而处理程序的命名规则是文件名称加上函数名称 serverless4req.lambda_handler

5-04 无伺服器环境搭建_第8张图片

图 5-3-8 AWS Lambda 设定处理程序

接着配置测试是键,因为这个案例并没有需要输入,所以画面下的输入是可以删除的。

5-04 无伺服器环境搭建_第9张图片

图 5-3-9 AWS Lambda 配置测试事件

最后进行测试并观察输出结果,程式的运行是导入 requests 包,并显示包的版本号 2.25.0。

5-04 无伺服器环境搭建_第10张图片

图 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-04 无伺服器环境搭建_第11张图片

图 5-3-11 AWS CLI 创建并调用 AWS Lambda 函数

Python数据处理-文章目录

你可能感兴趣的:(Python数据处理,Python)