Lambda 函数重用最佳实践

Lamda function reuse best practices

Lambda 函数应该调用其他 Lambda 函数还是应该自包含?

我的环境是

我已经为每个 Dynamo API 资源构建了多个 CRUD table,现在我正在创建一些跨 tables 的专用资源。

如果我有函数 createTeamForecast,并且我需要从 table Team 获取一行,我应该导入函数 getTeam 还是只编写 Dynamo 查询。我倾向于导入该函数,但我没有看到任何说明可以的。

getTeam.js

import * as dynamoDbLib from "./libs/dynamodb-lib";
import { apiResponse } from "./libs/response-lib";

export async function main(event, context, callback) {
  const params = {
    TableName: "teams",
    Key: {
      id: event.pathParameters.team_id
    }
  };

  try {
    const result = await dynamoDbLib.call("get", params);
    if (result.Item) {
      // Return the retrieved item
      callback(null, apiResponse(200,"OK",result.Item));
    } else {
      callback(null, apiResponse(404, "Team not found."));
    }
  } catch (e) {
    callback(null, apiResponse(500,'Server error',e));
  }
}

在我的 createTeamForecast 中,我可以只导入该函数然后调用它吗?

import { main as getTeam } from "./getTeam";

我的替代方法是在我的 createTeamForecast.js 函数中执行 Dynamo 获取并检查结果。这更独立,但不是很干。

Serverless 和 Lambda 管理功能的方式,感觉有点脱节。谁有任何优点或缺点?

从另一个模块导入你需要的代码而不是重写它是合理的。这样做的附带好处是可以更轻松地维护您的应用程序,因为您不会到处都有重复的逻辑。

无服务器应用程序的诀窍是在代码 re-use 和关注点分离之间找到平衡。如何做到这一点的细节在某种程度上取决于应用程序。但是,如果您在每个函数中放置了太多代码,那么您的应用程序很可能耦合得太紧,可以使用分解为更小的函数来更紧密地模拟它们的问题 space。如果您在 Lambda 函数中发现大量共享代码,这可能是一个很好的指标,表明它们应该重构到其他函数中。

如果您正在为非常复杂的业务领域建模,那么您可能还需要考虑从 Lambda 函数中调用其他 Lambda 函数,或者研究在 Lambda 之上提供状态机的 AWS Step Functions。