我需要为我的客户提供临时访问密钥以连接到物联网服务(发布,接收等)。为了提供这种访问,我创建了一个Lambda函数,它调用sts.assumeRole
来创建临时STS密钥。这些键正在创建并且看起来很好。
我正在使用带有Lambda的assumeRole,并使用以下内联策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:Connect",
"iot:Subscribe",
"iot:Publish",
"iot:Receive"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"ec2:*"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"sts:AssumeRole"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
注意:我添加了ec2权限以尝试辅助(简化)测试。
此角色具有开放的信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
但是,在我的客户端代码(浏览器)中,我无法连接到IoT,并且收到以下错误:
WebSocket连接到'wss://my-endpoint.iot.us-east-1.amazonaws.com/mqtt?X-Amz-Algorithm = AWS4-H ...签名=我的签名'失败:WebSocket期间出错handshake:意外的响应代码:403
尝试简化测试,我使用过EC2,但收到了另一个权限错误。使用的代码如下(在浏览中使用browserify捆绑)。
const AWS = require('aws-sdk');
// connect to Lambda to retrieve accessKeyId and secretAccessKey
$.ajax({
method: 'GET',
url: 'my-url',
success: function(res) {
// connect to EC2
AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, region: res.region});
const ec2 = new AWS.EC2();
ec2.describeInstances({}, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
});
错误:
POST {{3}} 401(未经授权)
错误:AWS无法验证提供的访问凭据(...)“AuthFailure:AWS无法验证提供的访问凭据”
答案 0 :(得分:1)
发现错误。当与客户端连接时,我需要提供由assumeRole创建的sessionToken。
客户代码:
// connect to EC2
AWS.config.update({accessKeyId: res.accessKeyId, secretAccessKey: res.secretAccessKey, sessionToken: res.sessionToken, region: res.region});
const ec2 = new AWS.EC2();
ec2.describeInstances({}, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});