查看原文
其他

大咖专栏 | AWS Kinesis的Javascript交互方法(上篇)

2016-08-29 AWS云计算
大咖专栏
大咖专栏是亚马逊AWS官方微信新开设的栏目。本专栏主要刊登亚马逊AWS诸位大咖讲师亲自撰写的Blog,内容涉猎广泛,话题讨论前沿,且与实战紧密相连。我们非常欢迎小伙伴们在评论区留言,与大咖互动交流!
今天为大家撰文的大咖,是亚马逊AWS解决方案架构师——邓明轩老师,和我们年轻有为的亚马逊AWS解决方案架构师实习生——邱越俊同学。
邓明轩亚马逊AWS解决方案架构师拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术挑战,目前在集中精力学习分布式计算环境下的机器学习算法。
邱越俊亚马逊AWS解决方案架构师实习生擅长Web开发,熟悉使用Java、Javascript、Html5、Mysql数据库,曾在多个互联网公司从事软件平台开发工作,对计算机网络架构、云平台的开发和部署有一定的经验。

 一.  介绍
Amazon Kinesis是一种托管的弹性可扩展服务,能实时处理大规模的流数据。在该服务收集大数据记录流后,可用多种数据处理应用程序实时处理该数据流。Amazon Kinesis Streams每小时可从数十万种来源中连续捕获和存储数TB数据,如网站点击流、财务交易、社交媒体源、IT日志和定位追踪事件。Amazon Kinesis Streams数据流的吞吐量每小时可从数MB扩展到数TB,PUT记录每秒钟可从数千次扩展到数百万。您可以随时根据您的输入数据量动态调节数据流的吞吐量。
AWS为旗下的服务提供了多种开发工具包,支持包括Java、PHP、Python、Ruby、浏览器端等语言或平台。对于Amazon Kinesis,我们除了使用上述的Stream API进行开发外,AWS还提供了Amazon Kinesis Client Library (KCL) 开发适用于Amazon Kinesis Streams的使用器应用程序。在本文中,我们展示如何使用Javascript在浏览器端与Amazon Kinesis进行交互,包括把记录Put到Kinesis,和从Kinesis读取记录。

 二.  基本概念与限制
在阐述如何AWS Kinesis的Javascript交互方法前,我们有必要对Kinesis Stream当中的关键概念——“分片”和“数据记录”作初步的了解。
分 片
分片Share是流中数据记录的唯一标识组。一个流由一个或多个分片组成,每个分片提供一个固定的容量单位。流的总容量是其分片容量的总和。每个分片对应提供1 MB/S的写入容量和2 MB/S的读取容量。需要注意的是,每个分片可支持最多1000条记录/S的写入,和5个事务/S的读取。用户需要根据上述的容量和数目的限制,为流添加足够多的分片数目,以满足自身需求。
数据记录
数据记录是存储在Amazon Kinesis Stream中的数据单位。数据记录由序列号、分区键和数据Blob组成。
每个数据记录都有一个唯一的序列号。当应用程序对Amazon Kinesis Stream进行写入记录时,Streams将自动为其分配序列号。同一分区键的序列号通常会随时间变化增加;写入请求之间的时间段越长,序列号则越大。但需要注意的是,序列号不能用作相同流中的数据集的索引。用户如果需要在逻辑上分隔数据集,请使用分区键或为每个数据集创建单独的流。
分区键Partition Key用于按分片对流中的数据进行分组。Streams服务使用与每条数据记录关联的分区键将属于流的数据记录分为多个分片,以便确定给定的数据记录所属的分片。分区键是最大长度限制为256个字节的Unicode字符串。MD5哈希函数用于将分区键映射到128位整数值并将关联的数据记录映射到分片。分区键由将数据放入流的应用程序指定。
Blob是不可变的字节序列,也就是用户添加到Kinesis Stream中真正存储的数据。Streams不以任何方式检查、解释或更改Blob中的数据。数据Blob可以是任何类型的数据,例如可以为日志文件的一个分段、地理位置数据、网页点击流数据等等。一个Blob数据最多为1 MB。
关于Amazon Kinesis Streams更详细概念信息,请查看以下AWS官方文档:http://docs.aws.amazon.com/zh_cn/kinesis/latest/dev/service-sizes-and-limits.html。

 三.  安全性问题
要对AWS Kinesis发送或接收消息,我们需要在客户端中设置安全证书,才能与Kinesis进行交互。用户可以选择在客户端中使用固定的IAM证书或者临时证书,但如果您选择使用固定的IAM证书,请注意当中涉及到的重大安全性问题!客户能够轻易地从前端页面获取IAM用户的AWS Access Key ID和AWS Secret Access Key,而且固定的IAM证书长期有效,如果大部分用户共用同一个IAM证书,极容易发生恶意攻击的情况。因此,尽管技术上可行,但我们不建议用户使用固定的IAM证书,强烈建议用户使用临时证书!用户能够给临时证书设定较短的有效期,而且每次申请所获得临时证书都是独一无二的。用户能够在其自身的恶意攻击检测中直接让攻击源的临时证书失效,而不影响其他客户的正常使用。
在本文档中,我们将会介绍使用TVM服务器获取临时证书以及使用AWS的托管服务Cognito获取临时证书两种方法。但无论使用TVM还是Cognito,共同的目的都是获取临时证书的accessKeyId、secretAccessKey、sessionToken三个参数。因此获取临时证书是本文相对独立的一部分,我们会在第八部分和第九部分分别进行介绍。而在第七部分,我们假设前端已经获取上述临时证书三个参数的情况下,对Kinesis的Javascript交互方法进行讲述。

 四.  准备资源文件
要使用Javascript访问AWS Kinesis,需要准备AWS的Javascript开发工具包。AWS的Javascript开发工具包可从AWS官网上下载,或在前端页面的head部分直接引用该js包。在本篇文章撰写时,最新js包的地址为https://sdk.amazonaws.com/js/aws-sdk-2.4.13.min.js。您可以关注该工具包的github项目地址(https://github.com/aws/aws-sdk-js),随时获取最新的开发工具包。

 五.  准备AWS账户及创建AWS Kinesis Stream
要使用Javascript与AWS Kinesis进行交互,我们需要在云端创建一个可用的AWS Kinesis Stream。如今,包括中国北京在内的AWS Region都支持使用Kinesis服务,因此,用户创建AWS中国区账户或AWS标准账户都能够使用AWS Kinesis服务。
进入AWS账户后,我们需要在AWS Kinesis服务中创建流。具体的创建方法为:1. 登陆AWS账户终端界面,点击Kinesis操作模块https://console.aws.amazon.com/kinesis。2. 在操作模块中点击“创建流”。自定义流名称后,分区数量我们填写最低配置1,然后点击“创建”按钮即可。(为了节省成本,我们这里只为流添加一个分片。用户可以根据自己的实际需要设定分片的数量。)

 六.  权限设置
要对AWS Kinesis Stream生产和消费数据,我们需要为临时证书添加相应的权限。一般情况下,我们建议用户为临时证书提供最低的AWS Kinesis使用权限。对资源的严格限制,是我们AWS一直推崇的做法。生产者和消费者的最低权限设置分别如下所示:生产者Producer的最低权限设置:
{    "Version": "2012-10-17",    "Statement": [        {            "Effect": "Allow",            "Action": [                "kinesis:DescribeStream",                "kinesis:PutRecord",                "kinesis:PutRecords"            ],            "Resource": [                "arn:aws-cn:kinesis:xxxxxxxxxx:xxxxxxxxxxxx:stream/Vincent_danmu_BG"            ]        }    ]}
消费者Consumer的最低权限设置:
{    "Version": "2012-10-17",    "Statement": [        {            "Effect": "Allow",            "Action": [                "kinesis:DescribeStream",                "kinesis:GetShardIterator",                "kinesis:GetRecords"            ],            "Resource": [                "arn:aws-cn:kinesis:xxxxxxxxxx:xxxxxxxxxxxx:stream/Vincent_danmu_BG"            ]        }    ]}
另外,如果您使用Amazon Kinesis Client Library(KCL) 开发应用程序,您的策略必须包含对Amazon DynamoDB和Amazon CloudWatch的权限。因为KCL需要使用DynamoDB跟踪应用程序的状态信息,并使用CloudWatch代表您将KCL指标发送到CloudWatch。如果用户并非使用KCL开发应用程序,包括本次的Kinesis与Javascript交互演示,无需使用DynamoDB和CloudWatch资源,在此仅作提示。在KCL的场景下需要增加的权限如下所示:
        {            "Effect": "Allow",            "Action": [                "dynamodb:CreateTable",                "dynamodb:DeleteItem",                "dynamodb:DescribeTable",                "dynamodb:GetItem",                "dynamodb:PutItem",                "dynamodb:Scan",                "dynamodb:UpdateItem"            ],            "Resource": [                "arn:aws-cn:dynamodb:xxxxxxxxxx:xxxxxxxxxxxx:table/amazon-kinesis-learning"            ]        },        {            "Effect": "Allow",            "Action": [                "cloudwatch:PutMetricData"            ],            "Resource": [                "*"            ]        }
需要注意的是,上述红色标注的地方为本人所使用的AWS Kinesis Stream和DynamoDB表格的ARN资源名称(Stream对应的名称为Vincent_danmu_BG,DynamoDB table对应的名称为amazon-kinesis-learning),用户需要把它替换成自己个人所对应的ARN资源。关于如何寻找各AWS服务中对应的资源名称,请参考AWS官方网站说明。另外需要注意的是,如果ARN资源在中国区内,一般需要以“arn:aws-cn:”开头标注资源;如果ARN资源在中国区外的标准AWS区域,则只需要使用一般的“arn:aws:”开头标注资源。
更多关于配置AWS Kinesis的权限问题,请参考AWS官方文档:http://docs.aws.amazon.com/streams/latest/dev/learning-kinesis-module-one-iam.html。
文档当中详细叙述了在AWS Console的IAM模块中如何创建User和Policy,为初学者提供很好的帮助。

剩余步骤,请见次条微信。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存