Dockerized lambda 函数中的相对 Python 导入

wufei123 2025-01-05 阅读:57 评论:0
相对 python 导入对于 lambda 函数来说可能很棘手。我三年前写过一篇关于此的博客。但最近,我在 dockerized lambda 函数方面遇到了同样的问题。所以,我想是时候创建一个新博客了! 您可以按照步骤操作或直接在 g...

dockerized lambda 函数中的相对 python 导入

相对 python 导入对于 lambda 函数来说可能很棘手。我三年前写过一篇关于此的博客。但最近,我在 dockerized lambda 函数方面遇到了同样的问题。所以,我想是时候创建一个新博客了!

您可以按照步骤操作或直接在 github 上查看结果。

项目设置

确保您安装了 aws cdk cli。

PHP
brew install aws-cdk

初始化项目:

PHP
cdk init app --language=typescript
拉姆达设置

首先我们需要创建文件和文件夹结构:

PHP
mkdir -p lib/functions/hello-world/hello_world
touch lib/functions/hello-world/hello_world/__init__.py
touch lib/functions/hello-world/requirements.txt
touch lib/functions/hello-world/dockerfile

现在您需要填写 dockerfile,如下所示:

PHP
from public.ecr.aws/lambda/python:3.12
copy requirements.txt .
copy hello_world ${lambda_task_root}/hello_world
run pip install --no-cache-dir -r requirements.txt
cmd ["hello_world.handler"]

我们使用的是基于 python 3.12 的 python 基础镜像。接下来,我们将复制requirements.txt 文件和源代码。我们将安装requirements.txt 文件中列出的所有依赖项,并确保处理程序方法设置为cmd。

接下来,我们需要用一些代码填充我们的 python 文件。在__init__.py文件中,可以放置以下内容:

PHP
from typing import dict, any


def handler(event: dict[str, any], context: any) -> dict[str, str]:
    name = event.get("name", "world")

    return {
        "name": name,
        "message": f"hello {name}!",
    }


__all__ = [
    "handler"
]
注意:此处使用的代码可以使用相对导入。这是可能的,因为它位于单独的包中。此示例仅显示 __init__.py 文件中的代码。不过,您可以在此处使用多个文件来提高项目的可维护性。

对于这个例子,我不需要任何依赖项,因此我们可以将requirements.txt 文件保留为空。我将其包含在本示例中是为了说明如何包含依赖项。

使用 iac 创建 lambda 函数

我们的文件夹和文件已就位,因此是时候将 lambda 函数添​​加到 cdk 构造中了。您可以像这样简单地添加它:

PHP
    new lambda.function(this, 'function', {
      functionname: "hello-world",
      code: lambda.code.fromassetimage("lib/functions/hello-world", {
        platform: ecr_assets.platform.linux_arm64,
      }),
      runtime: lambda.runtime.from_image,
      handler: lambda.handler.from_image,
      architecture: lambda.architecture.arm_64,
      timeout: cdk.duration.seconds(15),
      memorysize: 128,
    });

要使其工作,您还需要以下导入:

PHP
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';

请注意,我们确保代码目录指向包含 dockerfile 的目录,并且我们为代码和函数本身选择 arm 平台。

本地测试 lambda 函数

快速反馈很重要,因此在某些情况下您可能需要在本地运行容器。为此,您首先需要构建容器:

PHP
docker build --platform linux/arm64 
  -t hello-world:latest 
  -f ./lib/functions/hello-world/dockerfile 
  ./lib/functions/hello-world

请注意,该命令可以从项目的根目录执行。接下来,我们需要确保它正在运行,然后才能调用它:

PHP
docker run --platform linux/arm64 -p 9000:8080 hello-world:latest

之后,您可以按如下方式调用该函数:

PHP
curl http://localhost:9000/2015-03-31/functions/function/invocations -d '{"name": "Joris"}'
结论

相对导入可能很棘手!您需要将代码放入包中。这允许您在自己的包中进行相对导入。这将使代码更加清晰,因为您可以将职责拆分到多个文件中,从而更易于管理和维护。

摄影:kaique rocha

以上就是Dockerized lambda 函数中的相对 Python 导入的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)

    BioWare埃德蒙顿工作室面临关闭危机,龙腾世纪制作总监辞职引关注(龙腾.总监.辞职.危机.面临.....)
    知名变性人制作总监corrine busche离职bioware,引发业界震荡!外媒“smash jt”独家报道称,《龙腾世纪:影幢守护者》制作总监corrine busche已离开bioware,此举不仅引发了关于个人职业发展方向的讨论,更因其可能预示着bioware埃德蒙顿工作室即将关闭而备受关注。本文将深入分析busche离职的原因及其对bioware及游戏行业的影响。 Busche的告别信:挑战与感激并存 据“Smash JT”获得的内部邮件显示,Busche离职原...
  • boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)

    boss直聘怎么取消面试预约 boss直聘上面试爽约了会怎么样(面试.爽约.预约.取消.boss.....)
    求职宝典:boss直聘面试技巧及取消预约方法 各位求职者注意啦!在Boss直聘上,随意取消面试预约会留下爽约记录,影响后续求职!本文将指导您如何避免爽约,以及如何取消已预约的面试。 如何取消Boss直聘面试预约? 打开Boss直聘APP,进入“我的”页面。 点击“待面试”,查看面试日程。 选择需要取消的面试,点击“取消面试”按钮即可。 Boss直聘面试爽约的后果? 爽约行为会在HR端留下记录,影响您的求职成功率。其他HR也能看到您的不良记录,所以务必重视面试预约。...
  • 闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)

    闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)
    闪耀暖暖钻石竞技场第十七赛季“华梦泡影”即将开启!全新闪耀性感套装【靡城永恒】震撼来袭!想知道如何获得这套精美套装吗?快来看看吧! 【靡城永恒】套装设计理念抢先看: 设计灵感源于夜色中的孤星,象征着淡然、漠视一切的灰色瞳眸。设计师希望通过这套服装,展现出在虚幻与真实交织的夜幕下,一种独特的魅力。 服装细节考究,从面料的光泽、鞋跟声响到裙摆的弧度,都力求完美还原设计初衷。 【靡城永恒】套装设计亮点: 闪耀的绸缎与金丝交织,轻盈的羽毛增添华贵感。 这套服装仿佛是从无尽的黑...
  • 蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)

    蛋仔派对2025最新皮肤兑换码汇总 最新皮肤兑换码一览(兑换.皮肤.最新.派对.汇总.....)
    蛋仔派对2025最新皮肤兑换码大放送!游戏内新增多款皮肤兑换码,包含最新、福利和通用三种类型,助你轻松获取精美奖励! 赶紧来看看如何兑换吧! 兑换码列表: 最新兑换码: ccewndj4k4k、cdkqdfm4fh、peetnmp4ef、cdxymk8f67 福利兑换码: cca863ywtfa、eggy2310am、eggy2311gz、eggyeggy9wz 通用兑换码: pec74dkcty、jsrqkrrjmh、cd3wt7wrph、ccepn7d8cjf...
  • python怎么调用其他文件函数

    python怎么调用其他文件函数
    在 python 中调用其他文件中的函数,有两种方式:1. 使用 import 语句导入模块,然后调用 [模块名].[函数名]();2. 使用 from ... import 语句从模块导入特定函数,然后调用 [函数名]()。 如何在 Python 中调用其他文件中的函数 在 Python 中,您可以通过以下两种方式调用其他文件中的函数: 1. 使用 import 语句 优点:简单且易于使用。 缺点:会将整个模块导入到当前作用域中,可能会导致命名空间混乱。 步骤:...