【问题标题】:Recommended project structure for Python-based GCP projects using both App-Engine and Cloud Functions使用 App-Engine 和 Cloud Functions 的基于 Python 的 GCP 项目的推荐项目结构
【发布时间】:2020-07-10 08:27:12
【问题描述】:

我继承了一个使用 Python 作为主要语言的 GCP 项目。这是我第一次接触 GCP,我担心就最佳实践而言,该项目的结构可能不正确。

该项目由 App-Engine(标准)组成,用于公开几个 HTTP 端点以供 Web 应用程序使用,以及部署用于处理需要后端处理的各种情况的多个“触发”云功能,例如:对象上传到一个桶。目前,项目代码库包含 App-Engine 代码和 Cloud Functions 代码。

代码结构如下:

project/
├── main.py
└── common-ftns/
    ├── __init__.py
    └── initialize-app.py
    └── utils.py
└── cloud-ftns/
    └── cloud_ftn-1.py
    └── cloud_ftn-2.py
└── services/
    └── service-1-routes.py
    └── service-1.py
    └── service-2-routes.py
    └── service-2.py

我们正在使用 GCP Cloud Build 来部署整个解决方案,并且一切正常。然而,我担心的是 App-Engine 和 Cloud Functions 中 main.py 的共同使用。 GAE 和 Cloud Functions 似乎都需要存在根级 main.py 文件来初始化应用程序(包括 Flask)以及声明 Cloud Function 入口点。这让我很困扰,因为 Cloud Functions 和 App-Engine 似乎不需要一个共同的起点,更不用说触发处理 Cloud Functions 不需要有 Flask,因为它们没有使用它。

我的问题是:这种类型的结构在 GCP/Python 世界中是否被认为是“最佳实践”?如果没有,那么有没有更好的方法来利用 main.py,这样 Cloud Functions 和 GAE 就不必运行完全相同的启动脚本?

【问题讨论】:

  • 考虑是否需要云功能。您可能希望在应用引擎中实现它们。

标签: python google-app-engine google-cloud-platform google-cloud-functions


【解决方案1】:

您可以拥有一个 monorepo 项目并在生产中使用它。当你这样做时,如果你想同时部署一些部分而不是全部,这需要在 CI 脚本上做更多的工作,但它可以工作。一切都取决于您的要求和您的工作方式。

所以,我的建议是为每个服务创建子目录

  • 一个用于 AppEngine 服务
  • 一个用于函数服务,其中包含每个函数的目录
  • 根目录下没有 main,只有 CI/CD 脚本和其他 bash 脚本(terraform 或其他)要部署

部署时,转到正确的目录并执行服务的部署。 app.yaml 位于 App Engine 目录中,函数不关心它。

对于函数,每个函数可以有一个不同的requirements.txt 文件。这就是为什么将它们分成目录很重要的原因。再次在这里,进入正确的目录,然后部署函数。

问题来自函数和 App Engine 之间共享的公用文件,即您的“公用”包。有两种方法:

  • 您可以构建一个包并将其导入到您的依赖项中
  • 或者在部署之前将公共目录复制到正确的目录中。 -> 我大部分时间都这样做。在 Java 中(使用 maven)很容易执行,这需要在 Python 中编写更多脚本。

【讨论】:

  • 使用 GAE 标准,我相信符号链接可用于共享公共文件(它们被取消引用)。它不适用于 GAE flex(链接不会被取消引用)。我还没有用函数尝试过。
  • 我喜欢这种方法并将尝试一下。感谢您的反馈。我会尽快更新结果。
  • @guillaume-blaquiere 我刚刚开始使用这种方法并阅读了您的评论“根目录没有 main,只有您的 CI/CD 脚本和其他 bash 脚本(terraform 或其他)要部署”。然而,似乎总是需要 main.py,不是吗?
  • @guillaume-blaquiere - 记录我最后的评论/问题。我在我的 cloud-ftn 子文件夹中配置了 main.py,但错误地留在了我的文件夹结构中的“init.py”中,该文件夹结构将 cloud-ftn 文件夹视为一个模块,而不是一个独立的根。现在它消失了,我可以部署和触发云功能。
【解决方案2】:

这个项目的结构似乎是在 App Engine 应用和一个或多个 Cloud Functions 之间共享公共代码库的理想方式,而无需管理私有子依赖项或复杂的构建步骤的额外开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多