繁体   English   中英

从在本地系统而非 S3 上运行的 node.js 应用程序调用 AWS Lambda

[英]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 函数的方法有很多种。

  • AWS 服务事件(例如:SNS 触发)
  • 通过 AWS API Gateway 创建的 API。
  • Amazon CloudWatch cron 作业
  • 利用 AWS Lambda API 的 API 调用。

如果您的目标是将您的功能用作可以发送和接收请求和响应的 API,您可能应该选择 API 网关集成。

API Gateway 上手非常简单。

  • 准备好您的 Lambda 函数。
  • 为 API 设置 IAM 角色和策略以调用 Lambda 函数

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "*" } ] }
  • 为 Lambda 函数创建 API 资源

    1. 在 API 网关控制台中,创建一个 API。

    2. 在 API 的根目录下创建/ResourceName资源。

    3. 根据您的要求创建 GET 或 POST 方法。

    4. 为集成类型选择 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM