[英]Invoke AWS Lambda from a node.js app running on local system not S3
我想从我系统上的 node.js 文件调用 AWS Lambda。 我按照在浏览器脚本中调用 Lambda 函数并为未经身份验证的用户创建了一个 Congnito 身份池,并将 IdentityPoolId 嵌入到节点 js 文件中,如下所示:
let AWS = require('aws-sdk'); AWS.config.region = '<my-region>'; let lambda = new AWS.Lambda(); AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: '<my-identity-pool-id>' }); let params = { FunctionName: '<my-lambda-function>', InvocationType: 'RequestResponse', LogType: 'Tail', Payload: '{ "name": "my-name" }' } lambda.invoke(params, (err, data) => { if (err) { console.log(err); } else { if (data.Payload) { console.log('my-lambda-function said: ' + data.Payload); } } });
我的 Lambda 函数:
exports.handler = function(event, context) { context.succeed('Hello ' + event.name); };
我创建了一个附加了 AWSLambdaExecute、AWSLambdaBasicExecutionRole 和 AmazonCognitoReadOnly 策略的 IAM 角色,我在创建 Lambda 时使用相同的角色,并且我在 Cognito 中为未经授权的访问创建的身份池中更新了相同的角色。
当我运行 node app.js 时,我得到的只是错误:UnrecognizedClientException:请求中包含的安全令牌无效。
有人可以通过在我的本地系统上编写一个简单的 NodeJS 文件而不在 S3 存储桶中上传任何 HTML/CSS/JS 文件并且不使用 AccessKeyID、SecretKeyId,仅使用与 Lambda 关联的角色来指出我调用 AWS lambda 的正确方向。
提前致谢。
调用 Lambda 函数的方法有很多种。
如果您的目标是将您的功能用作可以发送和接收请求和响应的 API,您可能应该选择 API 网关集成。
API Gateway 上手非常简单。
为 API 设置 IAM 角色和策略以调用 Lambda 函数
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
为 Lambda 函数创建 API 资源
在 API 网关控制台中,创建一个 API。
在 API 的根目录下创建/ResourceName资源。
根据您的要求创建 GET 或 POST 方法。
为集成类型选择 AWS 服务,然后选择您在相应区域创建的 Lambda 函数。
现在,您可以根据您的要求使用身体映射模板自定义集成请求。
您可以查看API Gateway Integration with Lambda的详细文档:
在本节中,我们将引导您完成使用 AWS 服务和 Lambda 函数集成类型将 API 与 Lambda 函数集成的步骤。
一旦您的测试调用成功,您就可以使用API_NAME/Dashboard中的 API 调用 URL,它类似于:
https:// ###****.execute-api.us-west-2.amazonaws.com/{APIStageName}/
它可以用作 REST 端点,并且可以从本地的 Node js 函数调用。 不要忘记使用 API 密钥为您的 API 启用身份验证。
此外,如果您要在此类环境中使用它,请查看生产清单。
我有同样的问题,我能够使用 Kinesis Stream 解决它。 Lambda 函数充当消费者。 您必须为 Lambda 函数创建一个触发器,如下所示:
function createTrigger (kinesisArn, lambdaName) { // Create params const for trigger const params = { EventSourceArn: kinesisArn, FunctionName: lambdaName, StartingPosition: 'LATEST', BatchSize: 100 } return new Promise((resolve, reject) => { lambda.createEventSourceMapping(params, (err, data) => { if (err) reject(err) else resolve(data) }) }) }
每次将新数据推送到 Kinesis 流时,都会调用您的 Lambda 函数。
以下是如何在 AWS Kinesis 流上发送数据的示例:
function send(streamName, partition, msg) { const params = { Data: JSON.stringify(msg), // data you want to send to your Lambda function PartitionKey: partition, // an id for each shard StreamName: streamName } return new Promise((resolve, reject) => { kinesis.putRecord(params, (err, data) => { if(err) reject(err) else resolve(data); }) }); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.