gpt4 book ai didi

python - 如何在无服务器中与 Python 正确共享代码?

转载 作者:行者123 更新时间:2023-12-03 13:40:07 25 4
gpt4 key购买 nike

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

  • 服务_1/
  • 无服务器.yml
  • handler.py
  • 服务_2/
  • 无服务器.yml
  • handler.py
  • 共享
  • 模块_a.py
  • 模块_b.py

  • module_a 和 module_b 包含共享逻辑,这两个服务都应该可用。到目前为止,我找到了两种方法:将共享代码包装在可安装的包中,并通过 pip 将其注入(inject)服务或将共享代码作为层提供。两种解决方案都有缺陷,最重要的是无法快速开发应用程序,因为任何更改都需要 pip。
    我注意到这个问题在 Node.js 中得到了解决,并且有很多关于 Python 的 Unresolved 问题。

    the plugin - serverless-package-common,它似乎解决了这个问题,但是,它看起来不像是一种优先的方法。

    我感谢任何形式的帮助。

    最佳答案

    也许您可以考虑使用 Lambda 层。您可以在此处找到快速指南:link .

    让我给你一个简单的例子。此示例有两个无服务器项目 - library共享代码和 service其中有服务代码。

  • library - 该项目应具有以下文件结构。你有 serverless.yml在这个项目的根目录和另一个将作为模块导出的文件夹中。 python当您将 lambda 与 python 一起使用时,将被链接并让 lambda 找到您的模块。
  • ./
    └ serverless.yml
    └ common/
    └ python/
    └ Common.py

    serverless.yml - 如您所见,文件夹 common在这里明确声明要导出。注意层名 Common在资源中重复使用,无服务器框架将自动将其与资源引用匹配。
    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

    common/python/Common.py ( printException 是共享函数的一个例子,将在另一个项目中使用)

    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])]))
  • serviceserverless.yml - 如您所见,每个函数都应包含层,您可以使用 CloudFormation 引用来引用特定层。
  • 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 - 现在我们可以轻松地从共享层导入共享模块。

    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 层不打包导入的模块,你应该导入你的层在你的服务中使用的模块。

    关于python - 如何在无服务器中与 Python 正确共享代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61158117/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com