【问题标题】:Share interface/type among Lambda Functions with Lambda Layer使用 Lambda 层在 Lambda 函数之间共享接口/类型
【发布时间】:2021-10-18 15:45:39
【问题描述】:

我有一个 lambda 层文件,其中定义了枚举(将在不同的 lambda 函数中使用),如下所示:

    exports enum EventTypes { 
      Create,
      Delete,
      Update,
    }

这很好用,因为我在不同的 lambda 函数中进行了测试。 然后我在同一个文件中添加了更多的接口定义,并将它们导入到我的实现代码中。它最终看起来像这样:

    exports enum EventTypes { 
      Create,
      Delete,
      Update,
    }
    export interface ProjectEvent {
      eventType: EventTypes;
    }
    export interface CreateEvent extends ProjectEvent {
      userId: string;
    }
    export interface DeleteEvent extends ProjectEvent {
     userList: string[];
    }
    export interface UpdateEvent extends ProjectEvent {
     userList: string[];
    }

使用这个版本的文件,我什至无法成功构建项目。 我的问题是:在将 Typescript 与 Lambda 层集成时,我是否遗漏了任何限制?

下面是我所说的设置我的 typescript-aws 集成:

[1]https://github.com/aws/aws-sam-cli/issues/2636

[2]https://evilmartians.com/chronicles/serverless-typescript-a-complete-setup-for-aws-sam-lambda

【问题讨论】:

  • 如果您只是使用 Lambda 层来共享类型,那么它们的效率将会非常低 - 如果您共享的只是类型、服务等,请构建一个内部 npm 包并在多个函数中使用它。
  • 除了 Ermiya(他总是擅长 AWS 问题)之外,您不能直接将对象从一个 lambda 传递到另一个 - 它总是在 lambda 之间转换为 JSON。因此,如果您有任何 lambdas 协同工作,那么您将有更多的开销和更容易出现错误的区域,因为您必须将 json 对象映射到您的界面中。出于这个原因,使用 json 兼容的对象在内部和 lambda 之间存储和传递数据要好得多。将 lambda 串在一起时,OOP 和许多经典的类继承都消失了(专注于消息!)
  • @ErmiyaEskandary 非常感谢您的建议,这绝对是跨函数共享接口定义的最佳实践!
  • @lynkfox 谢谢你的好话 :)

标签: typescript amazon-web-services aws-lambda aws-lambda-layers


【解决方案1】:

我找到了很傻的原因。

一开始,在完成我的实现后,我在本地运行单元测试并得到错误:

Cannot find module 'opt/nodejs/interface';

为了修复它,我在“tsconfig.json”文件中进行了一些修改,以帮助我的单元测试找到破坏我的构建过程的 lambda 层。但其实我之前的所有配置都是正确的。

真正让我陷入这个问题的是我从图层导入内容的方式。 这不起作用:

// @ts-ignore can be ignored as this is a Lambda layer
import {
  A,
  B,
  C
} from '/opt/nodejs/interface'// Result: Cannot find module 'opt/nodejs/interface' or its corresponding type declarations.

这行得通

// @ts-ignore can be ignored as this is a Lambda layer
import { A, B } from '/opt/nodejs/interface'
// @ts-ignore can be ignored as this is a Lambda layer
import { C } from '/opt/nodejs/interface'

这只是@ts-ignore 仅适用于它下面的一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多