aws - 我应该创建两个 lambda 函数来处理 dynamodb 查询和非查询用例吗?
Posted
技术标签:
【中文标题】aws - 我应该创建两个 lambda 函数来处理 dynamodb 查询和非查询用例吗?【英文标题】:aws - should I create two lambda function to handle dynamodb query and non-query use case? 【发布时间】:2021-03-05 04:19:15 【问题描述】:假设我有一个“横幅”表。 此表有 2 个可能的用例。
1.从表格中获取所有横幅数据
我的 lambda 函数可能如下所示:
'use strict'
const AWS = require('aws-sdk');
exports.handler = async function (event, context, callback)
const documentClient = new AWS.DynamoDB.DocumentClient();
let responseBody = "";
let statusCode = 0;
const params =
TableName : "Banner",
;
try
const data = await documentClient.scan(params).promise();
responseBody = JSON.stringify(data.Items);
statusCode = 200
catch(err)
responseBody = `Unabel to get products: $err`;
statusCode = 403
const response =
statusCode: statusCode,
headers:
"Content-Type": "application/json",
'Access-Control-Allow-Origin': '*', // Required for CORS support to work
,
body: responseBody
return response
2.按用户分区键/GSI查询
我可能需要根据banner id或者banner title查询得到对应的表。
起初,我想将这两个用户案例合并到一个 lambda 函数中。 直到我打开下面的帖子。
aws - how to set lambda function to make dynamic query to dynamodb
其中一个 cmets 为我提供了对这 2 个用户案例进行动态查询的方法,但他/她也提到:
you are giving anyone invoke the request the ability to put any query in the request, that might put you vulnerable to some type of SQL Injection attacks.
这让我开始思考是否应该将这 2 个用例分别放在两个 lambda 函数中? 这类事情的一般做法是什么?
【问题讨论】:
【参考方案1】:一般来说,如果可以阻止“SQL 注入”,最好将其分成 2 个函数,Lambda 处理程序应该是单一职责。如果您想重用代码,您可以创建一些可以使用公共代码创建的公共 DAL。
【讨论】:
【参考方案2】:我认为这取决于个人喜好,但我建议将功能拆分为两个 lambda。
听起来您有两种访问模式:
-
获取所有横幅
按用户获取横幅
我可能会使用两个单独的 lambda 来实现这些。如果我通过 API 公开此功能,我可能会创建两个端点:
-
获取/横幅。 (获取所有横幅)
获取 /users/[user_id]/banners。 (获取给定用户的所有横幅)
这些端点中的每一个都会路由到它们自己的为特定请求提供服务的 lambda。如果您使用单个 lambda 来处理请求,则必须在 lambda 中引入逻辑以确定您正在满足哪种类型的请求。我无法想象仅使用一个 lambda 会获得什么。
让您的 lambda 代码专注于单一职责,这样可以更轻松地开发、测试和调试。
【讨论】:
以上是关于aws - 我应该创建两个 lambda 函数来处理 dynamodb 查询和非查询用例吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?