我有一个从 AWS Lambda 内部调用其他 AWS Lambda 的承诺列表:
promiseArray.push(lambda.invoke(params).promise())
Run Code Online (Sandbox Code Playgroud)
在另一个函数中,我迭代这些承诺并尝试解决它们:
for (let i = 0; i < promiseArray.length; i++) {
try {
let result = await promiseArray[i];
console.log("Success!");
} catch (e) {
console.log("Failed!");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我面临的问题。通常,调用会抛出一个 TimeoutError,该错误不会被 try-catch 块捕获,并通过抛出“未处理的 Promise Rejection”错误来终止 Lambda 执行。请注意,只有在我们在 Lambda 上从 Node 8.10 升级到 12.x 后,此情况才开始出现。
如何在异步函数中创建 AWS S3 对象的读取流?
如果我尝试
exports.handler = async (event) => {
var csvreadstream = await s3.getObject({ Bucket: bucket, Key: filename }).promise().createReadStream()
}
Run Code Online (Sandbox Code Playgroud)
或者
exports.handler = async (event) => {
var s3Object = await s3.getObject({ Bucket: bucket, Key: filename }).promise();
var csvreadstream = s3Object.createReadStream();
}
Run Code Online (Sandbox Code Playgroud)
我明白了
{
"errorType": "TypeError",
"errorMessage": "(intermediate value).createReadStream is not a function",
"trace": [
"TypeError: (intermediate value).createReadStream is not a function",
" at Runtime.exports.handler (/var/task/app.js:29:86)",
" at processTicksAndRejections (internal/process/task_queues.js:94:5)"
]
}
Run Code Online (Sandbox Code Playgroud)
谁能建议如何以异步(异步/等待方式)函数从 S3 对象创建读取流?谢谢你!
感谢 Mark BI,我又向前迈进了一步: …
amazon-s3 amazon-web-services node.js async-await aws-lambda
编写 lambda 函数来执行一些数据库查询,然后向某些用户组发送电子邮件。
会员收到该电子邮件两次。
该应用程序是一款音乐流媒体应用程序,用户可以在其中创建歌曲。他们还可以创建群组、邀请成员加入这些群组并向这些群组分享他们的歌曲。
这是通过 API 调用的 lambda:
const shareWithGroup = async event => {
const { songCuid, groupCuids } = JSON.parse(event.body);
const shareSongDB = await query(
sql.queryShareWithGroup(songCuid, groupCuids),
); //share to group in DB
if (!shareSongDB) {
return corsUtil.failureWithCors("Couldn't Share Song with group");
}
const song = await query(sql.queryRead(songCuid));
if (!song) {
return corsUtil.failureWithCors('Song doesnt exist');
}
const songTitle = song.rows[0].songTitle; //retrieve songTitle
const promises = groupCuids.map(async groupCuid => { …Run Code Online (Sandbox Code Playgroud) 我试图从 laravel 中的 php 代码调用现有的 aws-lambda 函数来获取数据并保存在我的数据库中。我想要调用的实际命令如下:
aws lambda invoke --function-name expo2020-metrics --region eu-west-3 response.json
Run Code Online (Sandbox Code Playgroud)
这是我用来调用我的函数的代码:
use Aws\Lambda\LambdaClient;use Aws\Credentials\Credentials;
$credentials = new Credentials('YOUR_ACCESS_KEY', 'YOUR_SECRET_KEY');
$client = LambdaClient::factory(array(
'credentials' => $credentials,
'region' => 'eu-west-3',
'version' => 'latest'
));
$result = $client->getFunction(array(
'FunctionName' => 'expo2020-metrics',
));
Run Code Online (Sandbox Code Playgroud)
但我收到以下回复:
{"Message":"User: arn:aws:iam::677537359471:user/customer/expo2020-metrics is not authorized to perform: lambda: GetFunction on resource: arn:aws:lambda:eu-west-3:677537359471:function:expo2020-metrics"}
我不确定我是否使用了正确的代码来调用该函数。我使用的是AWS提供的PHP sdk。
我有一个 lambda 函数,它通过 AWS lambda 函数处理 POST 请求。它处理 post 请求的正文并进行查询并返回响应。
我的 Lambda 函数
const { Pool, Client } = require("pg");
const userName = 'blah';
const hostEndPoint = 'blah';
const databaseType = 'blahblah';
const pwd = 'pass pass';
const portNumber = 5432;
var AWS = require('aws-sdk');
const pool = new Pool({
user: userName,
host: hostEndPoint,
database: databaseType,
password: pwd,
port: portNumber
});
exports.handler = async (event) => {
let body = JSON.parse(event.body);
let name = body.name;
let money = body.money;
let …Run Code Online (Sandbox Code Playgroud) 我收到有关 S3 存储桶上传的通知,以将消息放入 SQS 队列中。SQS 队列触发 lambda 函数。我正在尝试提取从触发 lambda 函数的 SQS 消息中上传的文件的名称。当打印到 CloudWatch 日志时,我的 SQS 事件记录如下所示:
{
"Records": [
{
"eventVersion": "2.1",
"eventSource": "aws:s3",
"awsRegion": "eu-west-2",
"eventTime": "2020-04-05T13:55:30.970Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "A2RFWU4TTDGK95"
},
"requestParameters": {
"sourceIPAddress": "HIDDEN"
},
"responseElements": {
"x-amz-request-id": "024EF2A2E94BD5CA",
"x-amz-id-2": "P/5p5mDwfIu29SeZcNo3wjJaGAiM4yqBqp4p3gOfLVPeZhf+w5sRjnxsost3BuYub1FVf7tuMFs9KoC98+fwSI9NrT5WbjYq"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "ImageUpload",
"bucket": {
"name": "HIDDEN",
"ownerIdentity": {
"principalId": "A2RFWU4TTDGK95"
},
"arn": "arn:aws:s3:::HIDDEN"
},
"object": {
"key": "activity1.png",
"size": 41762,
"eTag": "9e1645a32c2948139a90e75522deb5ab",
"sequencer": "005E89E354A986B50D"
}
}
}
]
} …Run Code Online (Sandbox Code Playgroud) 这是我的 lambda 角色代码,我希望我的函数从 iam/lambda-assume-policy.json 的文件路径读取文件:
resource "aws_iam_role" "lambda_role" {
name = "lambda_role"
assume_role_policy = file("./iam/lambda-assume-policy.json")
}
Run Code Online (Sandbox Code Playgroud)
当我运行 terraform plan 时,这是它抛出的错误:
Call to function "file" failed: no file exists at
iam/lambda-assume-policy.json.
Run Code Online (Sandbox Code Playgroud) 我的问题是,如果我在 VSCode 中编写 Lambda 函数,我无法将其部署到 AWS 控制台。
我有一个 AWS 帐户并提供了在 VSCode 中使用的凭据。只是测试使用命令将简单的 Lambda 函数部署到 AWS 控制台serverless deploy。到目前为止还没有成功。它在 S3 上创建存储桶并将邮政编码放在那里。
ConsoleTest 函数是在 AWS Lambda 控制台中手动创建的。

我的 serverless.yml 如下所示:
service: myservice
provider:
name: aws
runtime: nodejs12.x
functions:
hello:
handler: handler.hello
events:
- http:
path: users/create
method: get
Run Code Online (Sandbox Code Playgroud)
我遵循官方指南:https://serverless.com/framework/docs/providers/aws/guide/deploying/
有什么帮助吗?
我正在尝试创建一个 Terraform 模块来构建我的 JS lambda,压缩并部署它们。然而这被证明是有问题的
resource "null_resource" "build_lambda" {
count = length(var.lambdas)
provisioner "local-exec" {
command = "mkdir tmp"
working_dir = path.root
}
provisioner "local-exec" {
command = var.lambdas[count.index].code.build_command
working_dir = var.lambdas[count.index].code.working_dir
}
}
data "archive_file" "lambda_zip" {
count = length(var.lambdas)
type = "zip"
source_dir = var.lambdas[count.index].code.working_dir
output_path = "${path.root}/tmp/${count.index}.zip"
depends_on = [
null_resource.build_lambda
]
}
/*******************************************************
* Lambda definition
*******************************************************/
resource "aws_lambda_function" "lambda" {
count = length(var.lambdas)
filename = data.archive_file.lambda_zip[count.index].output_path
source_code_hash = filebase64sha256(data.archive_file.lambda_zip[count.index].output_path)
function_name = "${var.application_name}-${var.lambdas[count.index].name}"
description = var.lambdas[count.index].description …Run Code Online (Sandbox Code Playgroud) 我正在开发使用Twilio 可编程 SMS 的无服务器AWS 服务来传送文本消息。
当我在本地运行堆栈时(例如sls offline start),我的设置始终成功地传递消息,但在部署的环境中,我似乎甚至无法在Twilio 客户端上调用该方法上调用该方法。
消息传递的设置方式如下:
const twilio = require('twilio');
const twilioClient = twilio(
process.env.TWILIO_SID,
process.env.TWILIO_TOKEN,
{
lazyLoading: true,
}
);
export function sendMessage(user, message) {
twilioClient.messages.create({
from: process.env.TWILIO_NUMBER,
to: user.phone,
body: message,
}, function(err, message) {
console.log('error', err);
console.log('message', message);
});
}
// And then usage in a Serverless Function Handler
function example(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false;
// user is also determined here
sendMessage(user, 'This is …Run Code Online (Sandbox Code Playgroud) aws-lambda ×10
node.js ×6
serverless ×3
amazon-s3 ×2
amazon-sns ×2
terraform ×2
amazon-ses ×1
amazon-sqs ×1
async-await ×1
asynchronous ×1
laravel ×1
php ×1
promise ×1
python ×1
twilio ×1
twilio-api ×1