4 Chained Lambda( )'s -> RDS. I can' t get the first lambda to call the second-6ren"> 4 Chained Lambda( )'s -> RDS. I can' t get the first lambda to call the second-我真的什么都试过了。令人惊讶的是,谷歌对此没有太多答案。 当某个 .csv 文件上传到 S3 存储桶时,我想解析它并将数据放入 RDS 数据库。 我的目标是学习 lambda serverless 技-6ren">
gpt4 book ai didi

amazon-web-services - 我正在学习创建 AWS Lambda。我想创建一个 "chain": S3 -> 4 Chained Lambda( )'s -> RDS. I can' t get the first lambda to call the second

转载 作者:行者123 更新时间:2023-12-04 15:22:43 28 4
gpt4 key购买 nike

我真的什么都试过了。令人惊讶的是,谷歌对此没有太多答案。

当某个 .csv 文件上传到 S3 存储桶时,我想解析它并将数据放入 RDS 数据库。

我的目标是学习 lambda serverless 技术,这本质上是一个练习。因此,我过度设计了它。

事情是这样的:

  1. 上传 .csv 时触发 S3 -> 调用 lambda(这部分完全有效)
  2. AAA_Thomas_DailyOverframeS3CsvToAnalytics_DownloadCsv 从 S3 下载 csv 并以文件的纯文本结束。然后应该将它传递给下一个 lambda。我尝试这样做的方法是将第二个 lambda 作为目的地。该函数有效,但从未调用第二个 lambda,我不知道为什么。
  3. AAA_Thomas_DailyOverframeS3CsvToAnalytics_ParseCsv 获取明文作为输入并返回包含已解析数据的 javascript 对象。
  4. AAA_Thomas_DailyOverframeS3CsvToAnalytics_DecryptRDSPass 仅连接到 KMS,获取加密的 RDS 密码,并将其与接收到的数据一起作为最后一个 lambda 的输入传递。
  5. AAA_Thomas_DailyOverframeS3CsvToAnalytics_PutDataInRds 最后将数据放入 RDS。

我创建了一个带有自定义子网、路由表、网关、对等连接等的自定义 VPC。我不知道这是否相关,但函数 2. 只能访问 s3 端点, 3. 没有任何互联网访问权限,4. 是唯一具有正常互联网访问权限的(这是连接到 KSM 的唯一方式),并且 5. 只能访问托管 RDS 的对等 VPC。


这是第一个 lambda 的代码:

// dependencies
const AWS = require('aws-sdk');
const util = require('util');
const s3 = new AWS.S3();
let region = process.env;


exports.handler = async (event, context, callback) =>
{
var checkDates = process.env.CheckDates == "false" ? false : true;
var ret = [];
var checkFileDate = function(actualFileName)
{
if (!checkDates)
return true;

var d = new Date();
var expectedFileName = 'Overframe_-_Analytics_by_Day_Device_' + d.getUTCFullYear() + '-' + (d.getUTCMonth().toString().length == 1 ? "0" + d.getUTCMonth() : d.getUTCMonth()) + '-' + (d.getUTCDate().toString().length == 1 ? "0" + d.getUTCDate() : d.getUTCDate());

return expectedFileName == actualFileName.substr(0, expectedFileName.length);
};

for (var i = 0; i < event.Records.length; ++i)
{
var record = event.Records[i];

try {
if (record.s3.bucket.name != process.env.S3BucketName)
{
console.error('Unexpected notification, unknown bucket: ' + record.s3.bucket.name);
continue;
}

if (!checkFileDate(record.s3.object.key))
{
console.error('Unexpected file, or date is not today\'s: ' + record.s3.object.key);
continue;
}

const params = {
Bucket: record.s3.bucket.name,
Key: record.s3.object.key
};
var csvFile = await s3.getObject(params).promise();
var allText = csvFile.Body.toString('utf-8');

console.log('Loaded data:', {Bucket: params.Bucket, Filename: params.Key, Text: allText});

ret.push(allText);

} catch (error) {
console.log("Couldn't download CSV from S3", error);
return { statusCode: 500, body: error };
}
}

// I've been randomly trying different ways to return the data, none works. The data itself is correct , I checked with console.log()
const response = {
statusCode: 200,
body: { "Records": ret }
};

return ret;
};

虽然这显示了 lambda 是如何设置的,尤其是它的目的地:

Screenshot of AWS Lambda web page

我已经 7 年没有在 Stackoverflow 上发帖了。我就是这么绝望。感谢您的帮助。

最佳答案

与其让每个 Lambda 调用下一个 Lambda,不如看看状态机的 AWS 托管服务,step functions它可以为您处理此工作流程。

通过提供 input and outputs您可以将输出传递给下一个函数,并内置重试逻辑。

如果您没有太多经验,AWS 有一个 tutorial关于通过链接 Lambda 设置阶跃函数。

通过使用它,您也无需考虑 Lambda 超时等配置问题。此外,它还允许您的代码更加模块化,从而改进对各个功能的测试,同时还可以隔离问题。

关于amazon-web-services - 我正在学习创建 AWS Lambda。我想创建一个 "chain": S3 -> 4 Chained Lambda( )'s -> RDS. I can' t get the first lambda to call the second,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62967590/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com