用于aws lambda和api网关的无服务器python web服务

zappa的Python项目详细描述


扎帕摇滚乐!

zappa-无服务器python

构建状态coveragepypislackgun.iopatreon运行初始设置/设置

  • 基本用法
  • 响应AWS事件执行
  • 异步任务执行
  • 高级设置
  • 高级用法
  • Zappa指南
  • 媒体中的Zappa
  • 使用zappa的站点 <HREF="相关项目" rel="nofollow">相关项目
  • 黑客攻击
  • 贡献
    • 使用本地回购
  • 用户
  • merch
  • 支持/开发/培训/咨询
  • 关于

    zappa slides

    赶时间?点击查看(现在稍微过时了)来自serverless sf的幻灯片

    zappa使在aws lambda+api网关上构建和部署无服务器、事件驱动的python应用程序(包括但不限于wsgi web应用程序)变得非常容易。把它想象成python应用程序的"无服务器"web托管。这意味着无限扩展,零停机,零维护,零维护-而且只需当前部署成本的一小部分!

    如果您有一个python web应用程序(包括django和flask应用程序),那么它就很简单:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    

    现在你的服务器少了!哇!< /P>< Buff行情>

    你说的"无服务器"是什么意思?

    好吧,还有一个服务器-但它只有40毫秒的生命周期!在这种情况下,无服务器意味着"没有任何永久性基础设施"。

    对于传统的http服务器,服务器24/7在线,在请求进入时逐个处理它们。如果传入请求的队列太大,则某些请求将超时。使用zappa,每个请求都由amazon api网关提供自己的虚拟http"服务器"。aws自动处理水平缩放,因此永远不会有请求超时。然后,每个请求从aws lambda中的内存缓存调用应用程序,并通过python的wsgi接口返回响应。应用程序返回后,"服务器"将关闭。

    更好的是,使用Zappa,您只需支付所用服务器时间的毫秒数,因此它比像Linode或Heroku这样的VPS/PaaS主机便宜很多数量级,而且在大多数情况下,它是完全免费的。此外,无需担心负载平衡或再次保持服务器在线。

    它非常适合在flask和bottle这样的框架中部署无服务器的微服务,也非常适合在django中托管更大的web应用和cmse。或者,你可以使用任何你喜欢的与wsgi兼容的应用程序!您可能不需要更改现有的应用程序才能使用它,而且您也不会被限制使用它。

    Zappa还允许您构建混合事件驱动的应用程序,该应用程序可以扩展到每年的万亿事件,而您不需要额外的努力!您还可以获得免费的SSL证书全局应用程序部署API访问管理自动安全策略生成预编译的C扩展自动保持温暖超大的lambda包

    最后,zappa是一个超级容易使用的工具。您可以使用一个现成的命令部署应用程序!

    太棒了!

    Zappa演示gif

    安装和配置

    开始之前,请确保您运行的是Python2.7或Python3.6,并且您有一个有效的AWS帐户,并且您的AWS凭据文件是prop已安装。

    zappa可以通过pip轻松安装,如下所示:

    $ pip install zappa
    

    请注意,必须将zappa安装到项目的虚拟环境中。虚拟环境名称不应与Zappa项目名称相同,因为这可能会导致错误。

    (如果您使用pyenv并喜欢使用pyenv来管理virtualenv,那么您只需调用pyenv local[您的虚拟名称]即可。conda用户应该在这里评论

    接下来,您需要定义本地和服务器端设置。

    运行初始设置/设置

    zappa可以使用init命令自动为您设置部署设置:

    $ zappa init
    

    这将自动检测您的应用程序类型(flask/django-pyramid users请参见此处),并帮助您定义部署配置设置。完成初始化后,在定义基本部署设置的项目目录中会有一个名为zappa_settings.json的文件。对于大多数wsgi应用程序,它可能看起来像这样:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}

    或者对于django:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}

    psst:如果您是第一次使用zappa部署django应用程序,您可能需要阅读edgar roman的《django zappa指南》。

    您可以定义任意多个阶段-我们建议您使用devstagingproduction

    现在,你准备好部署了!

    基本用法

    初始部署

    配置设置后,您可以使用一个命令将应用程序打包并部署到名为"生产"的阶段:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    

    现在你的应用程序是直播!有多酷?

    为了解释发生了什么,当您调用deploy时,zappa将自动将您的应用程序和本地虚拟环境打包到lambda兼容的存档中,用版本预编译替换任何依赖项。用于lambda的led,设置函数处理程序和必要的wsgi中间件,将存档上载到s3,创建和管理必要的amazon iam策略和角色,将其注册为新的lambda函数,创建新的api网关资源,为其创建wsgi兼容路由,将其链接到新的ambda函数,最后从s3存储桶中删除归档文件。方便!

    请注意,为执行lambda而创建的默认iam角色和策略应用了一组自由权限。 它们很可能不适合重要应用程序的生产部署。见章节 自定义AWS IAM角色和执行策略了解更多详细信息。

    更新

    如果您的应用程序已经部署,并且您只需要上传新的python代码,而不需要接触底层路由,那么您可以简单地:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    

    这将创建一个新的归档文件,将其上载到s3并更新lambda函数以使用新代码,但是't触摸API网关路由。

    回滚

    您还可以通过提供要返回的修订数,将部署的代码回滚到以前的版本。例如,要回滚到3个版本以前部署的版本:

    $ zappa rollback production -n 3
    

    日程安排

    Zappa可用于轻松地安排定期发生的函数。这提供了一个更好的,免维护的芹菜替代品! 这些函数将与app_函数一起打包和部署,并从处理程序自动调用。 只要列出您的函数和表达式,就可以使用zappa廑settings.json文件中的cron或rate语法来安排它们。

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

    然后:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    0

    现在您的函数将每分钟执行一次!

    如果要取消这些操作,只需使用取消计划命令即可:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    1

    现在您的计划活动规则被删除。

    有关详细信息,请参见示例

    高级调度

    有时一个函数需要多个表达式来描述它的调度。若要设置多个表达式,只需列出您的函数,并使用zappa\u settings.json文件中的cron或rate语法列出要调度它们的表达式列表:使用

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    2

    这可用于处理在本地时区的工作时间内,由于UTC时区跨越午夜而引起的问题。

    需要注意的是,重叠表达式不会发出警告,应该检查以防止重复触发函数。

    取消部署

    如果需要删除以前发布的api网关和lambda函数,您只需:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    3

    执行前将要求您确认。

    如果您为api网关服务启用了cloudwatch日志,而您没有 要保留这些日志,可以指定--remove logs参数来清除api网关和lambda函数的日志:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    4

    包装

    如果要构建应用程序包而不实际将其上载并注册为lambda函数,可以使用package命令:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    5

    如果在回调设置中有zip回调,则也会调用此设置。

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    6

    您还可以使用-o

    指定包的输出文件名
    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    7

    Zappa如何制作软件包

    Zappa会自动将您的活动虚拟环境打包成一个在AWS Lambda上运行顺畅的包。

    在此过程中,它将用aws lambda兼容版本替换任何本地依赖项。依赖项包括在此顺序中:

    • lambda compatiblemanylinux本地缓存中的控制盘
    • lambda compatiblemanylinux来自pypi的轮子
    • lambda特定版本来自于lambda package
    • 活动虚拟环境中的包
    • 本地项目目录中的包

    它还跳过某些不必要的文件,如果.pyc文件可用,则忽略任何.py文件。

    此外,Zappa还将自动设置正确的执行权限,配置包设置,并创建一个唯一的、可审核的包清单文件。

    要进一步减小最终包文件大小,可以:

    模板

    类似于package,如果您只需要api gateway cloudformation模板,请使用template命令:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    8

    注意,在这种情况下,您必须提供自己的lambda arn和role arn,因为它们可能不是为您创建的。

    您可以使用--json直接获取json输出,并使用--output指定输出文件。

    状态

    如果需要查看部署和事件计划的状态,只需使用status命令即可。

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    9

    尾随测井

    您可以通过调用tail管理命令来查看部署的日志。

    $ pip install zappa
    
    0

    默认情况下,这将显示所有日志项。除了http和其他事件之外,任何printed到stdoutstderr的内容都将显示在日志中。

    您可以使用参数http筛选http请求,该请求将采用apache通用日志格式。

    $ pip install zappa
    
    1

    类似地,您可以执行相反操作,并且只显示非http事件和日志消息:

    $ pip install zappa
    
    2

    如果您不喜欢默认的日志颜色,可以使用--no color关闭它们。

    您还可以使用--因为来限制尾部的长度,它接受一个简单的持续时间字符串:

    $ pip install zappa
    
    3

    您可以使用--filter筛选日志内容,如下所示:

    $ pip install zappa
    
    4

    注意,这使用了cloudwatch日志过滤语法

    要在不执行以下操作的情况下结束日志(要在显示请求的日志结束后立即退出),请传递--disable keep open

    $ pip install zappa
    
    5

    远程函数调用

    您可以使用invoke命令随时直接执行应用程序中的任何函数。

    例如,假设您在一个名为"my_app.py"的文件中有一个基本应用程序,并且您希望在其中调用一个名为"my_function"的函数。部署应用程序后,您可以随时调用该函数:

    $ pip install zappa
    
    6

    任何远程打印语句和函数返回的值都将打印到本地控制台。漂亮!

    您还可以使用--raw直接调用可解释的Python2.7或Python3.6字符串,如下所示:

    $ pip install zappa
    
    7

    例如,如果您想在运行在vpc(如无服务器aurora)中的rds数据库上创建第一个超级用户,它就可以派上用场: $zappa invoke staging"来自django.contrib.auth import get_user_model;user=get_user_model();user.objects.create_superuser('username','email','password')"--raw

    django管理命令

    为了方便起见,zappa还可以使用manage命令调用远程django'manage.py'命令。例如,要执行基本django状态检查:

    $ pip install zappa
    
    8

    显然,这只适用于正确定义了设置的django项目。

    对于有自己参数的命令,也可以将该命令作为字符串传入,如下所示:

    $ pip install zappa
    
    9

    需要直接用户输入的命令,如createsuperuser,应该用使用zappa invoke<;env>;--raw的命令来替换

    要获得更多的django集成,请查看zappa-django-utils项目。

    (请注意,执行时间超过30秒的命令可能会超时,从而无法返回输出—但该命令可能会继续运行。有关解决办法,请参见此相关问题

    SSL认证

    Zappa可以部署到具有自定义SSL证书的自定义域名和子域,让我们对证书进行加密,并使用AWS证书管理器(ACM)证书。

    目前,这些证书中最容易使用的是aws证书管理器证书,因为它们是免费的、自更新的,并且需要最少的工作量。

    按照下面的说明进行配置后,所有这些方法都使用相同的命令:

    $ zappa init
    
    0

    从CI/CD系统部署时,可以使用:

    $ zappa init
    
    1

    跳过确认提示。

    使用AWS证书管理器部署到域

    亚马逊提供了自己的免费选择,让我们加密称为aws证书管理器(acm)。要与Zappa一起使用此服务:

    1. 在AWS证书管理器控制台中验证您的域。
    2. 在控制台中,选择N.Virginia(US-East-1)区域并为您的域或子域请求证书(sub.your domain.tld),或请求通配符域(*.yourdomain.tld)。
    3. 复制该证书的整个arn并将其放入zappa设置certificate arn
    4. 域设置中设置所需的域。
    5. 调用$zappa certificate创建并关联使用该证书的api网关分发。

    部署到具有"让我们加密"证书的域(DNS身份验证)

    如果您想在一个域上使用Zappa,该域具有一个免费的Let's Encrypt证书,使用基于自动路由53的DNS身份验证,那么您可以使用这个方便的指南

    部署到具有let's encrypt证书的域(http auth)

    如果您想在一个域上使用Zappa,该域有一个免费的Let's Encrypt Certificate Using HTTP Authentication(让我们使用HTTP身份验证来加密证书),您可以遵循本指南

    但是,现在使用基于路由53的dns身份验证要容易得多,这将允许您使用let's encrypt证书和一个$zappa certificate命令。

    使用您自己的ssl证书部署到域

    1. 第一步是创建自定义域并获取ssl证书/密钥/捆绑包。
    2. 确保您在zappa settings json中设置了设置-这将避免自定义域和api invoke url之间的基本路径映射出现问题,后者将获得附加在uri中的阶段名
    3. 将ssl cert/key/bundle的路径分别添加到zappa settings json中的证书证书密钥证书链设置中
    4. 如果您计划使用自己的DNS提供商,而不是AWS Route53托管区域,请将启用的Route53设置为False。
    5. 使用Zappa部署或更新应用程序
    6. 运行$zappa certificate上载您的证书并向您的api网关注册自定义域名。

    响应AWS事件执行

    类似地,您可以根据aws生态系统中发生的事件(如s3上载、dynamodb条目、kinisis流、sns消息和sqs队列)执行函数。

    在您的zappa_settings.json文件中,定义您r事件源和要执行的函数。例如,这将执行your_module.process_upload_函数以响应my buckets3 bucket中的新对象。注意process_upload_function必须接受事件上下文参数。

    $ zappa init
    
    2

    然后:

    $ pip install zappa
    $ zappa init
    $ zappa deploy
    
    0

    现在你的函数将执行每次新的上传出现在你的桶!

    要在应用程序上下文中访问密钥的信息,您需要process_upload_函数如下所示:

    $ zappa init
    
    4

    同样,对于a简单的通知服务事件:

    $ zappa init
    
    5

    也可以添加sns消息过滤器

    $ zappa init
    
    6

    dynamodbkinisis略有不同,因为它不是基于事件的而是从流中提取的:

    $ zappa init
    
    7

    sqs也从流中提取消息。此时,只有"标准"队列才能触发lambda事件,而不是"fifo"队列。请仔细阅读aws文档,因为lambda在函数成功完成后会代表您调用sqs deletemessage api。

    $ zappa init
    
    8

    用于配置lex bot的意图触发事件:

    $ zappa init
    
    9

    事件也可以采用关键字参数:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    0

    要获取关键字参数,您需要查看事件字典:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    1

    您可以在这里找到更多的事件源示例。

    异步任务执行

    Zappa现在还提供了在完全独立的AWS lambda实例中异步无缝执行函数的能力!

    例如,如果您有一个flask api来订购馅饼,那么可以在一个完全独立的lambda实例中无缝地调用bake函数,方法是使用类似于这样的zappa.asynchronous.taskdecorator:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    2

    就这样!您的api响应将立即返回,而make-pie函数将在完全不同的lambda实例中执行。

    当对@task修饰函数或zappa.asynchronous.run命令的调用发生在lambda之外时,例如您的本地开发环境, 函数将立即在本地执行。Zappa异步功能只起作用 在lambda环境中或指定远程调用时

    捕捉异常

    尝试..对这样的异步任务执行块除外:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    3

    将导致为同一错误发送两次电子邮件。参见aws的异步重试。若要解决此副作用并使故障处理程序仅执行一次,请将返回值更改为:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    4

    任务源

    默认情况下,此功能使用直接aws lambda调用。相反,您可以使用aws simple notification service作为任务事件源,方法是使用task\u snsdecorator,如下所示:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    5

    使用sns还需要在zappa_设置中设置以下设置:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    6

    这将自动创建并订阅代码调用zappa schedule命令时将使用的sns主题。

    使用sns也会返回一个messagE ID,以防您需要跟踪调用。

    直接调用

    通过将函数传递给zappa.asynchronous.run,您也可以在不使用decorator的情况下使用此功能,如下所示:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    7

    远程调用

    默认情况下,zappa将使用lambda的当前函数名和当前aws区域。如果要调用lambda 不同的函数名/区域或从lambda外部调用lambda,必须指定 remote_aws_lambda_function_nameremote_aws_region参数,以便应用程序知道哪个函数和 要使用的区域。例如,如果我们的批萨制作应用程序的某个部分必须使用ec2实例,但是 希望在自己的lambda实例上调用make_pie()函数,我们将按如下方式执行:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    8

    如果没有使用那些task()参数,那么ec2将在本地执行该函数。这些相同 remote_aws_lambda_function_nameremote_aws_region参数也可以用于zappa.asynchronous.run()函数。

    限制

    此功能适用以下限制:

    • 函数必须有一个干净的导入路径,即没有闭包、lambda或方法。
    • argskwargs必须是json可序列化的。
    • json序列化参数必须在lambda(256k)或sns(256k)事件的大小限制内。

    所有这些代码仍然与非lambda环境向后兼容-它只是以阻塞的方式执行并返回结果。

    在专有网络中运行任务

    如果在虚拟私有云(vpc)中运行zappa,则需要配置子网以允许lambda与vpc内的服务以及公共互联网通信。最小设置需要两个子网。

    在子网A中:

    • 创建NAT
    • 创建Internet网关
    • 在路由表中,创建一条将Internet网关指向0.0.0.0/0的路由。

    在子网B中:

    • 放置lambda函数
    • 在route表中,创建一个路由,将属于子网a的nat指向0.0.0/0。

    您可以将lambda放在多个子网中,这些子网的配置方式与subnet-b的配置方式相同,以获得高可用性。

    一些有用的资源是本教程和其他教程。PC Internet" rel="nofollow">本AWS文档页

    响应

    可以捕获异步任务的响应。

    Zappa使用dynamodb作为后端。

    要捕获响应,必须在zappa_settings中配置一个async_response_表。这是dynamodb表名。然后,在用@task修饰时,传递capture\u response=true

    异步响应被分配一个响应id。这是作为@taskdecorator返回的lambdasyncResponse(或snsasyncResponse)对象的属性返回的。

    示例:

    {// The name of your stage"dev":{// The name of your S3 bucket"s3_bucket":"lambda",// The modular python path to your WSGI application function.// In Flask and Bottle, this is your 'app' object.// Flask (your_module.py):// app = Flask()// Bottle (your_module.py):// app = bottle.default_app()"app_function":"your_module.app"}}
    9

    高级设置

    您可以在本地设置中定义其他设置 改变扎帕的行为。用这些你自己的风险!

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    0

    yaml设置

    如果您更喜欢yaml而不是json,那么您还可以使用一个zappa廑settings.yml,如下所示:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    1

    您还可以随时使用-s参数提供自定义设置文件,例如:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    2

    类似地,您可以提供一个zappa_settings.toml文件:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    3

    高级用法

    使服务器保持温暖

    zappa将自动设置应用程序的定期执行,以使lambda函数保持温暖。这可以通过Keep_warm设置禁用。

    提供静态文件/二进制上载

    Zappa现在能够提供和接收由其mime类型检测到的二进制文件。

    然而,通常Zappa是为运行应用程序代码而设计的,而不是为静态Web资产服务的。如果您计划在您的web应用程序(css/javascript/images/etc.)中提供自定义静态资产,那么您可能希望使用aws s3和aws cloudfront的组合。

    您的web应用程序框架可能会自动处理这个问题。对于烧瓶,有烧瓶-s3,对于django,有django存储

    类似地,您可能希望设计应用程序,以便静态二进制上载直接使用S3events设置中定义的事件响应,从而将

    您也可以在应用程序中直接处理cors。您的web框架可能会有一个扩展来实现这一点,例如django cors headersdjango cors headersflask cors。使用这些将使您的代码更易于移植。

    大型项目

    aws目前将lambda zip大小限制为50兆字节。如果您的项目大于此值,请在zappa_settings.json中设置slim_handler:true。在这种情况下,您的fat应用程序包将被替换为一个小的仅处理程序包。然后,处理程序文件在运行时从s3中取出大型项目的其余部分!大型项目的初始负载可能会增加启动开销,但是对于一个温暖的lambda函数,差异应该是最小的。注意,这也会占用应用程序函数的存储空间。请注意,aws当前将目录存储限制为512 MB,因此您的项目必须小于此值。

    启用bash完成

    可以通过将以下内容添加到.bashrc中来启用bash完成:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    4

    register python argcomplete由argcomplete python包提供。如果此软件包安装在virtualenv中 然后命令必须在那里运行。或者您可以执行:

    激活全局python argcomplete--dest=->;文件

    该文件的内容应来源于例如~/.bashrc.

    在API网关上启用安全端点

    API键

    您可以使用api_key_required设置为您的api网关的所有路由生成api密钥。过程如下:

    1. 部署/重新部署(更新不起作用)并为已创建的密钥记下id
    2. 转到AWS控制台>;Amazon API网关和
      • 选择"API键"并找到键(例如键值
      • 选择"使用计划",创建一个新的使用计划并链接API密钥和Zappa为您创建的API
    3. 在传递密钥v的位置发送请求值作为名为x-api-key的头来访问受限制的端点(例如,使用curl:curl--header"x-api-key:key_value")。注意,如果没有x-api-key头,您将收到403。

    IAM策略

    通过将iam_authorization设置设置为true可以在api上启用基于iam的(v4签名)授权。然后,您的API将需要签名请求,并且可以通过IAM策略控制访问。未签名的请求将收到403响应,未经授权访问API的请求者也将收到403响应。启用此选项将覆盖授权程序配置(请参见下文)。

    API网关lambda授权程序

    如果使用zappa部署api端点,则可以利用api gateway lambda authorizers来实现基于令牌的身份验证,所需做的就是提供创建所需输出的函数,其余的由扎帕负责。该功能的一个良好开端是aws实验室蓝图示例

    如果您想知道如何使用授权者,这里有一些潜在的用例:

    1. 呼叫OAuth提供商
    2. 内联解码JWT令牌
    3. 在自管理数据库中查找(例如dynamodb)

    zappa可以配置为调用代码中的函数来执行授权,或者调用其他一些现有的lambda函数(它允许您在多个lambda之间共享授权器)。通过在authorizer设置块中指定arn函数名值来控制行为。

    例如,要获取cognito标识,请将其添加到一个zappa廑settings.yaml

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    5

    现在可以在这样的烧瓶中使用:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    6

    Cognoto用户池授权程序

    您还可以通过添加:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    7

    API网关资源策略

    您还可以使用api网关资源策略。IP白名单示例:

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    8

    设置环境变量

    局部环境变量

    如果您想为部署阶段设置本地环境变量,只需在zappa嫒u settings.json中设置即可

    {"dev":{// The name of your stage"s3_bucket":"lambda",// The name of your S3 bucket"django_settings":"your_project.settings"// The python path to your Django settings.}}
    9

    然后,您可以在应用程序中使用:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    0

    如果您的项目需要知道您部署到的环境类型,您还可以随时获得servertype(aws lambda)、framework(zappa)、project(您的项目名)和stagedevproduction,等等)变量。

    远程AWS环境变量

    如果要使用本机aws lambda环境变量,可以使用aws_environment_variables配置设置。这些功能非常有用,因为您可以在运行时通过aws lambda控制台或cli轻松更改它们。它们还可用于存储敏感凭据和利用环境变量的KMS加密。

    在开发过程中,您可以将zappa定义的变量添加到本地运行的应用程序中,例如,使用以下方法(对于django,为manage.py)。

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    1

    远程环境变量

    在zappa之外(通过aws lambda控制台或cli)设置的任何环境变量在运行update时都将保持原样,除非它们也在aws\u environment\variables中,在这种情况下,远程值将被设置文件中的值覆盖。如果您使用的是kms encrypted aws环境变量,您可以在aws\u kms\u key-arn设置中设置kms key-arn。在这种情况下,请确保您设置的值已加密。

    注意:如果您依赖于这些变量以及环境变量,并且您拥有相同的键名,那么当它们被注入lambda处理程序时,环境变量中的键名将优先。

    远程环境变量(通过s3文件)

    在aws为lambda引入本机环境变量(通过控制台和cli)之前,s3远程环境变量被添加到zappa中。在走这条路之前,请检查以上内容是否对您的用例更有意义。

    如果要使用远程环境变量来配置应用程序(这对于敏感凭据之类的事情特别有用),可以创建一个文件并将其放置在zappa应用程序可以访问的s3存储桶中。为此,请将指向包含平面json对象的文件的zappa_设置的remote_env键添加到zappa_设置中,以便每当新lambda实例启动时,对象上的每个键值对都将设置为环境变量和值。

    例如,为了确保应用程序可以访问数据库凭据而不将其存储在版本控制中,您可以使用连接字符串将文件添加到s3,并使用remote_env配置设置将其加载到lambda环境中。

    super-secret-config.json(上传到我的配置桶):

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    2

    zappa_settings.json:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    3

    现在您可以在应用程序中使用:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    4

    API网关上下文变量

    如果要将API网关上下文变量(http://docs.aws.amazon.com/api gateway/latest/developerguide/api-gateway-mapping-template-reference.html" rel="nofollow">http://docs.aws.amazon.com/apigateway/latest/developerguide/api gateway mapping template reference.html)映射到http头您可以在zappa_settings.json中设置映射:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    5

    例如,如果要将$context.identity.cognitoidentityid变量公开为http头cognitoidentityid,将$context.stage公开为apistage,则需要:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    6

    捕获未处理的异常

    默认情况下,如果代码中发生未处理的异常,zappa只会将stacktrace打印到cloudwatch日志中。如果要使用外部报告工具记录这些异常,可以使用异常处理程序配置选项。

    zappa_settings.json:

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    7

    函数必须接受三个参数:异常、事件和上下文:

    你的_module.py

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    8

    您的应用程序中可能仍然需要类似的异常处理程序,这只是一种捕获发生在zappa/wsgi层的异常的方法(通常是基于事件的调用、配置错误的设置、错误的lambda包和权限问题)。

    默认情况下,如果抛出异常,aws lambda将尝试重试基于事件(非api网关,例如cloudwatch)的调用。但是,您可以通过返回true来防止这种情况,如上面的示例所示,因此zappa不会重新引发uncaught异常,从而防止aws lambda重试当前调用。

    使用自定义AWS IAM角色和策略

    自定义aws iam角色和部署策略

    您可以通过定义 配置文件名设置,它将对应于AWS凭据文件中的配置文件。

    自定义AWS IAM角色和执行策略

    zappa为执行lambda而创建的默认iam策略是非常允许的。 它允许访问 cloudwatch、s3、kinesis、sns、sqs、dynamodb和route53类型的所有资源;lambda:invokefunction 对于所有lambda资源;放置到所有x射线资源;以及所有网络inter所有EC2的面部操作 资源.虽然这允许大多数lambda在没有额外权限的情况下正常工作,但是 通常情况下,对于大多数连续集成管道或 生产部署。相反,您可能需要手动管理IAM策略。

    要手动定义lambda执行角色的策略,必须将manage_roles设置为false并定义 您的zappa设置文件中的角色名称角色

    $ zappa deploy production
    Deploying..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    9

    有关Zappa部署所需的最低策略要求的持续讨论,请参见这里的。 管理这些权利的一个更强大的解决方案可能很快就会实施。

    要向默认的zappa执行策略添加权限,请使用附加权限设置:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    0

    AWS X射线

    Zappa可以通过配置设置启用对您的功能的支持:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    1

    这将在lambda函数上启用它,并允许您使用x射线检测代码。 例如,使用烧瓶:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    2

    您可以使用捕获修饰符围绕函数创建子段,或在函数中开始子段("subsegment_name")xray_recorder.end_subsegment()。官方的python x-ray文档有更多关于如何在代码中使用它的信息。

    请注意,您可以在代码中创建子段,但如果您尝试创建一个段,则会引发异常,因为它是由lambda worker创建的。这也意味着,如果您使用Flask,则不得使用xRay中间件,文档建议您使用

    全球提供的无服务器体系结构

    global zappa slides

    单击查看来自serverlessconf london的幻灯片

    在初始化过程中,您可以选择"全局"部署您的应用程序。这将允许您同时将您的应用程序部署到所有可用的AWS区域,以便提供一致的全局速度、增加的冗余、数据隔离和法律补偿。朗斯您还可以选择仅部署到"主要"位置,即名称中带有-1的AWS区域。

    要了解有关这些功能的更多信息,请参见这些幻灯片来自serverlessconf london。

    提高AWS服务限制

    aws为您的函数设置了1000个并发执行的限制。如果您开始违反这些限制,您可能会看到一些错误,如clienterror:调用puttargets时发生错误(limitexcedexception).."或类似的错误。

    为了避免这种情况,您可以向Amazon提交a服务通知单,将您的限制提高到您可能需要的数万个并发执行。这是amazon的一个相当常见的做法,旨在防止您意外地创建非常昂贵的bug报告。因此,在提高服务限制之前,请确保您没有任何恶意脚本,这些脚本可能会意外地创建数万个您不想付费的并行执行。

    将Zappa与Docker一起使用

    如果Docker是您团队的CI、测试或部署的一部分,您可能需要查看关于使用Zappa和Docker的指南。

    死信队列

    如果您想使用aws lambda的死信队列功能,只需添加键死信arn,值为zappa中相应sns主题或sqs队列的完整arnettings.json

    您必须已经创建了相应的sns/sqs主题/队列,并且lambda函数执行角色必须已设置为具有对dlq资源的读取/发布/发送消息访问权限。

    唯一的包ID

    为了监视不同的部署,可以在应用程序包根目录的package_info.json中为每个包提供唯一的uuid。您可以使用此信息或此文件的哈希值来跟踪不同部署之间的错误、监视部署状态以及诸如Sentry和New Relic等服务上的其他此类内容。包裹将包含:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    3

    应用程序负载平衡器事件源

    zappa可用于处理由应用程序负载平衡器(alb)触发的事件。这在某些情况下可能有用:

    • 由于API网关在超时前有30秒的硬限制,您可以使用ALB来处理更长时间的运行请求。
    • API网关是按请求计费的;因此,高吞吐量服务的成本可能会过高。如果您希望您的lambda有大量流量,那么albs定价模型在财务上更有意义。
    • alb可以放在vpc中,这对于私有端点来说可能比使用api网关的私有模型(使用aws privatelink)更有意义。

    与api网关一样,zappa可以自动为您提供alb资源。您需要将以下内容添加到您的"Zappa"设置中:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    4

    apigateway_resource_policy.json:

    $ zappa update production
    Updating..
    Your application is now live at: https://7k6anj0k99.execute-api.us-east-1.amazonaws.com/production
    
    5

    Zappa指南

    媒体上的Zappa

    使用Zappa的站点

    你在用Zappa吗?让我们知道,我们会在这里列出你的网站!

    相关项目

    • 林bda包-为aws lambda预编译的c扩展包。由Zappa自动使用。
    • 麦肯齐-aws lambda感染工具包
    • nodb-一个基于s3的简单的、无服务器的pythonic对象存储。
    • zappa cms-一个小型的无服务器cms,供忙碌的黑客使用。正在工作。
    • zappa-django-utils-帮助django部署的实用命令。
    • flask-ask-构建Amazon Alexa应用程序的框架。使用Zappa进行部署。
    • zappa文件小部件-支持zappa上的django二进制文件上载的django插件。
    • zops-使用zappa的团队和持续集成实用程序。
    • cookiecutter移动后端-acookiecutter支持zappa和s3上传的django项目。
    • zappa示例-烧瓶、django、图像上传等!
    • zappa拥抱示例-使用zappa的拥抱应用程序示例。
    • zappa docker映像-基于lambda docker的本地运行zappa的docker映像。
    • zappa dashing-使用zappa和cloudwatch监视您的aws环境(运行状况/指标)。
    • s3env-通过cli在s3存储桶中操作远程zappa环境变量key/value json对象文件。
    • zappa_resize_image_on_fly-使用烧瓶、zappa、枕头和opencv python动态调整图像大小。
    • zappa ffmpeg-在lambda中运行ffmpeg进行无服务器转换。
    • gdrive lambda-将JSON数据传递到CSV文件,供在整个组织中使用gdrive的最终用户使用。
    • travis build repeat-重复travisci构建以避免陈旧的测试结果。
    • wunderskill alexa技能-添加到wunderlist的alexa技能。
    • xrayvision-使用AWS X-ray和Zappa的实用程序和包装器。
    • terraform aws zappa-用于创建vpc、rds实例、elasticache redis和cloudfront分发版以与zappa一起使用的terraform模块。
    • zappa sentry-与zappa和sentry集成
    • iopipe-监视、分析您的zappa应用程序。

    黑客

    Zappa远远超出了Lambda和API网关的处理范围。因此,这里有相当多的黑客允许它工作。其中一些包括但不限于..

    • 使用vtl将body、headers、method、params和查询字符串映射为json,然后将其转换为有效的wsgi。
    • 附加响应码到响应体,base64编码整个事件,将其用作正则表达式来路由响应码,在vtl中解码响应体,并将响应体映射到响应体。
    • 打包并将多个cookie编码为一个cookie,因为我们只能映射一种cookie。
    • 强制"set cookie"的大小写排列,以便同时返回多个标题。
    • 将cookie设置301/302响应转换为200个具有html重定向的响应,因为我们无法在重定向上设置头。

    贡献

    这个项目还很年轻,所以还有很多工作要做。我们非常欢迎您的贡献!

    请在提交修补程序之前提交讨论票。拉取请求应以master为目标,如果合并,则应使zappa处于"可发货"状态。

    如果您正在添加大量新代码,请在您的PR中包括功能测试。对于AWS呼叫,我们使用安慰剂库,您可以学习在其自述文件中使用。打开拉取请求后,测试套件将由travis ci运行。

    请将与您的更改相关的讨论的Github问题或拉取请求URL作为注释包含在代码中(示例)。这对项目的可维护性有很大帮助,因为它允许我们追溯用例并解释决策过程。同样,请确保您满足拉取请求模板中列出的所有要求

    请随时处理任何未结的机票,特别是任何标有"需要帮助"标签的机票。如果您陷入困境或想进一步讨论某个问题,请加入我们的Slack频道,在这里您会发现一群聪明有趣的人在努力解决难题。

    Zappa不打算遵从PEP8,隔离您的提交,以便用您的linter所做的更改更改更改功能。

    使用本地回购

    要使用git头,您可能无法使用pip install-e。相反,您应该将repo克隆到您的计算机上,然后在本地项目中pip install/path/to/zappa/repoln-s/path/to/zappa/repo/zappa zappa

    顾客

    如果您或您的公司使用zappa,请考虑尽可能支持项目的持续发展!

    您可以通过访问我们的patreon页面成为赞助人。

    Zappa目前由这些杰出的个人和公司提供支持:

    • 内森·劳伦斯
    • 启动实验室
    • 肖恩·佩利
    • 西奥·奇塔亚特
    • 乔治·西布尔
    • 乔韦斯
    • 尼克博拉
    • 归零王托比
    • 加雷斯E
    • 马特·杰克逊
    • 肖恩·科茨
    • 亚历山大洛希洛夫
    • 科里·彼得斯
    • 乔韦斯
    • Kimmo Parvianen Jalanko
    • 帕特里克•阿金
    • 罗伯托·马丁内斯
    • 查尔斯·迪米诺
    • 道格·贝尼
    • 丹"男人"盖尔
    • 华西托
    • 孩子们会克莱恩吗
    • 埃菲梅德勒克拉维茨
    • 菲利普·特鲁涅夫

    非常非常感谢!

    < BR>

    merch!miserlou@gmail.com,让我们一起工作!

    < BR>

    made by gun.io

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


    热门话题
    java如何在不扩展小程序的情况下使用小程序方法?   Java/包含点的排序数组   java如何在EJB项目中创建会话?   java JavaFX我切换了场景,但我不能再回来了   环境变量为java设置类路径时%classpath%的含义是什么   java如何使用Serenity BDD管理浏览器选项卡?   java如何创建一个。gwt中的war文件在eclipse中使用maven?   java使用java程序更新HTML文件   Java、SQLite、向数据库插入数据   java无法在RPi上安装JDK 16   在不进行反射的情况下调用动态java方法   如何在Ubuntu上安装Eclipse和Java SDK?   JavaSSHMySQL连接   在内存和性能方面,用Java每秒打印格式化日期+时间的最有效方法是什么?   java如何匹配映射返回类型的键和值?   java JUnit测试挂起在clientSocket上。接受()?   jbossweb中的java系统属性引用。服务器启动时未解析xml   java如何在set操作中使用arrayUnion   java 安卓。看法充气异常:二进制XML文件行#22