本文面向有 Python Web 基础的小伙伴

作者:HelloGitHub-吱吱

这里是 HelloGitHub 推出的《讲解开源项目》系列,今天要向小伙伴们介绍一个 Python 无服务(Serverless)框架 Zappa。

Zappa 让我们可以轻松部署 Python 应用程序:仅需几条命令、打包代码、上传云服务器、程序上线,bingo 一气呵成!从此减少部署成本,放下运维的重担。仅需你有一点点 Python Web 基础!

它到底有多便捷?一条命令即刻部署!

项目地址:https://github.com/Miserlou/Zappa

下面就让我们动手来试试吧!

一、前言

1.1 介绍 Serverless

刚开篇便提到了一个莫名其妙的名词:无服务(Serverless),一开始我也是问号脸,经过多方搜证,我们可以简单的认为 Serverless 是指不必担心底层基础结构,不需要管理服务器,从而来构建和运行应用程序。具体概念小课堂如下:

1.1.1 什么鬼?

回忆一下,平时上线一个简单的 Python Web 应用的过程。

  • 一个 24 小时不间断运行的服务器:比如云主机,用以搭建代码运行环境和进行系统配置,维持着运行我们的应用;

  • 部署 Web 服务器:我们需要选择合适的 Web 服务器,经过配置和启动,实现反向代理和负载均衡;

  • 域名绑定:最后如果要被广泛用户访问,我们需要注册域名,并且绑定在服务器;

  • 运营维护:配置和启动在应用上线之后,我们还需要管理和维护我们的服务器,预防黑客攻击,应对未来用户访问高峰期。

而对于使用 Serverless 架构的应用,我们只需要关心我们的应用编写和核心业务,无需操心云主机、操作系统、资源分配和 Web 服务器配置等相关问题,无需考虑服务器的规格大小、存储类型、网络带宽、自动扩缩容问题,无需再对服务器进行运维、不断打系统补丁和应用补丁、无需进行数据备份等工作。一切非核心业务都外包给了公共云营运商,让开发人员从复杂的部署和运维环境中脱身出来,专注于业务本身的价值。

用 Zappa 里的一句话说就是 “without any permanent infrastructure”(无需任何永久性基础设施)。

敲黑板,尽管从名字上说是 Serverless,但是仍然需要物理服务器,只是我们开发人员成了甩手掌柜。

1.1.2 好处有?

  • 降低运维需求和维护成本;

  • 完全自动化的弹性扩容和缩容:在业务高峰期时,产品的计算能力和容量自动扩大,承载更多的用户请求;反之,在业务下降时,所使用的资源也会同时收缩,避免资源浪费;

  • 节省开支,全新的计量计费模式:开发者仅需根据使用量来付费。在无业务量的情况下,不会有空闲资源占用,也不会有费用产生。

1.1.3 普遍认为 Serverless = FaaS + BaaS

  • BaaS(Backedn as a Service 后端即服务)

    • 后端,指的就是各种云产品和云服务,例如对象存储 OS ,消息队列 MQ,云数据库 DB,云缓存 Redis以及各种以 API 形式提供的服务。用户直接开通即可使用,无需考虑部署、扩容、备份、安全等各种运维工作。

  • FaaS(Functions as a Service 函数即服务)

    • 是 Serverless 的核心,让用户仅需编写和上传核心业务代码,交由平台完成部署、调度、流量分发和弹性伸缩等能力,它提供了一种新的方式来提供计算资源,进一步降低云计算的使用门槛。

1.1.4 AWS Lambda

在该项目中,伸手白piao AWS 海外区域账户免费 AWS Lambda 套餐。AWS Lambda 作为 Serverless 最早的框架产品由亚马逊在2014年推出,是一种无服务器的计算服务,无需预置或管理服务器即可运行代码。Lambda 几乎可以为任何类型的应用程序或后端服务运行代码,我们只需上传相应的代码,它会处理运行和扩展代码所需的一切工作。

1.2 Python 的 Serverless 框架

本篇文章的主角:Zappa 登场!我们可以通过 Zappa 工具体验一下 Serverless 技术,用它实现我们 Python 应用程序的无服务器部署,初步体验无限伸缩扩展、零宕机、零维护的快捷。有了 Zappa,我们无需:

  • 配置 Web 服务器

  • 付费 24/7 服务器的正常运行时间

  • 担心负载平衡和可扩展性

  • 保持自己的服务器时刻在线状态

二、亲自动手

实战时间:已经实验(踩坑)成功(不断)的我就来分享部署一个简单的 Flask 应用的过程,不要担心跟着做你也可以~

2.1 环境

  1. Python版本要求:3.6/3.7/3.8

  2. 测试系统:Ubuntu 18.04.4 LTS

2.2 准备

  1. 保证自己的项目是运行在虚拟环境下。

    # 需要安装 Python 3.x 版本
    python --version# 安装 Pipenv
    pip install --user pipenv# 进入自己的项目
    cd demo# 实例化 pipfile 和 venv
    pipenv shell
    

  2. 安装 Zappa 和 Flask,项目需要其他库的话,可自行添加。

    $ pipenv install zappa flask
    

  3. 在目录下创建 my_app.py 文件,写入官方样例,可以先 pipenv run python my_app.py看看是否能正常运行

    from flask import Flask
    app = Flask(__name__)@app.route('/')
    def hello():return "hello, from Zappa!\n"if __name__ == '__main__':app.run()
    
  4. 注册 AWS 账户,并且正确安装 AWS credentials file

  • 登录 AWS,找到 My Security Credentials 下的 Access keys (access key ID and secret access key) ,如果没有则创建一个,记住 access key IDsecret access key

  • 安装 AWS 的命令行界面,添加 credentials

    # 在虚拟环境下安装
    pipenv install awscli# 查看信息
    aws configure list# 添加,并且按照提示将 access key ID 和 secret access key 填入
    aws configure# 后两个 region name 和 output format 选填
    

  • 此时在 ~/.aws 目录下会出现两个文件 config 和 credentials,credentials 中储存了 AWS 的 access key IDsecret access key, config 中储存了 region name 和  output format 信息。

  • 如果是在 Windows 上操作的同学,可以查看官方提供的安装 AWS credentials file 的教程。

2.3 安装与配置

  1. 通过执行下面语句进行初始化,定义部署和配置的设置,自动检测应用类型(Flask 或 Django)

    $ zappa init
    

    在执行过程中,可能需要如下设置,后续也可以在新生成的 zappa_setting.json 的配置文件中修改:

    完成后,我们的项目目录中将有一个 zappa_settings.json 文件,里面是我们刚刚定义的基本部署设置,后期我们可以按照自己的需求修改此文件。

    {"dev": {"app_function": "my_app.app","profile_name": null,"project_name": "demo","runtime": "python3.6","s3_bucket": "zappa-ti0ra29xi"}
    }
    
  2. 注意如果之前已经在 ~/.aws/config 文件中添加 region 信息,则会在 zappa init 的时候自动寻找到这些 region 信息,无需后续修改。

    如果之前没有添加,则修改 zappa_settings.json,添加 region 信息如下:

    # 修改如下
    {"dev": {"app_function": "my_app.app","profile_name": null,"project_name": "demo","runtime": "python3.6","s3_bucket": "zappa-ti0ra29xi""aws_region": "us-west-2"}
    }
    

    region 的信息可以自行选择。

2.4 部署和使用

配置设置后,可以使用如下命令将应用程序打包并部署:

$ zappa deploy dev

当我们调用 deploy 时,Zappa 会自动将我们的应用程序和本地虚拟环境打包到 Lambda 兼容的 archive,用为 Lambda 预先编译的版本替换所有依赖项,设置功能处理程序和必要的 WSGI 中间件,然后上传 archive 到 S3,创建和管理必要的Amazon IAM 策略和角色,将其注册为新的 Lambda function,创建新的 API 网关资源,为其创建 WSGI 兼容的路由,将其链接到新的 Lambda function,最后从 S3 bucket 中删除 archive。

执行成功后,就会出现一个链接,点击链接即可访问我们的简易 Web 应用。看到已上线的应用程序,心内窃喜,直呼快准狠。

三、其他命令

  1. 更新操作:假设应用程序已经部署完毕,并且只需要上传新的 Python 代码,而无需修改基础路由,则可以执行以下操作:

    $ zappa update dev
    

    这将创建一个新的 archive,将其上传到 S3 并更新 Lambda function 以使用新代码。

  2. 查看部署和事件计划的状态,只需使用命令:

    $ zappa status production
    
  3. 查看部署的日志:

    $ zappa tail dev# 过滤 HTTP 请求
    $ zappa tail dev --http# 执行相反操作,并且仅显示非 HTTP 事件和日志消息
    $ zappa tail dev --non-http# 选择时长
    $ zappa tail dev --since 4h # 4 hours
    
  4. 回滚操作:通过提供要返回的修订版本数将部署的代码回滚到以前的版本。

    # 回滚到3年前部署的版本
    $ zappa rollback production -n 3
    
  5. 安排 function 定期执行:修改 zappa_setting.json ,加入如下内容:

    {"dev": {..."events": [{// The function to execute"function": "your_module.your_function",// When to execute it (in cron or rate format)"expression": "rate(1 minute)" }],...}
    }
    

    然后执行如下操作,我们的 function 就会在每分钟执行一次。

    $ zappa schedule dev# cancal
    $ zappa unschedule dev
    
  6. 取消部署:如果要删除以前发布的 API Gateway 和 Lambda function,则只需:

    $ zappa unschedule dev
    

四、踩坑建议

在成功运行一次之前,踩坑千千万万遍,都是因为自己手残眼瞎魔改了很多地方,把经历过的报错记录下来,分享给和我一样的小小白。

  1. “Unable to import module ‘handler’: attempted relative import with no known parent package”:原因是我们期望的依赖在虚拟的环境中没有,需要查看自己虚拟环境中的依赖是否完整。

  2. 出现如下报错,可以更换一个 region 信息。

    $ zappa deploy dev
    Calling deploy for stage dev..
    Creating demo-dev-ZappaLambdaExecutionRole IAM Role..
    Error: Failed to manage IAM roles!
    You may lack the necessary AWS permissions to automatically manage a Zappa execution role.
    Exception reported by AWS:An error occurred (InvalidClientTokenId) when calling the CreateRole operation: The security token included in the request is invalid.
    To fix this, see here: https://github.com/Miserlou/Zappa#custom-aws-iam-roles-and-policies-for-deployment
    
  3. 如果我们在 zappa init 的时候,不使用默认分配的 s3_bucket ,则须注意自己的名称是不允许重名的,否则会报错 botocore.errorfactory.BucketAlreadyExists: An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

五、写在最后

是不是当自己成功部署后,突然觉得妙不可言,一身轻松,好像再也没有了之前所说的繁琐的过程,反而几条命令,白piao AWS 的服务,咱的应用程序就轻巧上线了呢,还不赶紧把生成的链接分享给小伙伴们点击一下。

至此,我们已经可以基本实现快速部署一个简单的 Flask 应用了,由于篇幅有限,还有部分 Zappa 的高级功能没有提及,以及如何使用 Zappa 部署 Django 应用或者一个更为庞大的项目(包含数据库等),希望感兴趣的小伙伴们能够多多尝试,我已经开始期待的搓搓手了。如果大家对开源项目感兴趣,请第一时间关注 HelloGitHub,我们将会为大家带来更多有趣的干货内容。

????「点击关注」更多惊喜等待你!

上线 Python 应用仅需一条命令的开源框架:Zappa(详细教程)相关推荐

  1. centos----只需三条命令利用iptables和ipset长期封禁ip和临时封禁ip

    只需三条命令利用iptables和ipset长期封禁ip和临时封禁ip 下面的是临时封禁ip,请根据自己的情况修改,比如最后登录失败的2000条记录,截取失败次数最多的前60名 [root@cento ...

  2. 台式计算机设备序列号,只需一条命令,就可以查找计算机序列号,真是方便

    在Windows 10上,在许多情况下需要检查计算机的序列号,例如,当你需要创建连接到家庭网络或组织的设备的清单,或需要联系技术支持来排除问题.订购更换部件或检查保修信息时. 通常可以在笔记本电脑或台 ...

  3. Python爬虫仅需一行代码,熟练掌握crawl第三方库

    simple_crawl 仅需一行代码即可达到爬虫效果 使用方法 私信小编01即可大量获取Python学习资料 pip install simple_crawl 以下源代码为简单介绍,详细功能介绍再源 ...

  4. python idle撤回上一条命令_找回Python IDLE Shell里的历史命令(用上下键翻历史命令怎么不好用了呢?)...

    习惯了终端的上下键调出历史命令之后,在Python IDLE的shell用上下键调不出历史命令,开始我还以为Python Shell不保存历史命令呢,后来发现是调历史命令的快捷键不对. Python ...

  5. Python爬虫仅需一行代码----crawl第三方库

    仅需一行代码写爬虫–simple_crawl simple_crawl 仅需一行代码即可达到爬虫效果 项目地址(欢迎star):https://github.com/Amiee-well/crawl ...

  6. MySQL命令行下载安装配置——详细教程

    安装一定要装在C盘,下载别的盘可能不好使 文章目录 免安装版的MySQL MySQL命令行下载 1.打开官网下载 2.点击 MySQL Community Server 3.选择适合的版本 MySQL ...

  7. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 从接触 Python 时起,我就觉得 Python 的元组解包(u ...

  8. windows命令_用Windows恢复环境(WinRE)排除电脑故障,只需一条命令

    在Windows10上,Windows Recovery Environment(Windows恢复环境,WinRE)是一项功能,它将自动修复.重置为出厂默认设置.系统映像恢复和其他故障排除工具捆绑在 ...

  9. 红帽linux安装docker,在CentOS7.6、红帽7.6系统中安装Docker:只需3条命令

    在CentOS7.6.红帽7.6系统中安装Docker: yum install -y docker systemctl start docker.service systemctl enable d ...

最新文章

  1. 对python源码进行编译,加密python脚本
  2. hadoop学习--数据排序
  3. linux windows文件 编码_Linux与Windows实现文件交互的几种方式
  4. 详解集合之HashMap——HashMap内部结构,自动扩容机制,为什么需要重写hashcode和equals方法
  5. 洛谷 2820 局域网
  6. 【C++grammar】文件系统以及path类使用
  7. centos7 安装Golang环境
  8. JavaScript Demo - so cool
  9. JVM可生成的最大Thread数量探索
  10. javascript--函数(一)
  11. Tcl Tutorial 笔记10 · list
  12. 阿里ai人工智能平台_AI标签众包平台
  13. jave-1.0.2.jar
  14. 曼昆微观经济学--十大原理
  15. 沙发的种类及特点有哪些?
  16. 闲逸游戏态度决定胜负,安全决定未来!
  17. vue导出excel加一个进度条_vue 实现excel导出功能
  18. 基于JAVA竞赛信息发布及组队系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  19. 韩信点兵(Hanxin)(C++)
  20. element-ui中el-table组件的行号

热门文章

  1. 3D动画渲染软件 KeyShot 11 Pro for mac
  2. 计算机质量度,带你揭秘推广中质量度的神秘面纱
  3. WINCE 获得无线网卡相关信息
  4. 【软件工程】代码题汇总
  5. Java 中文转拼音工具类 (附带长度转换 2:1)
  6. 振动RMS的11个关键参数
  7. MT7621方案 LED 灯控制 (基于OpenWrt平台)
  8. Photoshop图层混合模式公式(Unity,CG实现)
  9. 如何利用Shell脚本对Ubuntu操作系统进行常规初始化和系统优化及其安全加固(适用于等保2.0)
  10. 品质qc工程图_QC工程图(模版)