我遇到了一个问题,即 Lambda 函数偶尔会超时,除了函数超时的通知之外,没有任何错误消息。
为了找到问题的根源,我在整个函数的各个点添加了日志记录,并确定一切正常,直到第一个 getItem() 请求从 DynamoDB 读取数据。读取似乎需要超过 3.00 秒的超时时间。
当然,我检查了我的 DynamoDB 表,看看是否有任何限制读取或错误。DynamoDB 的指标没有显示任何限制或错误,读取时间最多保持在两位数毫秒。
很明显,有什么地方出了问题,或者一路上掉了下来。我该如何解决这个问题,或者至少抓住它并重试读取?
这是一个面向 Web API 的读取功能,因此响应时间至关重要。因此,增加超时不会解决问题。
dynamodb.getItem({
"TableName": "tablename",
"Key": { "keyname": { "S": "keyvalue" } },
"AttributesToGet": [ "attributeA", "attributeB" ]
}, function(err, data) {
if(err){
context.done(err);
} else {
if("Item" in data){
nextFunction(event, context);
} else {
context.done("Invalid key");
}
}
});
Run Code Online (Sandbox Code Playgroud)
我刚开始使用 AWS-Lambda、AWS-API Gateway 和 ExpressJs。我在我的“ExpressJs”应用程序中找不到 AWS-Lambda“上下文”是如何可用的。
我正在使用:
在 Aws Lambda 中,我使用 aws-serverless-express 接收 API-Gateway 请求并初始化节点应用程序。以下是我从不同的教程等中找到的结构
lambda.js(从 API-Gateway 启动。在对“app.js”的调用中提供“context”变量)
'use strict'
const awsServerlessExpress = require('aws-serverless-express')
const app = require('./app')
const server = awsServerlessExpress.createServer(app)
exports.handler = (event, context) => awsServerlessExpress.proxy(server, event, context)
Run Code Online (Sandbox Code Playgroud)
我的 app.js express 的核心是:
var express = require('express');
...
var app = express();
...
app.use('/', index);
...
module.exports = app;
Run Code Online (Sandbox Code Playgroud)
我的问题:
任何输入表示赞赏。
Lambda 函数是幂等的。
我正在调用具有 ClientId 和 Client Secret 的 REST api 之一。
现在,对于每个请求,我都有获取bearer token和发送响应。
我知道,我可以将不记名令牌存储在云数据库(DynamoDB)中,但还有其他选择吗?
我需要我的 lambda 来调用 API 网关,并在我的云形成模板中将以下代码作为 lambda 的内联代码。
from requests_aws4auth import AWS4Auth
def handler(event,context):
client = boto3.client('sts')
responseAssumeRole = client.assume_role(
DurationSeconds=3600,
RoleArn='arn',// real arn of the api gateway invocation role
RoleSessionName='Bob',
)
credentials = responseAssumeRole['Credentials']
auth = AWS4Auth(aws_access_key=responseAssumeRole['Credentials']['AccessKeyId'],
aws_secret_access_key=responseAssumeRole['Credentials']['SecretAccessKey'],
aws_host='host.execute-api.us-east-1.amazonaws.com',
aws_region='us-east-1',
aws_service='execute-api')
headers= {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}
response = requests.get('https://host.execute-api.us-east-1.amazonaws.com/test',
auth=auth, headers=headers)
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误
No module named 'requests_aws4auth'
Run Code Online (Sandbox Code Playgroud)
任何使用 aws 凭据创建身份验证的解决方案或替代方法也将受到欢迎。
我正在尝试创建一个使用来自 dynamoDB 表的流的 lambda 函数。但是我想知道处理在执行过程中可能因某些错误而未处理的数据的最佳做法是什么?例如,我的 lambda 失败了,而且我有很多流,这是重新处理丢失数据的最佳方法?
谢谢
streaming amazon-dynamodb aws-lambda amazon-dynamodb-streams
我正在使用 AWS SAM 并针对 Node 10.x 运行。
希望传递实验模块和顶级等待的标志。
谢谢!
这更像是一个问题而不是一个问题,但是,有人以前经历过吗?有谁知道如何预防?
我有一个 lambda 函数(L1),它调用第二个 lambda 函数(L2),全部用 NodeJs 编写(运行时:Node.Js 8.10,aws-sdk应该是 v2.488.0 - 但我只是从文档中粘贴它)。简而言之,L1 应该调用 L2,而当它调用时,L2 会执行两次!我通过将日志写入 CloudWatch 发现了这一点,我可以看到一个 L1 日志和两个 L2 日志。
这是 L1 和 L2 的简化版本。
L1:
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();
module.exports = {
handler: async (event, context, callback) => {
const lambdaParams = {
FunctionName: 'L2',
Qualifier: `dev`,
Payload: JSON.stringify({}),
};
console.log(`Calling: ${JSON.stringify(lambdaParams)}`);
return await lambda.invoke(lambdaParams).promise();
},
};
Run Code Online (Sandbox Code Playgroud)
L2:
module.exports = {
handler: async (event, context, callback) => {
console.log(`L2 called`);
}, …Run Code Online (Sandbox Code Playgroud) 我有一个连接到家庭 WiFi 的“亚马逊智能插头”,现在可以使用两种机制对其进行控制:
我想添加第三种打开和关闭插头的方法,第三种机制调用 Lambda 函数。
所以,我需要一个允许我进行适当身份验证的 API,然后能够通过 Lambda 执行以下操作:
这样的API存在吗?我知道 LIFX 设备等有类似的 API,但这些是直接连接的亚马逊智能插头,仅与 Alexa 本身和 Echo 设备集成。
我只需要一个指向相关 API 的指针,因为有很多 API 用于我没有寻找的东西,它们似乎掩盖了 Google 结果,例如 Alexa Skills API,它用于为语音助手设计新功能——不是我想要的。一旦找到正确的 API,我就可以找出代码。
我正在尝试使用 AWS Step Functions 通过 Lambda 触发对非常大的 S3 文件的操作。为此,我使用具有文件的 S3 键和该文件的字节范围的输入调用步进函数(每个并行迭代将在文件的不同部分进行操作)。输入看起来像
{
"job-spec": {
"file": "some_s3_key",
"array": [
"0-100",
"101-200",
"201-300", ...
]
}
}
Run Code Online (Sandbox Code Playgroud)
我的 Step 函数非常简单,获取输入并将其映射出来,但是我似乎无法将文件和数组都作为我的 lambda 的输入。这是我的步骤函数定义
{
"Comment": "An example of the Amazon States Language using a map state to process elements of an array with a max concurrency of 2.",
"StartAt": "Map",
"States": {
"Map": {
"Type": "Map",
"ItemsPath": "$.job-spec",
"ResultPath": "$.array",
"MaxConcurrency": 2,
"Next": "Final State",
"Iterator": {
"StartAt": "My Stage",
"States": {
"My …Run Code Online (Sandbox Code Playgroud) 我想在 AWS lambda 函数中使用 npm 包“请求”。
我正在尝试按照本文中概述的程序进行操作:https : //medium.com/@anjanava.biswas/nodejs-runtime-environment-with-aws-lambda-layers-f3914613e20e
我创建了这样的目录结构:
nodejs
? package-lock.json
? package.json
????node_modules
Run Code Online (Sandbox Code Playgroud)
我的 package.json 看起来像这样:
{
"name": "my-package-name",
"version": "1.0.0",
"description": "whatever",
"author": "My Name",
"license": "MIT",
"dependencies": {
"request": "^2.88.0"
}
}
Run Code Online (Sandbox Code Playgroud)
据我从文章中可以看出,我应该做的就是 run npm i,压缩目录,将其作为图层上传,然后将该图层添加到我的 lambda 函数中。
我已经完成了所有这些,但是当我尝试测试我的功能时,我得到的只是:
{
"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'request'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
"trace": [
"Runtime.ImportModuleError: Error: Cannot find module 'request'",
"Require stack:",
...
Run Code Online (Sandbox Code Playgroud)
...好像从未添加过图层。无论是否添加图层,错误都完全相同。如果有某种权限问题需要解决,文章中没有任何内容表明这一点。
我尝试了一些不同的事情,例如我的 .zip 文件是否包含顶级目录“nodejs”或仅包含其内容。我试过用这样的文件添加"main": "index.js",到我的package.json, 中 …
javascript amazon-web-services node.js aws-lambda aws-lambda-layers
aws-lambda ×10
node.js ×4
alexa ×1
aws-sdk ×1
express ×1
iot ×1
javascript ×1
python ×1
python-3.6 ×1
python-3.x ×1
serverless-application-model ×1
streaming ×1