标签: aws-lambda

当我单击“测试”按钮时,AWS lambda 函数触发两次

我正在使用 Chrome 浏览器,当我单击屏幕右上角的“测试”按钮时,lambda 函数似乎会触发 1-3 次,但我不明白为什么会发生这种情况。

我尝试将参数直接放入 dynamoDB.get 调用中,并进行了一段时间的谷歌搜索,并试图找到有类似问题的人。我发现一些很接近,但没有一个讨论在使用内置测试按钮时多次触发单个函数。我也尝试过异步调用并等待它,但一切都无济于事。

// Import Libraries
const aws = require('aws-sdk');
const dynamoDB = new aws.DynamoDB.DocumentClient();

aws.config.update({
    region: "us-east-1"
});

// Get Document
exports.handler = async (event, context) => {
    let params = {
       TableName: event.TableName,
        Key: {
            uuid: event.uuid
        } 
    };  

    return await dynamoDB.get(params, function(error, data){
        if(error){
            console.error("Error", error);
        }
        else{
            console.log("Data: ", data);
        }
    }).promise();
};
Run Code Online (Sandbox Code Playgroud)

我希望该函数仅调用一次,但它更经常在执行结果区域中打印相同的内容 2-3 次

Response:
{
  "Item": {
    "userId": "112",
    "uuid": "0118bb6f-e361-42a6-85e5-043091b69389"
  }
}

Request ID:
"4f5ce9da-bbf2-408b-9175-2759f45ba4fe"

Function …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js aws-lambda

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

AWS Lambda 在终止前不会解决所有承诺

我正在努力使用一个简单的 AWS Lambda 函数,该函数应该将一些消息发布到 SNS 主题。

我的电子邮件地址已订阅该主题并且订阅已确认。

该主题与我的 lambda 函数位于同一区域。

该函数与附加了两个策略的 IAM 角色关联:

  1. 默认策略 AWSLambdaBasicExecutionRole
  2. 允许该函数写入我的 SNS 主题的另一个策略

政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:eu-west-1:XXXXXXXXXXXX:YYYYYYYYYYYYYYYYYYY"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这是我的函数代码,在Cloud9上开发。

const AWS = require("aws-sdk");
const sns = new AWS.SNS({region:'eu-west-1'});

exports.handler = async (event, context, callback) => {

    const apiResponse = new Promise((resolve, reject) => {
        setTimeout(() => resolve(['one', 'two', 'three']), 500)
    });

    const messages = await apiResponse;

    const promises = [];

    messages.forEach(txt => …
Run Code Online (Sandbox Code Playgroud)

javascript amazon-web-services promise aws-lambda

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

从 AWS Lambda 函数中的 Secrets Manager 读取

我尝试使用 AWS Secrets Manager 提供的 Node.js 示例代码来读取机密值,并将此代码放入 Lambda 函数中。但是,我似乎无法进入处理获取秘密值的响应的函数。

Lambda 角色具有 AdministratorAccess 权限,可以排除权限问题。

拉姆达代码:

exports.handler = async (event) => {

// Load the AWS SDK
var AWS = require('aws-sdk'),
    region = "us-east-1",
    secretName = "/my-secrets/level1/level2",
    secret,
    decodedBinarySecret;

var client = new AWS.SecretsManager({
    region: region
});

console.log('above')

client.getSecretValue({SecretId: secretName}, function(err, data) {

    console.log('in')

    if (err) {
       throw err;
    }
    else {
        if ('SecretString' in data) {
            secret = data.SecretString;
        } else {
            let buff = new Buffer(data.SecretBinary, 'base64');
            decodedBinarySecret = buff.toString('ascii'); …
Run Code Online (Sandbox Code Playgroud)

node.js aws-lambda aws-secrets-manager

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

AWS Lambda Python S3 与 boto3,不知道为什么我收到错误

我已经注释掉了所有其他代码并将其移至顶部。仍然出现错误,根本不知道为什么。我已确认 IAM 是正确的,此 Lambda 函数附加了 S3FullAccess。我已经被困在这个问题上有一段时间了,我在搜索中找到的所有内容都没有帮助:/我的原始代码使用

import os
import pymysql
import json
import sys
import logging
import boto3
import zipfile
import tempfile

# logging.getLogger().setLevel(logging.INFO)
# logger = logging.getLogger()
# logger.setLevel(logging.INFO)

s3 = boto3.client('s3')

bucket = 'packages'
key = 'Packages/1005/v1005/1005.pkg'

def lambda_handler(event, context):
    try:
        data = s3.get_object(Bucket=bucket, Key=key)
        json_data = data['Body']

        return {
            'statusCode': '200',
            'body': str(type(json_data)),
        }

    except Exception as e:
        print(e)
        raise e

    sys.exit()
Run Code Online (Sandbox Code Playgroud)

执行后,这是我的结果,我将超时从默认值增加到 20 秒,以防可能只是超时:

{
  "errorMessage": "2020-03-10T03:49:45.400Z c51405a5-9eed-4167-8b6f-edf36beb9c15 Task timed out after 20.02 seconds"
}

Request …
Run Code Online (Sandbox Code Playgroud)

python amazon-s3 amazon-web-services aws-lambda

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

API 网关返回损坏的 Excel 文件

我的 API 端点返回一个从 S3 流式传输的 Excel 文件。它可以在本地运行,但在 API 网关上测试时文件已损坏。这是我的 API 代码:

const downloadContentFromS3 = async function(bucket, file) {
  return new Promise((resolve, reject) => {
    streamFileFromS3(bucket, file, (error, s3buffer) => {
      if (error) return reject(error);
      return resolve(s3buffer);
    });
  });
};

const streamFileFromS3 = async function(bucket, fileName, callback) {
  const params = {
    Bucket: bucket,
    Key: fileName,
  };

  const buffers = [];
  const stream = s3.getObject(params).createReadStream();
  stream.on('data', data => buffers.push(data));
  stream.on('end', () => callback(null, Buffer.concat(buffers)));
  stream.on('error', error => callback(error));
};

downloadExcelFile: async …
Run Code Online (Sandbox Code Playgroud)

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

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

AWS Lambda 函数与 terraform

应用我的地形计划时遇到一些问题,无法查明其中的问题是什么。我尝试了我能想到的一切。这是我的 lambda.tf 文件:

data "archive_file" "projectLeo_listunsubscribe_lambda_code" {
  type        = "zip"
  source_dir  = "${path.module}/../src/ProjectLeo.ListUnsubscribe"
  output_path = "${path.module}/../src/code-packaged/list-unsubscribe.zip"
}

resource "aws_lambda_function" "projectLeot_list_unsubscribe_lambda" {
  filename                       = "${data.archive_file.projectLeo_listunsubscribe_lambda_code.output_path}"
  function_name                  = "projectLeo-listunsubscribe-lambda"
  role                           = "${aws_iam_role.projectLeo_list_hygiene_role.arn}"
  handler                        = "${var.lambda_list_unsubscribe_function_handler}"
  runtime                        = "dotnetcore2.1"
  memory_size                    = "256"
  timeout                        = 120
  publish                        = true
  reserved_concurrent_executions = 1

  environment {
    variables = {
      optout-topic-arn = "${data.aws_sns_topic.projectLeo_optout_topic.arn}"
    }
  }
}

data "aws_sns_topic" "projectLeo_optout_topic" {
  name = "${var.sns_optout_topic_name}"
}
Run Code Online (Sandbox Code Playgroud)

生成的计划看起来一切正常,但是当应用完成时会生成此错误:

Error: Error creating Lambda function: ValidationException:
        status code: 400, request id: c16dc369-bccd-418d-a2b5-2d0383c66064 …
Run Code Online (Sandbox Code Playgroud)

c# amazon-web-services aws-lambda terraform-provider-aws

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

通过lambda函数向SQS发送消息时如何插入

我正在尝试使用 Lambda 向 SQS 队列发送消息:

这是我的代码:

var QUEUE_URL = 'https://us-west-2.queue.amazonaws.com/123456789/ntech-event-processing-dev.fifo';
var AWS = require('aws-sdk');
var sqs = new AWS.SQS({region : 'us-west-2'});

exports.handler = function(event, context) {
  var params = {
    MessageBody: JSON.stringify(event),
    QueueUrl: QUEUE_URL
  };
  sqs.sendMessage(params, function(err,data){
    if(err) {
      console.log('error:',"Fail Send Message" + err);
      context.done('error', "ERROR Put SQS");  // ERROR with message
    }else{
      console.log('data:',data.MessageId);
      context.done(null,'');  // SUCCESS 
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试数据 (JSON),请注意我在那里定义了 MessageGroupId。

{
  "MessageGroupId": "1",
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

2020-04-16T17:40:37.604Z    fa709a07-0bcd-4b17-a48b-341a984aec88    INFO    error: Fail Send …
Run Code Online (Sandbox Code Playgroud)

javascript lambda node.js aws-lambda

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

如何修复错误:使用 lambda python 在 dynamodb 中输入项目

我在使用 lambda 和 dynamodb 时遇到一些问题。

这是我的Python代码:

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('dynamodb', region_name='ap-northeast-2')
    dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-2')

    response = client.put_item(
        TableName='tablename',
        Item = {
            'key1': 'value1',
            'key2': 'value2',
            'key3': 'value3',
            'key4': 'value4'
                }
        )
Run Code Online (Sandbox Code Playgroud)

这是错误日志:

{
  "errorMessage": "Parameter validation failed:\nInvalid type for parameter Item.key1, value: value1, type: <class 'int'>, valid types: <class 'dict'>\nInvalid type for parameter Item.key2, value: value2, type: <class 'str'>, valid types: <class 'dict'>\nInvalid type for parameter Item.key3, value: value3, type: <class 'str'>, valid …
Run Code Online (Sandbox Code Playgroud)

python amazon-web-services amazon-dynamodb aws-lambda

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

如何在 AWS lambda 中缓存 Python 对象(在处理程序外部定义)

在处理程序外部定义的变量被缓存 - 这对对象有效吗?我想缓存一个客户端类,但不知道如何缓存。

我需要从处理程序内部实例化该类,因为我需要来自构造函数的事件的数据。我可以在处理程序之外为它定义一个 var 并将其存储在那里吗?

from . import myclass

myobj = None

def lambda_handler(event):
    myobj = myclass.MyClass(event)
Run Code Online (Sandbox Code Playgroud)

myobj 设置为 None 因为我需要将 var 设置为正确的值?每次调用它都不会重置为 None,不是吗?我想缓存在其构造函数中接收事件的实例化对象。

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

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

如何从 lambda 函数内部访问 Cognito 用户池?

我在我的应用程序中使用 AWS Amplify 进行身份验证。我使用电子邮件地址作为 MFA 的用户名和电话号码。但是,我还需要电话号码是唯一的,因此我创建了这个预注册 lambda 触发器:

const aws = require('aws-sdk');

exports.handler = async (event, context, callback) => {
  const cognito = new aws.CognitoIdentityServiceProvider();

  const params = {
    AttributesToGet: [],
    Filter: `phone_number = "${event.request.userAttributes.phone_number}"`,
    Limit: 1,
    UserPoolId: event.userPoolId,
  };

  try {
    const result = await cognito.listUsers(params).promise();
    if(result.Users.length === 0) {
        callback(null, event);
    } else {
        const error = new Error("Phone number has already been used.");
        callback(error, event);
    }
  } catch (err) {
      console.log(err);
  }
};
Run Code Online (Sandbox Code Playgroud)

但是,该函数返回以下错误:

validatePhoneNumber-dev 无权在资源:xxx 上执行:cognito-idp:ListUsers …

amazon-cognito aws-lambda aws-amplify

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