1

Ich habe eine Lambda-Funktion, die einige Daten in eine Elasticsearch Domain schreibt, die ich auch über AWS eingerichtet habe. Derzeit ist die Zugriffsrichtlinie auf meiner Domain ist nur meine eigene IP-Adresse zu ermöglichen, mit der DomäneProper Signierung von Anfragen an aws Ressourcen über http

{"Version": "2012-10-17", "Statement": [{ 
"Effect": "Allow", "Principal": {"AWS": "*"}, 
"Action": "es:*", 
"Resource": "arn:aws:es:us-east-1:$ACCOUNT:domain/DOMAIN/*", 
"Condition": { "IpAddress": { "aws:SourceIp": $MYIP } } 
}]} 

ich die aws4 library Anfragen nach Unterzeichnung http zu arbeiten. Ich verwende es als solches:

axios(aws4.sign({ 
    host: process.env.ES_ENDPOINT, 
    method: "post", 
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`, 
    data, 
})) 

Diese tatsächlich arbeiten vor, ohne aws4.sign Stück, wie ich die ES-Domäne vollständig geöffnet hatte, aber jetzt habe ich die IP-Adressrichtlinie oben angewandt.

Nun, ich ständig einen Fehler wie diese als Antwort erhalten:

Die Anfrage Unterschrift wir die Signatur nicht übereinstimmt berechnet wird Ihnen zur Verfügung gestellt. Überprüfen Sie den geheimen AWS-Zugriffsschlüssel und die Signaturmethode. Weitere Informationen finden Sie in der Servicedokumentation.

Gibt es noch etwas, was ich tun muss, um die Anfrage richtig zu unterschreiben?

Antwort

2

Das hat eigentlich mit den beiden Bibliotheken zu tun, axios und aws4. aws4 wird basierend auf einer normalen NodeJS http Anfrage signiert, und in einer POST-Anfrage mit einem Körper ist der Körper erforderlich, um die Anfrage ordnungsgemäß zu unterzeichnen.

Das ist ziemlich einfach auch fixiert

axios(aws4.sign({ 
    host: process.env.ES_ENDPOINT, 
    method: "POST", 
    url: `https://${process.env.ES_ENDPOINT}/foobot/foobot`, 
    data, 
    body: JSON.stringify(data), 
    path: "/foobot/foobot", 
})) 
in body und path vorbei