首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何正确地与Python共享无服务器代码?

如何正确地与Python共享无服务器代码?
EN

Stack Overflow用户
提问于 2020-04-11 14:11:21
回答 1查看 1.3K关注 0票数 10

我正试图找到使用Python进行健壮的无服务器开发的最佳方法。该项目使用无服务器框架将其划分为多个服务,并在一个monorepo中进行版本化。这是我想要的结构:

  • 服务1/
    • serverless.yml
    • handler.py

  • 服务2/
    • serverless.yml
    • handler.py

  • 共享
    • module_a.py
    • module_b.py

module_a和module_b由共享逻辑组成,这两个服务都应该可用。到目前为止,我已经找到了两种方法:将共享代码包装在一个可安装的包中,并通过pip将其注入服务,或者作为一个层提供共享代码。这两种解决方案都有缺陷,最重要的是,不可能迅速开发该应用程序,因为任何更改都需要pip。我注意到这个问题在Node.js中得到了解决,并且有许多关于Python的问题没有得到回答。

插件 -无服务器包-常见,这似乎解决了这个问题,然而,它看起来不像一种先行的方法。

我感谢任何形式的帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-06-19 07:41:04

也许你可以考虑使用Lambda层。您可以在这里找到一个快速指南:链接

让我举个简单的例子。这个例子有两个无服务器项目-- library有共享代码,service有服务代码。

  1. library -这个项目应该有下面的文件结构。这个项目的根目录中有serverless.yml和另一个将作为模块导出的文件夹。当您在python中使用lambda时,python将被链接并让lambda找到您的模块。
代码语言:javascript
代码运行次数:0
运行
复制
./
└ serverless.yml
└ common/
    └ python/
        └ Common.py

serverless.yml -正如您所看到的,文件夹common在这里显式声明为要导出。请注意,在资源中重用层名称Common,而无服务器框架将自动将其与资源引用匹配。

代码语言:javascript
代码运行次数:0
运行
复制
service: library
  provider:
    name: aws
    runtime: python3.7
    stage: dev
    region: ap-northeast-1
  layers:
    Common:
      path: common
  resources:
    Outputs:
      CommonLayerExport:
        Value:
          Ref: CommonLambdaLayer
        Export:
          Name: CommonLambdaLayer

公共/python/Common.py (printException是共享函数的一个示例,将用于另一个项目)

代码语言:javascript
代码运行次数:0
运行
复制
import sys
import traceback
import os

def printException(exception, writer=None):
    if writer is None:
      writer = print
    top = traceback.extract_tb(sys.exc_info()[2])[-1]
    writer(", ".join([type(exception).__name__, str(sys.exc_info()[1]), os.path.basename(top[0]), str(top[1])]))
  1. service serverless.yml --正如您所看到的,每个函数都应该包含层,并且可以引用带有CloudFormation引用的特定层。
代码语言:javascript
代码运行次数:0
运行
复制
service: layer-test
  provider:
    name: aws
    region: ap-northeast-1
    runtime: python3.7
    stage: dev
  functions:
    exceptionExample:
      handler: handler.func
      layers:
        - ${cf:library-dev.CommonLayerExport}
      events:
        - http:
            path: exceptionExample
            method: get

handler.py -现在我们可以很容易地从共享层导入共享模块。

代码语言:javascript
代码运行次数:0
运行
复制
import json
import Common

def func(event, context):
    try:
        1/0 # just to raise an exception and test the shared function
    except Exception as e:
        Common.printException(e)

    response = {
        "statusCode": 200,
    }
    return response

您应该注意的一点是,由于lambda层没有打包导入的模块,所以您也应该导入您的层在服务中使用的模块。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61158117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档