0

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"

答えて

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 
}); 
関連する問題