Lamda函数重用最佳实践

时间:2018-03-30 00:24:40

标签: amazon-web-services aws-lambda serverless-framework

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

我的环境是

  • 无服务器框架
  • 的NodeJS
  • AWS API Gateway
  • AWS Lamda
  • AWS DynamoDB

我为每个Dynamo表构建了几个用于API资源的CRUD,现在我创建了一些跨表的专用CRUD。

如果我有一个函数createTeamForecast,并且我需要从表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 get并检查结果。这更自我,但不是很干。

无服务器和Lambda管理功能的方式,感觉有点断开连接。任何人有任何优点或缺点?

1 个答案:

答案 0 :(得分:2)

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

无服务器应用程序的技巧是在代码重用和关注点分离之间找到平衡点。如何执行此操作的细节在某种程度上取决于应用程序。但是,如果您在每个函数中放入太多代码,那么您的应用程序可能会过于紧密耦合,并且可能会将分解用于更小的函数,从而更加紧密地模拟其问题空间。如果您在Lambda函数中找到大量共享代码,这可能是一个很好的指示,它们应该重构为其他函数。

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