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);
}
}
}
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
Und wenn ich InstanceProfileCredentialsProvider verwenden, erhielt ich einen anderen Fehler: com.amazonaws.AmazonClientException: Nicht imstande, Anmeldeinformationen von Amazon EC2 Metadatendienst zu laden – Reusable
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