前言:我在整个集成过程中,存在最大的问题有两个,
1. 没有考虑到lambda函数的权限,即对DynamoDB或者其他如Kinesis的权限授权,导致无法写入或者读取。
2.最初使用了异步方式调用,导致无法写数据到DynamoDB,把代码改成同步调用即可
创建Lambda函数
'use strict'
console.log('Loading function');var aws = require('aws-sdk');
var docClient = new aws.DynamoDB.DocumentClient({region: 'ap-southeast-1'});exports.handler = function(event, context,callback) {var records = event.Records;if(records){records.forEach(function(record){//console.log('record:',record);//var payload = new Buffer(record.kinesis.data,'base64').toString('ascii');var payload = Buffer.from(record.kinesis.data, 'base64').toString('ascii');console.log('Decode payload:',payload);var params ={Item:{date:Date.now(),message:payload},TableName:"Lambda-Dynamo-Write-Read-China"};if(docClient){console.log('docClient is not null');console.log('params date:',params.Item.date);// //await ddb.put(params).promise();//await ddb.put(params).promise();docClient.put(params,function(err,data){if(err){console.log("Fail to Write into AWS DynamoDB");callback(err,null);}else{console.log("Successfully write item into AWS DynamoDB")callback(null,data)}});}else{console.log('docClient is null');}});}else{console.log('records is empty');}};
创建好之后保存,然后进行部署(deploy)
然后在IAM中,对相应的角色进行授权(lambda-kinsis-guangzhou-role-xxx)这个角色名是创建lambda自动生成的,在上面增加相应的权限即可。
创建触发器
创建DynamoDB 的表
创建好后,给表增加属性字段
注意:只需要增加一个分区字段date即可,message字段,在Lambda方法中,作为入参传入即可
创建Kinesis
在本地使用aws-cli发送消息报文
在DynamoDB如果能看到发送的数据,即集成成功