2015-07-22 17 views
5

ich nicht bekommen die folgende Logik zur Liste versucht, mit Hilfe von Java auf AWS Lambda zu arbeiten:Fehler beim AWS Lambda DynamoDB Tabellen

1) Wenn ein neues Objekt in S3 Eimern geschaffen ist, löst eine Lambda-Funktion (geschrieben in Java)

2) Listen Sie in dieser Lambda-Funktion alle DynamoDB-Tabellen auf.

3) Erstellen Sie eine Tabelle, wenn keine vorhanden ist.

4) Schreiben Sie die Details des S3-Objekts als Element in DynamoDB.

Ich bekomme nur Artikel # 1 arbeiten. Wenn es den zweiten Punkt erreicht, stoße ich unten auf einen genehmigungsbezogenen Fehler.

Jede Hilfe oder Anregung?

Die Erlaubnis, die i "mit DynamoDB Basic" verwendet werden, die die folgende Berechtigung hat:

START RequestId: e9ab5aba-307b-11e5-9663-3188c327cf5e fileSize: 1024, DateTime:1970-01-01T00:00:00.000Zs3Key : HappyFace.jpgAWS credential profiles file not found in the given path: /home/sbx_user1052/.aws/credentials: java.lang.IllegalArgumentException java.lang.IllegalArgumentException: AWS credential profiles file not found in the given path: /home/sbx_user1052/.aws/credentials at com.amazonaws.auth.profile.internal.ProfilesConfigFileLoader.loadProfiles(ProfilesConfigFileLoader.java:45) at com.amazonaws.auth.profile.ProfilesConfigFile.loadProfiles(ProfilesConfigFile.java:176) at com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:112) at com.amazonaws.auth.profile.ProfilesConfigFile.(ProfilesConfigFile.java:92) at com.amazonaws.auth.profile.ProfileCredentialsProvider.getCredentials(ProfileCredentialsProvider.java:123) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:1763) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.listTables(AmazonDynamoDBClient.java:1208) at com.amazonaws.services.dynamodbv2.document.internal.ListTablesCollection.firstPage(ListTablesCollection.java:46) at com.amazonaws.services.dynamodbv2.document.internal.PageIterator.next(PageIterator.java:45) at com.amazonaws.services.dynamodbv2.document.internal.IteratorSupport.nextResource(IteratorSupport.java:79) at com.amazonaws.services.dynamodbv2.document.internal.IteratorSupport.hasNext(IteratorSupport.java:47) at com.TriggerDynamoDB.handleRequest(TriggerDynamoDB.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497)

END RequestId: e9ab5aba-307b-11e5-9663-3188c327cf5e REPORT RequestId: e9ab5aba-307b-11e5-9663-3188c327cf5e Duration: 3294.97 ms Billed Duration: 3300 ms Memory Size: 512 MB Max Memory Used: 51 MB

-Code ist wie folgt:

public class TriggerDynamoDB implements RequestHandler<S3Event, String> { 

public String handleRequest(S3Event s3event, Context context) { 
    LambdaLogger logger = context.getLogger(); 
    try {   
     S3EventNotificationRecord record = s3event.getRecords().get(0); 
     // Object key may have spaces or unicode non-ASCII characters. 
     String srcKey = record.getS3().getObject().getKey().replace('+', ' '); 
      srcKey = URLDecoder.decode(srcKey, "UTF-8"); 

     long fileSize = record.getS3().getObject().getSizeAsLong(); 
     DateTime datetime = record.getEventTime(); 

     logger.log("fileSize: " + fileSize + ", DateTime:" + datetime); 
     logger.log("s3Key : " + srcKey); 

     DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
     //Table table = dynamoDB.getTable("dimensionFile"); 

     TableCollection<ListTablesResult> tables = dynamoDB.listTables(); 
     Iterator<Table> iterator = tables.iterator(); 

     while (iterator.hasNext()) { // this is where the error was thrown 
      Table table = iterator.next(); 
      System.out.println(table.getTableName()); 
     }      
     return "Ok"; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 
} 

Antwort

13

die ProfileCredentialsProvider Sie zum AmazonDynamoDBClient Konstruktor versucht Anmeldeinformationen aus demzu ladenDatei. Diese Datei existiert nicht auf dem Host, auf dem Ihre Lambda-Funktion ausgeführt wird, daher die Ausnahme. Dieser Anbieter ist hauptsächlich für Integrationstests vorgesehen, die auf Ihrem Dev-Computer ausgeführt werden und Ihre persönlichen IAM-Benutzeranmeldeinformationen verwenden.

Auf Lambda möchten Sie die EnvironmentVariableCredentialsProvider. Dieser Provider lädt temporäre Anmeldeinformationen für die IAM-Rolle, die Ihrer Lambda-Funktion zugeordnet ist, aus Umgebungsvariablen, die Lambda vor dem Aufrufen Ihres Codes festgelegt hat.

Wenn Sie den Konstruktor ohne Argumente für AmazonDynamoDBClient verwenden, wird standardmäßig DefaultAWSCredentialsProviderChain zum Abrufen von Anmeldeinformationen verwendet. Dieser Provider prüft Umgebungsvariablen, Java-Systemeigenschaften, ~/.aws/credentials und den EC2-Instanzmetadatendienst (in dieser Reihenfolge) und sollte Anmeldeinformationen abfragen, unabhängig davon, ob Sie lokal oder auf Lambda ausgeführt werden.Startseite

+0

Hallo David, mit Nein-Argument-Konstruktor, erhielt ich einen anderen Fehler : com.amazonaws.AmazonServiceException: Das in der Anforderung enthaltene Sicherheitstoken ist ungültig. (Service: AmazonDynamoDBv2; Statuscode: 400; Fehlercode: UnrecognizedClientException; Request ID: BR5G9E5ITKCDCUAACUN17CRG93VV4KQNSO5AEMVJF66Q9ASUAAJG) – Reusable

+0

Und wenn ich InstanceProfileCredentialsProvider verwenden, erhielt ich einen anderen Fehler: com.amazonaws.AmazonClientException: Nicht imstande, Anmeldeinformationen von Amazon EC2 Metadatendienst zu laden – Reusable

+2

Oh oh ! Ich habe die Ursache und Lösung gefunden. Innerhalb des Lambda-Containers sind die Anmeldeinformationen in der Umgebung verfügbar, daher musste ich nur EnvironmentVariableCredentialsProvider() verwenden. Danke, dass du den Hinweis hier niedergelegt hast David! – Reusable

0

Sie DynamoDB brauchen listTables-Berechtigung für die Vorgänge
Darüber hinaus müssen Sie korrekt auf die Ressource angeben: als „*“ nicht „“

Hier eine gültige Politik ist Listtables einschließlich:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1428341300017", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem", "dynamodb:ListTables" ], "Effect": "Allow", "Resource": "" }, { "Sid": "", "Resource": "", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" } ] }

Auch für die Zukunft, lesen Sie/dies ausprobieren: http://docs.aws.amazon.com/IAM/latest/UserGuide/policies_testing-policies.html

+0

Ich habe bekommen „DynamoDB: Listtables“ als Teil der vorherigen Prüfung, scheiterte es auf dem gleichen Grunde. Ich denke, das ist ein anderes Problem, weil die Fehlermeldung klingt, als ob Lambda überhaupt keine Anmeldedatei finden könnte. – Reusable

+0

Das Sternchen "*" ist da, ich glaube, ich habe ein Zitat verwendet, und es versteckt das *. Ich habe den JSON stattdessen in ein Bild umgewandelt. Trotzdem, danke, dass du darauf hingewiesen hast. – Reusable

+0

also scheitert das noch für dich? – Mircea

0

Zum Konsole> IAM> Gruppen> Ihre Gruppe> Berechtigungen> Anhängen Politik

hinzufügen AmazonDynamoDBReadOnlyAccess, AWSLambdaInvocation-DynamoDB

Zum Console Home> IAM> Gruppen> IHRE GROUP> Benutzer> Benutzer hinzufügen zur Gruppe (IHR USER hier zur Gruppe hinzufügen)

zum Console Home> IAM> Benutzer> IHR USER> Create Access Key

BasicAWSCredentials b = new BasicAWSCredentials("Access Key ID","Secret Access Key");   
AmazonDynamoDBClient client = new AmazonDynamoDBClient(b); 
0

Statt

new AmazonDynamoDBClient(new ProfileCredentialsProvider()) 

Verwendung

AmazonDynamoDBClientBuilder.standard().build() 

diese Funktion selbst Anmeldeinformationen von Umwelt

Verwandte Themen