我在同一区域(us-east-1)有lambda函数和dynamo db表.在lambda函数中,我执行非常简单的查询:
params =
TableName: 'users'
Item:
email:
S: event.body.email
ConditionExpression: 'attribute_not_exists (email)'
dynamodb.putItem(params, context.done)
Run Code Online (Sandbox Code Playgroud)
DynamoDB表中只有几行,电子邮件上有Hash Key,读取/写入吞吐量设置为5/5.
Lambda函数在~4秒内完成...这非常慢.难道我做错了什么?
我已经使用lambda函数的不同内存设置测试了我的函数(以前设置为128mb):
因此,似乎响应时间取决于内存(实际上在计算容量上,因为AWS会将其与内存一起扩展).仍然这很疯狂,因为要制作非常简单的REST API,我必须设置1536mb内存以使其"响应",而我的程序使用17mb!
嗯,另一方面,我已经计算出它会花费:
所以我猜不是那么糟糕......
所以我正在使用boto来调用我的lambda函数并测试我的后端.我想异步调用它们.我注意到"invoke_async"已弃用,不应使用.相反,您应该使用InvocationType为"Event"的"invoke"来异步执行该函数.
我似乎无法弄清楚如何在函数返回时从函数中获取响应.我尝试过以下方法:
payload3=b"""{
"latitude": 39.5732160891,
"longitude": -119.672918997,
"radius": 100
}"""
client = boto3.client('lambda')
for x in range (0, 5):
response = client.invoke(
FunctionName="loadSpotsAroundPoint",
InvocationType='Event',
Payload=payload3
)
time.sleep(15)
print(json.loads(response['Payload'].read()))
print("\n")
Run Code Online (Sandbox Code Playgroud)
即使我告诉代码睡眠15秒,当我尝试打印它时,响应变量仍然是空的.如果我将invokation Invokation类型更改为"RequestResponse",它一切正常并且响应变量打印,但这是同步的.我错过了一些容易的事吗?当async invokation返回时,我如何执行一些代码,例如打印出结果?
谢谢.
我已将 lambda 函数配置为 EventBridge 规则目标,并在 EventBridge 规则上配置了死信队列以捕获异常。现在,如果 lambda 函数失败,Event Bridge 不会将该失败识别为错误。由于 EventBridge 对 Lambda 的调用是异步的,因此对于 EventBridge 来说,到达 lambda 就足以将事件视为成功,但这样一旦 lambda 失败,我就无法跟踪和重试事件。任何人都知道一种方法可以使 EventBridge 与 Lamdba 请求同步,或者知道另一种方法,以便在 Lambda 代码在调用后失败时能够重试事件?
如果我使用 ECR 中的图像而不是 S3 中的 jar 作为源代码,AWS Lambda 函数的冷启动是否会花费更长的时间?我认为是的,因为由于额外的操作系统层,图像更大(尽管......常规 Lambda 也应该有一些操作系统层),但我找不到任何性能基准。
谢谢!
我尝试从头开始运行构建基本 Web 应用程序教程来开始使用 AWS。我想我可以一步一步地遵循它,并有一个简单的 Hello World 网页前端到一个小数据库。但我遇到了一个奇怪的错误:包括最基本的错误,默认aws-sdk模块失败了!
简洁版本:
这段代码:
// Include the AWS SDK module
const AWS = require('aws-sdk');
Run Code Online (Sandbox Code Playgroud)
生成此错误:Error: Cannot find module 'aws-sdk'
很长的故事:
我正在逐步遵循该流程,使用 AWS 在线工具创建所有部分。当我创建 Lambda 函数时,第一个麻烦发生了。我不太担心 Create Function 工具显示 Node.js 版本 18.x 而不是教程的 Node.js 16.x,但我确实注意到它生成的 Lambda shell 被命名index.mjs为index.js. 没问题,我将使用该文件。我用亚马逊的HelloWorld代码替换了内容。
// Define handler function, the entry point to our code for the Lambda service
// We receive the object that triggers the function as a parameter
exports.handler = …Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services node.js amazon-dynamodb aws-lambda
从zip文件上传代码时,我在aws-lambda控制台中不断收到此错误.我尝试上传其他zip文件,但它们正常工作..js文件在zip文件中名为"CreateThumbnail.js".我相信处理程序也正确命名为"CreateThumbnail.handler".node_modules子目录也已设置.任何人都有任何想法?
{
"errorMessage": "Cannot find module 'CreateThumbnail'",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)"
]
}
Run Code Online (Sandbox Code Playgroud) 有没有人想出一个很好的源代码控制解决方案并将代码部署到AWS Lambda?我真的很讨厌我必须一直压缩文件并上传它们.有没有更好的方法来做这个也许是一个根据Lambda的变化推送代码的服务?
我正在编写一个我希望作为AWS Lambda函数运行的应用程序,但也遵守Twelve-Factor应用程序指南.特别是第三部分.配置需要使用环境变量进行配置.
但是,我找不到为AWS Lambda实例设置环境变量的方法.谁能指出我正确的方向?
如果无法使用环境变量,请推荐一种方法来使用环境变量进行本地开发,并将它们转换为可以使用AWS中的应用程序代码访问的有效配置系统.
谢谢.
我有一个带有 SQS 触发器的 Lambda。当它被击中时,来自 SQS 的一批记录进来(我认为通常一次大约 10 个)。如果我从处理程序返回失败的状态代码,将重试所有 10 条消息。如果我返回成功代码,它们都会从队列中删除。如果这 10 条消息中有 1 条失败,而我只想重试那一条怎么办?
exports.handler = async (event) => {
for(const e of event.Records){
try {
let body = JSON.parse(e.body);
// do things
}
catch(e){
// one message failed, i want it to be retried
}
}
// returning this causes ALL messages in
// this batch to be removed from the queue
return {
statusCode: 200,
body: 'Finished.'
};
};
Run Code Online (Sandbox Code Playgroud)
我是否必须手动将该消息重新添加回队列?或者我可以从我的处理程序返回一个状态,指示一条消息失败并应该重试?