标签: aws-lambda

DynamoDB 导致 Lambda 超时

我遇到了一个问题,即 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)

没有限制读取

读取延迟似乎最小

node.js amazon-dynamodb aws-sdk aws-lambda

8
推荐指数
2
解决办法
1万
查看次数

运行 nodejs + expressjs 时访问 aws-lambda 上下文

我刚开始使用 AWS-Lambda、AWS-API Gateway 和 ExpressJs。我在我的“ExpressJs”应用程序中找不到 AWS-Lambda“上下文”是如何可用的。

我正在使用:

  • AWS-Lambda
  • AWS-API 网关
  • NodeJs v4.3.2
  • ExpressJs 4.14.1
  • 克劳迪娅 2.7.0

在 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)

我的问题:

  1. 有没有办法使用这种结构访问 AWS-Lambda “上下文”?
  2. 如果没有,使它可用的最佳“模式”是什么?

任何输入表示赞赏。

amazon-web-services node.js express aws-lambda

8
推荐指数
1
解决办法
2431
查看次数

有什么方法可以在 AWS Lambda 函数中存储不记名令牌?

Lambda 函数是幂等的。

我正在调用具有 ClientId 和 Client Secret 的 REST api 之一。

现在,对于每个请求,我都有获取bearer token和发送响应。

我知道,我可以将不记名令牌存储在云数据库(DynamoDB)中,但还有其他选择吗?

node.js aws-lambda

8
推荐指数
1
解决办法
2017
查看次数

尝试导入 lambda 时没有名为“requests_aws4auth”的模块

我需要我的 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 凭据创建身份验证的解决方案或替代方法也将受到欢迎。

python amazon-web-services python-3.x aws-lambda python-3.6

8
推荐指数
1
解决办法
1万
查看次数

来自 DynamoDB 的 AWS Lambda 处理流

我正在尝试创建一个使用来自 dynamoDB 表的流的 lambda 函数。但是我想知道处理在执行过程中可能因某些错误而未处理的数据的最佳做法是什么?例如,我的 lambda 失败了,而且我有很多流,这是重新处理丢失数据的最佳方法?

谢谢

streaming amazon-dynamodb aws-lambda amazon-dynamodb-streams

8
推荐指数
3
解决办法
4787
查看次数

我可以在 AWS Lambda 中指定 Node.js 命令行选项吗?

我正在使用 AWS SAM 并针对 Node 10.x 运行。

希望传递实验模块和顶级等待的标志。

谢谢!

aws-lambda serverless-application-model

8
推荐指数
1
解决办法
755
查看次数

调用了一次 lambda 函数,它执行了两次

这更像是一个问题而不是一个问题,但是,有人以前经历过吗?有谁知道如何预防?

我有一个 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)

amazon-web-services aws-lambda

8
推荐指数
2
解决办法
6913
查看次数

从 Lambda 函数切换 Amazon Smart Plug

我有一个连接到家庭 WiFi 的“亚马逊智能插头”,现在可以使用两种机制对其进行控制:

  • 在我的 Echo Show 设备上,我可以使用触摸屏或 Alexa 语音控制来打开和关闭插头。
  • 在移动设备上使用 Alexa 应用程序,我可以打开和关闭插头。

我想添加第三种打开和关闭插头的方法,第三种机制调用 Lambda 函数。

所以,我需要一个允许我进行适当身份验证的 API,然后能够通过 Lambda 执行以下操作:

  1. 枚举连接到我的 Alexa 帐户的设备。
  2. 通过友好名称或底层 ID/序列号查找我感兴趣的设备。
  3. 获取插头的当前状态(通电或断电)。
  4. 如果它关闭,打开它;如果打开,请将其关闭。

这样的API存在吗?我知道 LIFX 设备等有类似的 API,但这些是直接连接的亚马逊智能插头,仅与 Alexa 本身和 Echo 设备集成。

我只需要一个指向相关 API 的指针,因为有很多 API 用于我没有寻找的东西,它们似乎掩盖了 Google 结果,例如 Alexa Skills API,它用于为语音助手设计新功能——不是我想要的。一旦找到正确的 API,我就可以找出代码。

amazon-web-services alexa iot aws-lambda

8
推荐指数
0
解决办法
416
查看次数

在 AWS Step Function 中将多个输入传递到 Map State

我正在尝试使用 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)

amazon-web-services aws-lambda aws-step-functions

8
推荐指数
1
解决办法
4544
查看次数

“Runtime.ImportModuleError”尝试使用层访问 AWS lambda 函数中的 npm 包

我想在 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

8
推荐指数
1
解决办法
2万
查看次数