从节点应用程序调用 amazon lambda 函数
Posted
技术标签:
【中文标题】从节点应用程序调用 amazon lambda 函数【英文标题】:Invoke amazon lambda function from node app 【发布时间】:2016-02-13 01:06:49 【问题描述】:我正在阅读关于如何创建 lambda 函数的基本 AWS:
http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-create-function.html
在这个例子中,我们正在创建一个图像大小调整服务,触发它的一种方法是监听一些要推送到 S3 存储桶的图像,然后执行 lambda 函数。
但我试图了解如何从我的 nodejs 应用程序调用此 lambda 函数,当用户将图像发送到我的节点服务器时,我通过 REST API 将此图像发送到 aws lambda 以重新调整大小,然后接收新的图像位置作为响应。
有什么我可以效仿的例子吗?我对实际的调用部分更感兴趣,因为我已经启动并运行了我的 lambda 服务。
谢谢
【问题讨论】:
【参考方案1】:由于您使用的是 node.js 服务器,您可以直接使用 AWS javascript 开发工具包 (https://www.npmjs.com/package/aws-sdk) 调用您的 lambda。这样您就不必担心使用 API Gateway。
从您的服务器调用很简单:
var AWS = require('aws-sdk');
// you shouldn't hardcode your keys in production! See http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
AWS.config.update(accessKeyId: 'akid', secretAccessKey: 'secret');
var lambda = new AWS.Lambda();
var params =
FunctionName: 'myImageProcessingLambdaFn', /* required */
Payload: PAYLOAD_AS_A_STRING
;
lambda.invoke(params, function(err, data)
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
);
在此处查看 SDK 文档的其余部分:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
【讨论】:
选择哪个触发器配置从服务器调用它?【参考方案2】:这是一个更符合最新 JavaScript 的答案。
import AWS from 'aws-sdk';
const invokeLambda = (lambda, params) => new Promise((resolve, reject) =>
lambda.invoke(params, (error, data) =>
if (error)
reject(error);
else
resolve(data);
);
);
const main = async () =>
// You shouldn't hard-code your keys in production!
// http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
AWS.config.update(
accessKeyId: 'AWSAccessKeyId',
secretAccessKey: 'AWSAccessKeySecret',
region: 'eu-west-1',
);
const lambda = new AWS.Lambda();
const params =
FunctionName: 'my-lambda-function',
Payload: JSON.stringify(
'x': 1,
'y': 2,
'z': 3,
),
;
const result = await invokeLambda(lambda, params);
console.log('Success!');
console.log(result);
;
main().catch(error => console.error(error));
更新
高兴! AWS 开发工具包现在支持 Promise:
import AWS from 'aws-sdk';
const main = async () =>
// You shouldn't hard-code your keys in production!
// http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
AWS.config.update(
accessKeyId: 'AWSAccessKeyId',
secretAccessKey: 'AWSAccessKeySecret',
region: 'eu-west-1',
);
const params =
FunctionName: 'my-lambda-function',
Payload: JSON.stringify(
'x': 1,
'y': 2,
'z': 3,
),
;
const result = await (new AWS.Lambda().invoke(params).promise());
console.log('Success!');
console.log(result);
;
main().catch(error => console.error(error));
【讨论】:
以上是关于从节点应用程序调用 amazon lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章
访问 AWS Lambda 的 Amazon CloudWatch 日志
AWS Lambda 中的 Amazon S3 waitFor()
Amazon Aurora Postgres 是不是支持 lambda 调用?