IoTサービス(パブリッシュ、受信など)に接続するためにクライアントに一時アクセスキーを与える必要があります。このアクセスを提供するために、sts.assumeRole
を呼び出して一時的なSTSキーを作成するラムダ関数を作成しました。それらのキーは作成されており、上手く見えます。私は、次のインラインポリシーを持つロールにラムダとassumeRoleを使用していAWSの一時的な資格情報(STS)を使用できません - 禁止されています
:
{
"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 connection to 'wss://my-endpoint.iot.us-east-1.amazonaws.com/mqtt?X-Amz-Algorithm=AWS4-H…Signature=my-signature' failed: Error during WebSocket handshake: Unexpected response code: 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 https://ec2.us-east-1.amazonaws.com/ 401 (Unauthorized)
Error: AWS was not able to validate the provided access credentials(…) "AuthFailure: AWS was not able to validate the provided access credentials"