在客户端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...
在服务器端节点.js中,我不手动设置任何 AWS 凭证,但前提是在客户端设置它们就足够了,因为:
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
...
请求后,将按预期调用服务器的上载处理程序,但在该处理程序中,s3.putObject()
失败并显示"拒绝访问"错误。为了调试它,我将console.log(AWS.config.credentials(添加到上传处理程序中,Cloudwatch显示:
accessKeyId: 'ASIA...
我不认识显示的访问密钥 ID,它肯定与请求标头中提供的 accessKeyId 不匹配。 我在这里做错了什么,还是这是预期的行为?
Lambda 函数不使用您在客户端 JavaScript 代码中使用的 AWS 凭证。客户端代码中的凭证用于向 AWS API 发出 Lambda.invoke(( 命令。在这种情况下,您在客户端使用的凭证只需要 Lambda 调用权限。
然后,AWS Lambda 服务会调用您的 Lambda 函数。Lambda 服务会将 IAM 执行角色附加到您在创建/配置 Lambda 函数时指定的调用。该 IAM 执行角色需要具有适当的 S3 访问权限。