Ich lerne die AWS-Dienste für einen Anwendungsfall. Nachdem ich die Dokumentation durchgelesen hatte, kam mir der einfache Fluss. Ich möchte Daten in die Kinesis-Streams aufnehmen, indem ich die Streams API und die KPL benutze. Ich verwende die putRecord-Beispielmethode, um Daten in die Streams aufzunehmen. Ich bin die Einnahme der diese JSON in den Stream -Kinesis Lambda DynamoDB
{"userid":1234,"username":"jDoe","firstname":"John","lastname":"Doe"}
Sobald die Daten aufgenommen wird i die folgende Antwort in putRecordResult bekommen -
Put Result :{ShardId: shardId-000000000000,SequenceNumber: 49563097246355834103398973318638512162631666140828401666}
Put Result :{ShardId: shardId-000000000000,SequenceNumber: 49563097246355834103398973318645765717549353915876638722}
Put Result :{ShardId: shardId-000000000000,SequenceNumber: 49563097246355834103398973318649392495008197803400757250}
Jetzt habe ich eine Lambda-Funktion schreiben, um diese Daten zu erhalten, und drücken Sie in eine DynamoDB-Tabelle. Hier ist meine Lambda-Funktion -
console.log('Loading function');
var AWS = require('aws-sdk');
var tableName = "sampleTable";
var doc = require('dynamodb-doc');
var db = new doc.DynamoDB();
exports.handler = (event, context, callback) => {
//console.log('Received event:', JSON.stringify(event, null, 2));
event.Records.forEach((record) => {
// Kinesis data is base64 encoded so decode here
const payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
console.log('Decoded payload:', payload);
var userid = event.userid;
var username = event.username;
var firstname = event.firstname;
console.log(userid + "," + username +","+ firstname);
var item = {
"userid" : userid,
"username" : username,
"firstname" : firstname
};
var params = {
TableName : tableName,
Item : item
};
console.log(params);
db.putItem(params, function(err, data){
if(err) console.log(err);
else console.log(data);
});
});
callback(null, `Successfully processed ${event.Records.length} records.`);
};
Irgendwie habe ich nicht in der Lage bin, die console.logs in der Lambda-Funktionen Ausführung zu sehen. Ich sehe auf der Streams-Seite, dass es putRecord in den Stream gegeben haben und auch bekommen, aber irgendwie kann ich nichts auf der Lambdafunction-Seite noch in der DynamoDB-Tabelle sehen.
Ich habe eine IAM-Richtlinie für den Java-Code für die Aufnahme der Daten in Kinesis, eine andere für die Lambda-Funktion, die Lambda-Kinesis-Ausführungsrolle ist und eine Richtlinie für die DynamoDB Daten in die Tabellen aufnehmen.
Gibt es ein Tutorial, das zeigt, wie es richtig gemacht wird? Ich habe das Gefühl, dass ich viele Punkte in diesem Prozess vermisse, zum Beispiel wie man all diese IAM-Richtlinien verbindet und synchronisiert, so dass die Daten, wenn sie in den Stream eingegeben werden, von Lambda verarbeitet werden und in Dynamo landen.
Alle Hinweise und Hilfe wird sehr geschätzt.
Wird Ihre Lambda-Funktion überhaupt aufgerufen? Sie erwähnen das nicht, also frage ich mich, ob Sie das AWS Lambda Event aktiviert haben, das Daten von Kinesis an Ihre Funktion weitergibt: http://docs.aws.amazon.com/lambda/latest/dg/with-kinesis -beispiel-configure-event-source.html – devonlazarus
Vielen Dank für den Kommentar. Ja, ich habe den Kinesis-Stream auf der Registerkarte "Event Sources" der Lambda-Funktion hinzugefügt und zeigt State-enabled und Details as an - Batchgröße: 100, Letztes Ergebnis: OK. Wenn ich Test Event mit Kinesis Sample Event Template und Test konfiguriere gibt es Fehler bei der Angabe von Item: {id: undefiniert, Benutzername: undefiniert, Vorname: undefiniert} – Dan
Wenn du oben stehst, ist eine direkte Kopie des Codes, den du benutzt referenzieren Sie 'event.userid', aber Sie sollten' payload.userid' verwenden. Sie haben den Kinesis-Datensatz in die Variable 'Nutzlast' dekodiert. – devonlazarus