我正在使用 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) 我正在努力使用一个简单的 AWS Lambda 函数,该函数应该将一些消息发布到 SNS 主题。
我的电子邮件地址已订阅该主题并且订阅已确认。
该主题与我的 lambda 函数位于同一区域。
该函数与附加了两个策略的 IAM 角色关联:
政策:
{
"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) 我尝试使用 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) 我已经注释掉了所有其他代码并将其移至顶部。仍然出现错误,根本不知道为什么。我已确认 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) 我的 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
应用我的地形计划时遇到一些问题,无法查明其中的问题是什么。我尝试了我能想到的一切。这是我的 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) 我正在尝试使用 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) 我在使用 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) 在处理程序外部定义的变量被缓存 - 这对对象有效吗?我想缓存一个客户端类,但不知道如何缓存。
我需要从处理程序内部实例化该类,因为我需要来自构造函数的事件的数据。我可以在处理程序之外为它定义一个 var 并将其存储在那里吗?
from . import myclass
myobj = None
def lambda_handler(event):
myobj = myclass.MyClass(event)
Run Code Online (Sandbox Code Playgroud)
myobj 设置为 None 因为我需要将 var 设置为正确的值?每次调用它都不会重置为 None,不是吗?我想缓存在其构造函数中接收事件的实例化对象。
我在我的应用程序中使用 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 …
aws-lambda ×10
node.js ×4
python ×3
javascript ×2
amazon-s3 ×1
aws-amplify ×1
c# ×1
express ×1
lambda ×1
promise ×1
python-3.x ×1