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

时间:2018-03-03 20:32:26

标签: node.js amazon-web-services aws-lambda

我想从我的系统上后退的node.js文件中调用AWS Lambda。我跟着Invoking a Lambda Function in a Browser Script并为未经身份验证的用户创建了一个Congnito Identity Pool,并将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);
};

我创建了一个IAM角色,附带了AWSLambdaExecute,AWSLambdaBasicExecutionRole和AmazonCognitoReadOnly策略,我在创建Lambda时使用了相同的角色,并且我在Cognito中为未授权访问创建的身份池中更新了相同的角色。 / p>

当我运行节点app.js时,我得到的是错误: UnrecognizedClientException:请求中包含的安全令牌无效。

有人可以通过在我的本地系统上编写一个简单的NodeJS文件来指向我正确的方向来调用AWS lambda,而无需在S3 Bucket中上传任何HTML / CSS / JS文件而不使用AccessKeyID,SecretKeyId,只使用相关的角色与Lambda。

先谢谢。

2 个答案:

答案 0 :(得分:0)

有许多方法可以调用Lambda函数。

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

如果你的目标是使用你的函数作为API,它可以发送和接收请求和响应,你可能应该去API网关集成。

开始使用API​​网关非常容易。

  • 准备好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 Service for Integration类型并选择您在相应区域中创建的Lambda函数。

  • 现在,您可以根据自己的要求使用正文映射模板自定义集成请求。

  • 您可以查看API Gateway Integration with Lambda的详细文档:

      

    在本节中,我们将引导您完成集成API的步骤   使用AWS服务和Lambda函数的Lambda函数   整合类型。

  • 一旦您的测试调用成功,您就可以使用 API_NAME / Dashboard 中的API调用网址,该网址如下所示:

    https:// ###****.execute-api.us-west-2.amazonaws.com/{APIStageName}/

可以用作REST端点,可以从本地的Node js函数调用。 不要忘记使用API​​密钥为您的API启用身份验证。

此外,如果您打算在此类环境中使用它,请查看生产清单。

答案 1 :(得分:0)

我遇到了同样的问题,并且能够使用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);
        })
    });
}