2017-11-10 2 views
0

Ich versuche, einen S3-Bucket zu erstellen und ihm sofort ein Lambda-Benachrichtigungsereignis zuzuweisen.S3-Bucket-Lambda-Ereignis: Die folgenden Zielkonfigurationen konnten nicht validiert werden

Hier ist der Knoten Testskript schrieb ich:

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 Schaffung funktioniert gut, aber aus dem s3.putBucketNotificationConfiguration Aufruf 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 es mit einem zu zugewiesenen Rolle ausgeführt haben Lambda mit, was ich denke, sind alle Richtlinien, die es braucht. Ich könnte etwas verpassen. Ich verwende meine Root-Zugriffsschlüssel, um dieses Skript auszuführen.

Role

Ich habe gedacht, es könnte ein Timing-Fehler sein, wenn S3 Zeit, um den Eimer erstellen muss, bevor das Ereignis hinzufügen, aber ich habe eine Weile fest einprogrammiert den Eimer Namen wartete, und mein Skript laufen wieder Das wirft den gleichen Fehler.

Die seltsame Sache ist, dass, wenn ich den Ereignis-Hook in der S3-Benutzeroberfläche erstellen und sofort löschen, mein Skript funktioniert, wenn ich diesen Bucket-Namen fest in es codieren. Es scheint, als ob das Erstellen des Ereignisses in der Benutzeroberfläche einige erforderliche Berechtigungen hinzufügt, aber ich bin mir nicht sicher, was das im SDK oder in der Benutzeroberfläche der Konsole sein würde.

S3 Event Config

Irgendwelche Gedanken oder Dinge zu versuchen? Vielen Dank für Ihre Hilfe

Antwort

2

Sie erhalten diese Nachricht, weil Ihr s3-Bucket keine Berechtigungen zum Aufrufen Ihrer Lambda-Funktion enthält.

Nach AWS documentation! gibt es zwei Arten von Berechtigungen erforderlich:

  1. Berechtigungen für Ihre Funktion Lambda Dienste
  2. Berechtigungen aufzurufen für Amazon S3 Ihre Lambda-Funktion aufzurufen

Sie ein Objekt vom Typ ‚AWS schaffen sollte: : Lambda :: Permission 'und es sollte ähnlich aussehen:

{ 
    "Version": "2012-10-17", 
    "Id": "default", 
    "Statement": [ 
    { 
     "Sid": "<optional>", 
     "Effect": "Allow", 
     "Principal": { 
     "Service": "s3.amazonaws.com" 
     }, 
     "Action": "lambda:InvokeFunction", 
     "Resource": "<ArnToYourFunction>", 
     "Condition": { 
     "StringEquals": { 
      "AWS:SourceAccount": "<YourAccountId>" 
     }, 
     "ArnLike": { 
      "AWS:SourceArn": "arn:aws:s3:::<YourBucketName>" 
     } 
     } 
    } 
    ] 
} 
Verwandte Themen