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 Lambda 函数?

如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

Spring Boot 微服务与 aws lambda

AWS Lambda Callback的函数签名

我应该如何从 AWS Lambda 函数连接到 Redis 实例?

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?