2017-11-20 1 views
0

In clientseitige Javascript, habe ich:Warum ändert sich mein Zugriffsschlüssel? (Unter Verwendung von AWS javascript & node.js APIs für Lambda)

AWS.config.credentials = { 
     "accessKeyId": ak, // starts with "AKIA..." 
     "secretAccessKey": sk // something long and cryptic 
    }; 

Dann rufen schließlich

var lambda = new AWS.Lambda({apiVersion: '2015-03-31'}); 
    var params = { 
     FunctionName: 'my-function-name', 
     InvokeArgs : my_data 
    }; 
    lambda.invokeAsync(params, function(err, data) { 
    ... 

Die HTML-Anforderung den richtigen Zugriffsschlüssel zu enthalten scheint, :

authorization:AWS4-HMAC-SHA256 Credential=AKIA... 

Und in serverseitige node.js, ich alle AWS-Anmeldeinformationen nicht manuell eingestellt, mit dem Verständnis, dass sie in der Client-Seite Einstellung suffici ist hno, wie:

var AWS = require('aws-sdk'); 
    var s3 = new AWS.S3(); 
    ... 

die Anfrage folgenden wird die Upload-Handler des Servers wird wie erwartet genannt, aber in diesem Handler, nicht s3.putObject() mit einem Fehler Zugriff verweigert. Der Versuch, dies zu debuggen, fügte ich console.log (AWS.config.credentials) mit dem Upload-Handler und Cloudwatch zeigt:

accessKeyId: 'ASIA... 

Ich habe nicht die accessKeyId erkennen, dass gezeigt wird, und es ist sicherlich doesn‘ t dem im Anfrageheader angegebenen entsprechen. Tue ich hier etwas falsch oder ist das erwartetes Verhalten?

+0

@errhunter, Ich habe meine Frage bearbeitet, um zu erwähnen, dass ich keine Anmeldeinformationen auf der Serverseite festlegen werde. –

Antwort

1

Die Lambda-Funktion verwendet nicht die AWS-Anmeldeinformationen, die Sie in Ihrem clientseitigen JavaScript-Code verwendet haben. Die Anmeldeinformationen in Ihrem clientseitigen Code wurden verwendet, um einen Lambda.invoke() -Befehl an die AWS-API auszugeben. In diesem Kontext benötigen die Anmeldeinformationen, die Sie auf der Clientseite verwenden, nur die Lambda-Aufrufberechtigung.

Ihre Lambda-Funktion wird dann vom AWS Lambda-Service aufgerufen. Der Lambda-Service verknüpft den IAM Execution Role mit dem Aufruf, den Sie beim Erstellen/Konfigurieren der Lambda-Funktion angegeben haben. Diese IAM-Ausführungsrolle muss über den entsprechenden S3-Zugriff verfügen.

+0

Mit dieser Information und dieser Antwort auf eine verwandte Frage: https://stackoverflow.com/a/41933694/256305 konnte ich die s3.putObject-Fehler vermeiden, indem ich den Principal-Benutzer der Bucket-Richtlinie auf die Ausführung der Ausführung der Lambda-Funktion setzte Rolle. –

+0

Persönlich würde ich der Lambda-Ausführungsrolle (über eine IAM-Richtlinie) die entsprechenden IAM-Berechtigungen hinzufügen, anstatt eine S3-Bucket-Richtlinie zu verwenden. –

+0

Ich würde es vorziehen, IAM-Berechtigungen der Lambda-Ausführungsrolle hinzuzufügen, aber es schien nicht zu funktionieren, selbst wenn alle 108 oder so S3-Berechtigungen in der Richtlinie aktiviert wurden. Ich frage mich, ob ein Nebeneffekt der Bucket auch für statische Website-Hosting konfiguriert werden könnte? –

Verwandte Themen