Dockerized lambda 函数中的相对 Python 导入

wufei123 2025-01-05 阅读:30 评论: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离职原...
  • 闪耀暖暖靡城永恒怎么样-闪耀暖暖靡城永恒套装介绍(闪耀.暖暖.套装.介绍.....)

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

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

    斗魔骑士哪个角色强势-斗魔骑士角色推荐与实力解析(骑士.角色.强势.解析.实力.....)
    斗魔骑士角色选择及战斗策略指南 斗魔骑士游戏中,众多角色各具特色,选择适合自己的角色才能在战斗中占据优势。本文将为您详细解读如何选择强力角色,并提供团队协作及角色培养策略。 如何选择强力角色? 斗魔骑士的角色大致分为近战和远程两种类型。近战角色通常拥有高攻击力和防御力,适合冲锋陷阵;远程角色则擅长后方输出,并依靠灵活走位躲避攻击。 选择角色时,需根据个人游戏风格和喜好决定。喜欢正面硬刚的玩家可以选择战士型角色,其高生命值和防御力能承受更多伤害;偏好策略性玩法的玩家则可以选择法...
  • 奇迹暖暖诸星梦眠怎么样-奇迹暖暖诸星梦眠套装介绍(星梦.暖暖.奇迹.套装.介绍.....)

    奇迹暖暖诸星梦眠怎么样-奇迹暖暖诸星梦眠套装介绍(星梦.暖暖.奇迹.套装.介绍.....)
    奇迹暖暖全新活动“失序之圜”即将开启,参与活动即可获得精美套装——诸星梦眠!想知道这套套装的细节吗?一起来看看吧! 奇迹暖暖诸星梦眠套装详解 “失序之圜”活动主打套装——诸星梦眠,高清海报震撼公开!少女在无垠梦境中,接受星辰的邀请,馥郁芬芳,预示着命运之花即将绽放。 诸星梦眠套装包含:全新妆容“隽永之梦”、星光面饰“熠烁星光”、动态特姿连衣裙“诸星梦眠”、动态特姿发型“金色绮想”、精美特效皇冠“繁星加冕”,以及动态摆件“芳馨酣眠”、“沉云余音”、“流星低语”、“葳蕤诗篇”。...