为什么我的访问密钥会改变? (使用AWS javascript& node.js API for Lambda)

时间:2017-11-20 16:22:30

标签: javascript node.js amazon-s3 aws-lambda aws-sdk

在客户端javascript中,我设置:

    AWS.config.credentials = { 
        "accessKeyId": ak,  // starts with "AKIA..."
        "secretAccessKey": sk // something long and cryptic
    };

然后最终打电话

    var lambda = new AWS.Lambda({apiVersion: '2015-03-31'});
    var params = {
      FunctionName: 'my-function-name',
      InvokeArgs : my_data
    };
    lambda.invokeAsync(params, function(err, data) {
    ...

HTML请求似乎包含正确的访问密钥:

    authorization:AWS4-HMAC-SHA256 Credential=AKIA...

在服务器端node.js中,我不会手动设置任何AWS凭据,但要了解在客户端设置它们就足够了,因为:

   var AWS = require('aws-sdk');
   var s3 = new AWS.S3();
   ...

根据请求,服务器的上传处理程序按预期调用,但在该处理程序中,s3.putObject()失败并显示“拒绝访问”错误。尝试调试这个,我将console.log(AWS.config.credentials)添加到上传处理程序,Cloudwatch显示:

    accessKeyId: 'ASIA...

我不会识别显示的accessKeyId,它肯定不会与请求标头中提供的那个匹配。我在这里做错了什么,或者这是预期的行为?

1 个答案:

答案 0 :(得分:1)

Lambda函数不使用您在客户端JavaScript代码中使用的AWS凭据。客户端代码中的凭据用于向AWS API发出Lambda.invoke()命令。在此上下文中,您在客户端使用的凭据只需要Lambda调用权限。

然后,AWS Lambda服务会调用您的Lambda函数。 Lambda服务会将IAM Execution Role附加到您在创建/配置Lambda函数时指定的调用。 IAM执行角色需要具有适当的S3访问权限。