S3-Bucket Lambda-Event: kann Nicht überprüfen Sie die folgenden Ziel-Konfigurationen
Ich versuche zu erstellen, die einem S3-bucket und sofort weisen ein lambda-Benachrichtigung-Ereignis, um es.
Hier ist der node test-Skript, das ich schrieb:
const aws = require('aws-sdk');
const uuidv4 = require('uuid/v4');
aws.config.update({
accessKeyId: 'key',
secretAccessKey:'secret',
region: 'us-west-1'
});
const s3 = new aws.S3();
const params = {
Bucket: `bucket-${uuidv4()}`,
ACL: "private",
CreateBucketConfiguration: {
LocationConstraint: 'us-west-1'
}
};
s3.createBucket(params, function (err, data) {
if (err) {
throw err;
} else {
const bucketUrl = data.Location;
const bucketNameRegex = /bucket-[a-z0-9\-]+/;
const bucketName = bucketNameRegex.exec(bucketUrl)[0];
const params = {
Bucket: bucketName,
NotificationConfiguration: {
LambdaFunctionConfigurations: [
{
Id: `lambda-upload-notification-${bucketName}`,
LambdaFunctionArn: 'arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload',
Events: ['s3:ObjectCreated:CompleteMultipartUpload']
},
]
}
};
//Throws "Unable to validate the following destination configurations" until an event is manually added and deleted from the bucket in the AWS UI Console
s3.putBucketNotificationConfiguration(params, function(err, data) {
if (err) {
console.error(err);
console.error(this.httpResponse.body.toString());
} else {
console.log(data);
}
});
}
});
Die Schöpfung funktioniert gut, aber das aufrufen s3.putBucketNotificationConfiguration
von der aws-sdk
wirft:
{ InvalidArgument: Unable to validate the following destination configurations
at Request.extractError ([...]/node_modules/aws-sdk/lib/services/s3.js:577:35)
at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
at Request.emit ([...]/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
at Request.emit ([...]/node_modules/aws-sdk/lib/request.js:683:14)
at Request.transition ([...]/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo ([...]/node_modules/aws-sdk/lib/state_machine.js:14:12)
at [...]/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:685:12)
at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:115:18)
message: 'Unable to validate the following destination configurations',
code: 'InvalidArgument',
region: null,
time: 2017-11-10T02:55:43.004Z,
requestId: '9E1CB35811ED5828',
extendedRequestId: 'tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=',
cfId: undefined,
statusCode: 400,
retryable: false,
retryDelay: 4.3270874729153475 }
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Unable to validate the following destination configurations</Message>
<ArgumentName1>arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload, null</ArgumentName1>
<ArgumentValue1>Not authorized to invoke function [arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload]</ArgumentValue1>
<RequestId>9E1CB35811ED5828</RequestId>
<HostId>tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=</HostId>
</Error>
Ich habe es mit einer Rolle zugeordnet sind, mit lambda, was ich denke, sind all die Maßnahmen, die es braucht. Ich könnte etwas fehlen. Ich bin mit meinem root-Zugriff-Tasten, um dieses Skript auszuführen.
Habe ich gedacht, es könnte ein timing-Fehler an, wenn S3 braucht Zeit, um den Eimer vor der Zugabe der Veranstaltung, aber ich habe eine Weile gewartet, hardcoded die bucket-Namen ein, und führen Sie das Skript erneut die wirft den gleichen Fehler.
Die seltsame Sache ist, dass, wenn ich Falle hook in der S3-UI und sofort zu löschen, mein Skript funktioniert, wenn ich fest, dass Eimer Namen hinein. Es scheint, wie das erstellen das Ereignis im UI-fügt einige Berechtigungen benötigt, aber ich bin mir nicht sicher, was das wäre in der SDK oder in der console UI.
Irgendwelche Gedanken oder Dinge zu versuchen? Vielen Dank für Ihre Hilfe
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie erhalten diese Nachricht, weil Sie Ihren s3-bucket fehlenden Berechtigungen für das aufrufen Ihres lambda-Funktion.
Laut AWS-Dokumentation! es gibt zwei Arten von Berechtigungen erforderlich:
Erstellen Sie ein Objekt des Typs "AWS::Lambda::Permission' und es sollte ähnlich wie diese Aussehen:
AWS::Lambda::Permission
hat Eigenschaften wieSourceArn
etc. nach der S3-Dokumentation. Ich sehe nicht ein policy-Dokument prop gibt. Siehe auch docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/...Schließlich sah das wieder nach einem Jahr. Dies war ein hackathon Projekt vom letzten Jahr, dass wir revisted. @davor.obilinovic Antwort war sehr hilfreich, verweist mich auf die Lambda-Berechtigung, die ich brauchte, um hinzuzufügen. Noch hat mich ein wenig, um herauszufinden, genau das, was ich brauchte, es zu schauen, wie.
Hier sind die AWS-JavaScript-SDK und Lambda-API-docs
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#addPermission-property
https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html
JS-SDK-docs-diese Zeile:
Ich konnte es nicht arbeiten für die längste Zeit und war noch immer das
Unable to validate the following destination configurations
Fehler.Ändern, um
behoben, das Problem. Die
/*
war offensichtlich falsch, und ich sollte haben schaute auf die Antwort, die ich bekam hier mehr dicht, jedoch wurde versucht, die Folgen der AWS-docs.Nach der Entwicklung für eine Weile, und erstellen viele Eimer, Lambda-Berechtigungen und S3 Lambda-Benachrichtigungen, aufrufen von addPermission begann, werfen
The final policy size (...) is bigger than the limit (20480).
neue, individuelle Berechtigungen für jede Gruppe fügt Sie der Unterseite der Lambda-Funktion von Politik und offenbar, die Politik hat eine max Größe.Die Politik scheint nicht bearbeitet werden, in der AWS-Management-Konsole so viel Spaß hatte ich beim löschen jeder Eintrag mit dem SDK. Ich kopierte die Politik JSON, zog die
Sid
s aus und riefremovePermission
in einer Schleife (die warf limit Fehler und ich musste es viele Male).Schließlich entdeckte ich, dass das weglassen der
SourceArn
Schlüssel geben Lambda-Berechtigung für alle S3-buckets.Hier mein letzter code mit dem SDK hinzufügen der Berechtigung, den ich brauchte. Ich lief nur dieses eine mal für meine Funktion.
Die Konsole ist eine weitere Möglichkeit, den s3 zum aufrufen einer lambda:
So dass Sie nur müssen hinzufügen und konfigurieren (s3) auslösen, um Ihr von aws lambda-Konsole
https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html
SourceArn
und indem nur eine einzelne Berechtigung für alle Perioden ist die Lösung und deshalb die Schaffung einer einzigen Genehmigung durch die web-Konsole sollte genauso gut funktionieren.Für mich war es die Lambda erwarten Berechtigung über den gesamten Eimer und nicht den Eimer und die Tasten
Wenn es immer noch nützlich für jemand, das ist, wie ich hinzufügen, die Erlaubnis, die lambda-Funktion, die mit java:
Bitte überprüfen
https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/lambda/AWSLambda.html#addPermission-com.amazonaws.services.lambda.model.AddPermissionRequest-