在客户端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,它肯定不会与请求标头中提供的那个匹配。我在这里做错了什么,或者这是预期的行为?
答案 0 :(得分:1)
Lambda函数不使用您在客户端JavaScript代码中使用的AWS凭据。客户端代码中的凭据用于向AWS API发出Lambda.invoke()命令。在此上下文中,您在客户端使用的凭据只需要Lambda调用权限。
然后,AWS Lambda服务会调用您的Lambda函数。 Lambda服务会将IAM Execution Role附加到您在创建/配置Lambda函数时指定的调用。 IAM执行角色需要具有适当的S3访问权限。