Author: AWS Team


现代IT高管已然化身首席变革管理官

“成功源自奉献。在前进道路中,我们所处、所行也许并不如意,但惟有远见及坚韧的意愿方可引导我们抵达终点。”——亚瑟小子

随着越来越多企业开始认真审视云方案,如今的IT领导者们也迎来了新的转型机遇,即同时立足于技术与业务层面推动企业发展。

至少如今的IT高管们需要支持企业的云技术探索之旅。高管支持正是我在之前文章中提到的七大最佳实践中的第一项,其它六项则分别为员工培训、建立实验文化、引入合作伙伴、建立卓越中心、实现混合型架构以及推行云优先策略。

结合实际经验,我发现IT高管们在企业探索云技术时往往关注三大主要领域。在今天的文章中,我们将共同了解这些领域及其相关细节。在下周召开的re:Invent大会高管峰会上,我还将就此议题组织对话,感兴趣的朋友不妨加入我们!

需要强调的是,云探索之旅是一个迭代过程,而且需要投入大量时间。我们不仅需要转变企业的技术储备,更需要调整IT部门交付技术方案及实现业务价值的具体方式。云方案带来的技术转变与新的业务模式将帮助我们转变职能定位、财务分配、产品开发方法以及更多涵盖整个业务组织结构的元素。这同时也是IT高管们千载难逢的职业发展机遇,大家将最终决定业务改进效果以及企业在财务与竞争力之间的平衡关系。这意味着大家需要审视各类机制是否切实可行,同时建立最符合业务需求的环境。

在我看来,当下的IT高管们其实需要扮演首席变革管理官(简称CCMO)角色。技术已经不再作为业务的简单支持要素,我们需要了解技术的本质意义并根据持续升温的竞争形势与持续转变的技术方向管理企业内部的种种变革。立足于各行各业,CCMO都将需要领导并掌控发生在高管团队内部乃至其它领域的变化,同时果断执行管理工作。

要成为一名成功的CCMO,我认为以下三项职责最为重要:

合并业务与技术。云部署绝不只是技术转换那么简单,其同时亦带来了新的业务实现方式。每一位高管成员都应当对此保持高度关注,同时了解每项具体功能会给整个云探索旅程带来怎样的影响。其中既包含明确的积极成果(财务、敏捷性以及全球扩展能力等等),亦会带来一系列挑战(人员招聘、培训以及对未知的恐惧等)。为了切实建立起能够满足每一位高管需求的、不断变化的IT环境,我们首先需要深入理解这些目标与挑战,而后思考如何简化目标实现流程并应对其间可能出现的种种挑战。

提供明确的目标。考虑到将技术与业务相结合的重要意义,大家也应当调整团队角色定位以帮助他们了解自己最适合的施展平台——特别是在推动业务发展方面。在我个人的早期高管从业经历中,我曾经天真地认为只要发出明确的指令,大家就能严格遵循其中的要求。残酷的事实告诉我,只有不断重复传达内容,员工们才能够准确依从并坚持贯彻。总结来讲,云技术为员工带来了大量新的发展机遇,而且只要他们乐于学习,那么将有无数新的业务贡献方式供他们选择。

制定(打破)新规则。 大部分传统IT运营模式并不允许大家充分发挥云技术所能带来的全部潜力。面对Uber、AirBnB、DropBox以及其它众多创新型企业不断创造新技术及实现快速运营的时代背景,大家必须致力于制定新规则以保证自身企业不致被时代所淘汰。而这项工作则能且只能由IT高管人士完成。另外,必须立足于企业结构的各个层面防止一切违规状况。

在未来几周当中,我将进一步就这三点内容展开探讨。如果大家在这方面拥有心得及体会,也不吝加以分享!

革命尚未成功,同志仍须努力!

作者介绍

史蒂芬﹒奥本

史蒂芬·奥本 (Stephen Orban) 于 2014 年9月加入亚马逊AWS 担任企业战略总经理。奥本与多名企业技术高管合作,在云如何实现业务成果、加快创新和简化流程方面进行经验和战略分享。在加入亚马逊AWS 之前,奥本曾在道琼斯担任首席信息官 (CIO)一职,他通过借力 AWS 和其他软件即服务 (SaaS) 合作伙伴,引入现代软件开发方法、实现降低成本、执行云优先政策。这些转型变革加快了产品开发周期并提高了全部业务线的生产能力,这其中就包括《华尔街日 报》、MarketWatch.com、道琼斯通讯社及Factiva。奥本还曾在彭博有限合伙公司(Bloomberg LP)工作 11 年,并且在股权和消息平台担任不同的领导职务;2008 年,奥本创建彭博体育(Bloomberg Sports)并担任首席技术官 (CTO)。

助你决胜云时代的人才其实近在眼前

“教育是最有力的武器,你可以利用其改变世界。”——纳尔逊·曼德拉

能够有机会与高管同行们就业务及IT发展战略开展合作,我一直感到非常幸运。每个行政机构及商业企业都面临着独特的挑战,但他们亦配备有出色的工作人员及技能储备来解决这些问题,从而帮助组织整体向未来的愿景推进。同样的道理当然也适用于云计算。而且几位高管人员在交流中向我反复强调,缺少云技能人才正是他们很难开展云技术探索之旅的主要原因。

在此前的文章中我曾经提到过七条云转型最佳实践,而员工培训正是其中的第二项重点。员工培训能够把抱有怀疑态度的成员转化为真正的新技术支持者,他们也将贡献自己的力量确保云计算的强大优势切实为我们的企业带来巨大收益。

我们需要的其实就在眼前

人们对未知感到恐惧,而变化则让人感到焦虑。而教育正是我们手中最强大的武器,足以帮助员工克服恐惧情绪。另外,大家也可以通过吸引人才解决部分紧急问题,但这种方式往往很难形成规模。

大多数企业已经拥有非常丰富的组织文化、知识储备与思维传统。利用这些积淀,各企业完全可以立足于自身情况帮助员工灵活地学习云技术以及部署途径。换句话说,每个人都需要承认云技术的客观存在,并以此为基础接受及提升自身水平。

在这里,我建议各位高管人士通过以下几项要点帮助员工尽快掌握云技术。从原则上讲,我一般不会在文章中提到具体的AWS服务或者解决方案,但这里提供确切选项显然有助于大家更好地理解这一思路。我相信大家也能找到更多可行方案,希望各位不吝分享您的心得与体会!

AWS培训与认证

AWS的自我指导与教师指导型培训课程能够帮助大家的团队快速上手,并随着时间推移不断紧跟技术发展节奏。在这里我就不赘述课程的具体内容了,但可以肯定的是,我所接触的每家采用该指导课程的企业都得以更好地利用云服务。另外,大多数原本存在摩擦与冲突的团队都在接受培训后顺利解决了问题。

在道琼斯公司工作时,我们对团队内的几乎每一位技术人员进行培训,并引导他们接受AWS技术基础课程。随着时间推移,越来越多的员工也开始意识到这项课程的重要意义。

我们最终将训练工作形成制度。我们的DevOps团队开始组织“DevOps日”活动,企业中的其他员工则可以在这里了解最佳实践、框架以及治理模式等我们以云为基础开发出的解决方案。

这种基础型教育能够为员工的日常工作方式带来极具现实意义的影响,同时帮助我们巩固起以云计算作为未来发展基础的文化背景。另外,培训工作也让我们顺利克服了过渡过程中出现的种种障碍。举例来说,参与了DevOps日活动的员工很难在工作当中将云方案彻底抛诸脑后。不仅是我们,其它众多大型企业也采取了类似的实现道路——他们亦在利用AWS培训与认证机制帮助团队建立及扩展适合自身需求的培训项目。

如果大家发现员工对此存在抵触情绪,不妨与他们分享来自indeed.com网站的技能与职位统计结果。

云技能与职位数量呈现出明确的正比关系,而且短时间内这种趋势毫无消失的迹象。因此几乎可以肯定地说,云培训将在未来多年当中为企业自身及员工带来显著收益。

利用生态系统

尽管作为企业云技术探索之旅的领导者,大家并不一定需要独力完成所有工作,特别是在员工教育方面。与同业人员进行交流,参与云技术相关会议,同时积极了解其它企业的实践方案。云技术生态系统的增长速度极为惊人,亦有众多自诞生起就利用云技术支撑企业的初创企业存在。我们可以通过网络获取到大量可资借鉴的宝贵信息,而这些也将成为大家自身企业顺利发展的有力指导。

AWS合作伙伴网络正是浏览生态系统的途径之一,其中亦包含大量值得学习的资源。无论大家是希望找到一款工具以解决特定需求,还是希望物色合作伙伴以完成大规模迁移,这里都能够提供丰富的可行选项。大家也可以联系自己的AWS客户经理,由他们推荐理想的可选方案。我将在接下来的系列文章中就此加以探讨。

最后但同样重要的是,AWS专家服务已经帮助成百上千位高管人士准确了解到执行云战略所必需的角色及技能。AWS专家服务团队会评估企业的现有准备情况,并帮助其获取最为急需的AWS使用经验,而且其实际效果已经得到数百家同类企业的验证。通过这些推进举措,AWS专家服务建立起AWS云实施框架,任何企业皆可免费使用并作为将自身组织向云运营模式转移的参考资源。

经验的作用不可替代

我还没见过任何一家企业能够在不必借助任何帮助的前提下搞定云迁移所需要的人才与技能需求。虽然大多数管理人员都能够凭借设想解决不少实际问题,但缺少实践经验将使大家的推进道路举步维艰。

培训当然是帮助员工掌握新概念并了解相关实例的理想方式,但我仍然认为经验才是最好的老师。因此,大家应当确保团队有机会亲自上手并通过时间磨练自己的业务与云技术结合技能。我们可以要求员工们建立一个网站,面向部分数据构建API,托管一套维基页面或者建立其它一些能够与当前业务相契合的项目。实践活动往往能让团队快速成长。需求乃创新之母,我也亲眼见证了众多团队在目标明确且工具到位的情况下仅利用极短时间就拿出了惊人的成果。

这些实践经验最终也将转化为足以改变游戏规则的创新方案,或者构成可资借鉴的未来培训素材。无论如何,实践活动都将帮助大家顺利推进议程,同时帮助团队在学习中快速成长。

革命尚未成功,同志仍须努力!

作者介绍

史蒂芬﹒奥本

史蒂芬·奥本 (Stephen Orban) 于 2014 年9月加入亚马逊AWS 担任企业战略总经理。奥本与多名企业技术高管合作,在云如何实现业务成果、加快创新和简化流程方面进行经验和战略分享。在加入亚马逊AWS 之前,奥本曾在道琼斯担任首席信息官 (CIO)一职,他通过借力 AWS 和其他软件即服务 (SaaS) 合作伙伴,引入现代软件开发方法、实现降低成本、执行云优先政策。这些转型变革加快了产品开发周期并提高了全部业务线的生产能力,这其中就包括《华尔街日 报》、MarketWatch.com、道琼斯通讯社及Factiva。奥本还曾在彭博有限合伙公司(Bloomberg LP)工作 11 年,并且在股权和消息平台担任不同的领导职务;2008 年,奥本创建彭博体育(Bloomberg Sports)并担任首席技术官 (CTO)。

手把手教你如何用Lambda + Alexa调用echo设备

知识补充:

什么是AWS Lambda?

AWS Lambda在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录,只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求,其提供了AWS基础设施的高可用性,高安全性,高功能性和高可扩展性。

具体可参考:

https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html

什么是Alexa Skills Kit?

Alexa是Echo内置的语音助手,通过它能够唤醒Echo。Alexa的优点在于,它基于云端,因此我们可以随时对其进行改进。Alexa Skills Kit (ASK)是一个由自服务API、工具、文件和实例代码的集合,可轻松构建你自定义的Alexa skills,然后发布。

具体可参考:

https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit

1. 打开链接https://aws.amazon.com/,申请亚马逊AWS账号。登录控制台,选择AWS Lambda服务,创建Lambda Function。

2. 选择Alexa Skills Kit

3. 下载需要用到的代码,解压,打开index.js文件,修改文件中的开发者账号ID,如下:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/RecipeTemplate.zip

修改完成之后,然后打成Zip包上传(注意,这里的打包不需要文件夹,直接把.js文件打包成RecipeTemplate.zip)

接着点击“Create function”

到这里,Lambda 创建成功。

4. 进入https://developer.amazon.com/,创建Alexa Skills Kit。

选择ALEXA

5. 选择“Alexa Skills Kit”

6. 点击“Add a new Skill”

7. 填写Name: Solution Helper,Invocation Name: solution helper

8. 填写Intent Schema,样例代码下载:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/IntentSchema.json

9. 填写Sample Utterances,样例代码下载:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/SampleUtterances.txt

10. 点击“Save”后会报错,这个时候点击“Add Slot Type”添加。样例代码下载

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/LIST_OF_ITEMS

11. 然后再点击“保存”,这个时候看到Successfully updated the interaction model

12. 此时,点击“Next”,选择Lambda的ARN地址,例如:

arn:aws:lambda:us-east-1:556776719183:function:LambdaAlexaSkillsKit

复制Lambda ARN地址

13. 点击“Next”,即将进入到Test阶段,如下图所示。

14. 然后在Enter Utterance中输入“How can I build a map”,点击“Ask Minecraft Helper”,能看到Lambda Response的结果。

15.(选做)如果是测试用的话这步可以不进行。

接下去会上传两张图片,这两张图片是特定尺寸的,而且是必须要上传的,你可以自定义。或者用两张我已经做好的图片:

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/AWS+Logo+108.png

https://s3.cn-north-1.amazonaws.com.cn/bjsdemo/LambdaAlexaSkillsKit/AWS+Logo+512.png

16.(选做)如果是测试用的话这步可以不进行。

17. 使用Web版Alexa Skill Testing Tool进行测试 https://echosim.io/,注意,这里需要用之前的Amazon账号登录。用鼠标点击进行语音。

18. 当输入语音之后,打开Alexa的测试页面,点击Home,可以看到录音识别的效果。http://alexa.amazon.com/spa/index.html#cards

比如我语音输入:

Alexa, Ask solution helper how can build a map

Echo回答:

A map can be crafted by placing a compass in the middle square and eight pieces of paper surrounding it.


也可以进行自定义语音设置,比如我语音输入:

Alexa, Ask solution helper how can I get summit ticket

Echo回答:

Hello, if you want to attend beijing summit, please connect to aws china inside sales team.

19. 搞定,完成!

作者介绍:

毛郸榕

亚马逊AWS中国助理解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,毕业于北京航空航天大学云计算专业,硕士,毕业后直接加入亚马逊AWS中国。在大规模后台架构、企业混合IT和自动化运维等方面有着丰富的实践经验。目前在集中精力学习新一代无服务器架构设计。

基于AWS 平台跳板机配置

很多用户通过跳板机对部署在AWS平台的应用系统进行日常维护,为管理私有网络的服务器提供便利,最小化了应用系统的安全风险,从而有利于提升整体架构的安全。

为达到更好的安全性,需要进行恰当的规划,通常可以考虑以下几个问题:

  1. 跳板机应该放置在哪个子网?
  2. 如何安全访问跳板机?
  3. 跳板机如何安全访问受管理服务器?

以下是结合这些问题基于AWS部署linux跳板机相关步骤。

一.网络规划

对于vpc的规划通常需要划分为若干个子网,分为公有子网和私有子网。公有子网中的实例可以直接从 Internet 接收入站数据流,私有子网中的实例则不可。公有子网中的实例可以直接向 Internet 发送出站数据流,私有子网中的实例则不可。但是,私有子网中的实例可以使用位于公有子网中的网络地址转换 (NAT) 网关访问 Internet。

根据以上描述不同子网的特点,我们需要把跳板机放置在公有子网中,以便接受管理人员通过internet的访问,受管理的服务器根据其在业务系统中充当的角色选择放置在公有子网或私有子网。在实际生产环境中根据需要可为跳板机设置一个独立的公有子网 。

如下图所示的vpc规划中,为跳板机实例划分了一个专用的公有子网,管理员可以通过登录到跳板机对放置在私有子网的服务器的管理:

二.跳板机部署

请参考以下链接,在公有子网中部署一台linux EC2实例,并为跳板机EC2分配  EIP:

http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/EC2_GetStarted.html

在实际部署中考虑到跳板机所需的工作负载,可以部署配置较低的实例类型。此外,出于成本和安全考虑,您也可以在不进行运维操作的时候将跳板机状态设置为”停止”,在每次运维需要的时候再“开启”跳板机。

为跳板机实例配置安全组。在创建EC2的过程中,在安全组规则中添加SSH服务的安全规则,根据实际情况限定连接的源 IP地址。如下图所示,只接受特定的 管理终端连接:

配置受管理服务器的安全组。配置安全组规则仅接受来自跳板机所对应安全组的访问请求:

配置管理终端。在管理终端依次导入跳板机和受管理服务器的证书私钥,登录跳板机后私钥信息将转发到受管理服务器完成身份验证。以下是针对linux环境和windows环境的管理终端为例:

在linux管理终端下通过ssh从跳板机登录到受管理服务器:

步骤一:在linux管理终端上运行ssh-agent启动ssh-agent进程

步骤二:将跳板机和受管理服务器对应证书的私钥依次添加到管理终端,执行方式如下(例如,私钥文件名称为xxx.pem):

ssh-add  xxx.pem

步骤三:使用ssh -A 参数登录跳板机,-A 表示通过跳板机转发本地管理端保存的私钥信息,实现跳板机与受管理服务器之间的身份验证:

ssh  –A  ec2-user@跳板机公网 ip地址  ——(以下假定linux ssh用户名为ec2-user

步骤四:从跳板机直接通过受管理服务器的内网IP SSH登录服务器:

ssh  ec2-user@受管理服务器的内网ip地址

 在windows环境下通过Putty从跳板机登陆到受管理的服务器:

下载putty客户端,并且通过puttygen将私有证书生成ppk格式。

下载Putty环境下的SSH agent—-pageant

步骤一:将受管理服务器及跳板机所对应证书的私钥添加进pageant

启动pageant并右击图标,您可以先查看key list,如果受访问服务器所需私钥没有添加进key list里,则执行”Add Key”的操作。并将保存在本地的私钥添加进去。

步骤二:通过putty登陆跳板机

在这一步中,如图填写跳板机公有IP地址,并在左侧SSH-Auth目录下勾选“Allow agent forwarding” 来允许跳板机上的ssh客户端与管理终端本地的ssh-agent通信并使用管理终端本地的密钥完成与受管理服务器的ssh认证流程。下面以AWS 上的一台EC2为例登陆跳板机:

这里需要添加的私钥为跳板机所对应证书的私钥。

步骤三:从跳板机直接登录受管理的服务器

通过命令”ssh  ec2-user@受管理服务器内网ip地址”来实现对受管理服务器的访问,需要注意的是,在这里输入受管理服务器的私有IP地址实现对其的访问,提高了受管理服务器的安全性。

这样,您便实现了从跳板机上登陆受管理服务器的操作。

三.安全加固

在上面部署跳板机的过程中,跳板机所附件的安全组规则中开放了TCP 22端口,根据实际情况建议严格限制来源ip地址,只允许指定的IP地址访问。在这基础上,还可以对安全进行优化:

  • 当管理员需要登录跳板机通过AWS CLI在安全组添加规则打开tcp 22 端口;

完成管理任务后,退出ssh会话,AWS CLI将从安全组中关闭tcp 22端口;实现以上效果,可以执行以下脚本 ,请根据实际环境替换安全组id。

#!/bin/bash

aws ec2 authorize-security-group-ingress –group-id 安全组id –protocol tcp –port 22 –cidr 0.0.0.0/0 &

sleep 5

ssh -A  ec2-user@跳板机公网IP

aws ec2 revoke-security-group-ingress –group-id 安全组id –protocol tcp –port 22 –cidr 0.0.0.0/0

要成功运行以上脚本,需要配置 AWS CLI运行环境,具体请参考:

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

执行脚本登录前,将跳板机安全组中的ssh服务规则删除,即无法访问tcp 22端口:

执行脚本登录时,将执行脚本中的第一条语句,通过AWS CLI添加了ssh服务相关规则,然后ssh成功登录到跳板机:

在跳板机上完成管理任务后exit结束ssh会话,AWS CLI删除安全组ssh服务规则,即无法访问tcp22端口:

下图显示,安全组规则相应被删除:

四.跨vpc管理服务器

跳板机是否可以管理不同vpc中的服务器呢?答案当然是可以的。如下图所示,需要在vpc之间建立peering连通两个vpc,跳板机即可实现跨vpc安全管理应用服务器。

建立vpc peering的过程如下,也可以参考以下链接获取更详细的信息:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-peering.html

 

步骤一:新建Peering Connection

进入console里面VPC下的”Peering Connections”页面,新建”VPC Peering Connection”。 在这里您需要提供跳板机以及受管理服务器所在VPC的ID,点击”Create VPC Peering Connection”。

步骤二: 配置路由表

创建成功之后,您可以看到peering 的相关信息,比如”status” ,”Local Vpc”以及”Peered Vpc”信息。同时您可以看到peering的状态为”pending-accept”,您需要点击上方的”Action”,并选择接受请求。

当您接受请求之后,您会收到创建新的路由表的通知,您需要点进页面进行路由表的配置。当为本地VPC 配置路由表信息时,您需要提供受访服务器所在VPC的CIDR作为跳板机路由表的Destination,新创建的peering  作为Target。

同理,在配置受访服务器所在VPC 的路由表信息时,您只需将本地 VPC 的CIDR作为Destination。

在配置完路由表信息后,您可以看到peering的状态变成了”active”,并且可以看到路由表的相关信息。

步骤三: 通过本地跳板机登陆受访服务器

这一步类似于前面提到的在同一VPC下从公有子网的跳板机访问私有子网的受管理服务器。您需要配置好您的安全组信息,在访问的时候,您需要在管理终端保存受管理服务器公钥所对应的私钥。然后在跳板机上执行ssh  ec2-user@受管理服务器内网ip地址

如下图:位于192.168.0.0/24网段的跳板机 直接ssh访问位于172.16.0.0/24网段的应用服务器

五.关于windows 环境下的跳板机配置

Windows Server的管理基于windows RDP协议实现,可以通过配置RDP 网关服务器管理位于私有子网的windows服务器,具体的规划及配置请参考以下白皮书:

https://aws.amazon.com/windows/resources/whitepapers/rdgateway

作者介绍:

李艺明

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构咨询和设计,在国内推广AWS云平台技术和各种解决方案。拥有超过10年的IT从业经验,为各种规模的企业客户提供IT项目实施和顾问服务。在加入AWS之前,服务于微软担任解决方案工程师,负责Windows Azure方案和架构设计,在此之前负责企业私有云和企业协同应用系统的架构规划和设计。

杨婉洁

亚马逊AWS解决方案架构师实习生,喜欢编程,熟悉Java、C++、JSP、HTML以及关系型数据库。曾在学校和企业参与数据分析项目,熟悉各类数据分析的算法。热爱大数据、云计算。

AWS Kinesis的Javascript交互方法

一.介绍

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,为初学者提供很好的帮助。

七.在Javascript中对AWS Kinesis的访问方法

经过上述的准备工作,我们在这部分中,将会对AWS Kinesis的Javascript交互方法的核心部分进行介绍。

基本参数配置

无论是推送消息到AWS Kinesis还是从AWS Kinesis接收消息,我们都需要在Javascript中传入基本参数配置信息,包括临时证书的accessKeyId、secretAccessKey、sessionToken以及Kinesis Stream所在的Region、Kinesis Stream名称、分区键等等。然后我们需要用这些基本参数配置信息初始化这个过程中最重要的操作对象AWS.Kinesis。为了方便起见,我们建议用户把这些公用配置操作写在同一个文件当中,代码如下。

// constants of AWS Kinesis

var accessKeyId = '';//在这里传入临时证书的accessKeyId

var secretAccessKey = '';//在这里传入临时证书的secretAccessKey

var sessionToken = ''; //在这里传入临时证书的sessionToken

var region = '';//在这里输入AWS Region

var stream_name = '';//在这里输入Kinesis的流名称

var partition_key = '';//请在这里输入分区键

//初始化kinesis对象

var kinesis = new AWS.Kinesis({accessKeyId: accessKeyId, secretAccessKey: secretAccessKey, sessionToken: sessionToken, region: region });

在这里需要注意的是,我们初始化AWS.Kinesis对象时只需要传入accessKeyId、secretAccessKey、sessionToken、region四个参数。stream_name和partition_key会在后续推送消息或接收消息调用相关函数的时候作为参数传入。

推送消息到AWS Kinesis

要向Kinesis中推送消息,我们需要调用aws-sdk-2.4.13.min.js中的putRecord方法。putRecord方法每次向Kinesis Stream中推送一条record,AWS同时也支持API putRecords方法,用于每次向Kinesis Stream中推送多条record,读者可自行查看AWS API文档尝试。作为一种良好的代码写作习惯,我们把这部分的功能封装在函数function putStream(text)中。具体代码如下所示:

//该方法用于推送单条信息到Kinesis

function putStream(text) {

  var write_simple_params = {

    Data: text,

    PartitionKey: partition_key,

    StreamName: stream_name

  };

  kinesis.putRecord(write_simple_params, function(err, data) {//推动单条消息到Kinesis并定义返回函数

    if (err){// an error occurred

      console.log(err, err.stack);

    }else{

      alert('成功发送消息!');

    }

  });

}

需要注意的是,调用putRecord方法时需要传入配置参数组(这里为write_simple_params)和设置好回调函数。参数组的组成包括Blob的内容Data、分区键PartitionKey、流名称StreamName。通过回调函数,我们能够检测是否成功地把数据发送到Kinesis,并根据该结果进行下一步的操作。开发人员可以通过err判断是否产生错误,并通过err.stack获取错误产生的原因。

从AWS Kinesis接收消息

相比于向Kinesis推送消息,从Kinesis接收消息的流程和步骤相对复杂一点点。首先我们需要用getShardIterator方法获取初始分片迭代器ShardIterator。然后用ShardIterator从Kinesis获取记录。在这个过程当中,为了确保更新得以持续,我们循环自调用该方法,以保证ShardIterator可用。同样地,我们把这部分的功能封装在函数function readStream()中。具体关键代码如下所示:

//在第一次getShardIterator中获取ShardIterator读取数据

 function readStream(){

    var shardIterator_params = {

      ShardId: 'shardId-000000000000',

      ShardIteratorType: 'LATEST',

      StreamName: stream_name,

    }

    kinesis.getShardIterator(shardIterator_params, function(err, data) {

        if (!err) {

            readStreamLoop(data.ShardIterator);//第一次成功获取ShardIterator后进入循环更新以不断获取新的ShardIterator

        }else{

            console.log(err, err.stack);

            alert("ShardIterator Error");

        }

    });

 }

需要注意的是,调用getShardIterator方法时需要传入配置参数组(这里为shardIterator_params)和设置好回调函数。配置参数组需要我们输入分片Id号ShardId、ShardIterator的排序类型ShardIteratorType和流名称StreamName三项。同样地,通过回调函数我们能够检查存在的错误,并根据结果进行下一步的操作。在回调函数中,如果没有出现错误,我们可以通过data.ShardIterator获取初始分片迭代器的Id,然后凭借该Id从Kinesis获取记录。获取记录的具体步骤我们封装在函数function readStreamLoop(shardIteratorId)当中,具体代码如下所示。

//不断重复地获取下一个ShardIterator从而达到实时获取数据的效果。但该循环会不断消耗CPU性能

 function readStreamLoop(shardIteratorId) {

    var self = this;

    var read_params = {

        ShardIterator: shardIteratorId,

        Limit: 10

    };

    kinesis.getRecords(read_params, function(err, data) {

        if (!err){

            if (data['Records'].length > 0) {

                for (var i in data['Records']) {

                    msg = data['Records'][i]['Data'].toString('utf8');

                }

            }

            self.readStreamLoop(data['NextShardIterator']);//获取下一个ShardIterator的Id后不断自调用

        }

    });

}

需要注意的是,由于AWS Kinesis在接收数据后并不会主动向应用程序推送数据,因此我们需要在客户端不断地发出请求以达到实时获取数据的目的。为了达到这个效果,我们在上述代码中通过self.readStreamLoop(data[‘NextShardIterator’])不断地自调用readStreamLoop(shardIteratorId)方法进行实现。当然,如果用户对获取数据的实时性要求不高,完全可以通过一些定时的方法(如setInterval())来实现同样的效果。无论如何,保持这段代码轻量级对于减少CPU的负荷是百利而无一害的。

调用getRecords方法时需要传入配置参数组(这里为read_params)和设置好回调函数。配置参数组需要我们输入分片迭代器Id号ShardIterator和一次读取的限制个数Limit。在回调函数中,如果没有出现错误,我们可以通过数组data[‘Records’]得到这次获取的所有记录。另外,我们能够通过data[‘NextShardIterator’]以获取下一个分片迭代器的Id,从而做到不断的持续更新。

更多AWS-SDK中关于Kinesis的API调用方法与实例,请参考以下AWS文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Kinesis.html

八.自建TVM服务器使用AWS STS服务获取临时证书

在上述第三部分的安全性问题中提到,把AWS Access Key ID和AWS Secret Access Key存放在html文件或js文件中会存在较大的安全问题,而且考虑到固定的AWS IAM安全证书的定期更新、防止黑客的窃取和攻击等问题,我们需要使用AWS 安全令牌服务Security Token Service(简称STS)颁发临时证书,通过限制这些临时安全证书的AWS服务访问权限和有效时间,从而解决上述存在的安全问题。

具体如何在AWS EC2上构建TVM服务器,请参阅亚马逊AWS官方博客中的《Token Vending Machine:移动应用客户端安全访问AWS服务的解决方案》一文。

在与自建TVM服务器交互以获取临时证书的过程中,您可以在TVM程序中加入自行维护的验证保护机制,例如要求用户提供在您所维护的验证机构中的验证信息。加入验证保护机制能够使用户有条件地获取临时证书,从而更好地保护您的资源。当然,个别的应用场景,例如对于临时访客,匿名地获取临时证书也是一种客户需求。

在这里,我们将重点讲述如何用Javascript获取证书,并把该证书缓存到cookies等操作。

Javascript从TVM服务器上获取临时证书

jquery的$.ajax()是一种与服务器交换数据的技术,它可以在不刷新整个页面的情况下向服务器发出请求并获取返回的数据。我们使用$.ajax()完成客户端向TVM服务器请求临时证书的操作,整个过程做到对用户透明。我们把这一部分封装在函数function getCertification()当中,代码如下所示:

//从TVM获取临时证书

function getCertification(){

    $.ajax({

        url:'getCertification.action',//默认在当前页地址发送请求

        type:'post',

        async: false,//使用同步请求

        data:"{}",//客户端发送到服务器端的数据

        dataType:'json',//预期服务器相应的数据类型

        success:function (data) {//成功返回的回调函数

            setCertificationFromCookies(data.accessKeyId, data.secretAccessKey, data.sessionToken, data.expiration);

        }

    });

}

需要注意的是,由于我们的请求页面恰好放置在TVM服务器中,所以我们只需要默认在当前页地址发送请求即可。对于TVM服务器和当前页面请求域名不相同的情况,则需要补全完整的url地址。除此之外,我们部署的TVM服务器返回的是json格式的证书数据,返回的数据格式为标准的json格式,如下所示:

{“accessKeyId”:”(20位长字符串)“,”secretAccessKey”:”(40位长字符串)“,”sessionToken”:”(712位长字符串)“,”expiration”:(从1970年1月1日到现在的毫秒数)}

因此,在$.ajax()成功返回的回调函数中,我们只需要用“data.关键字”就能够分别把上述四个证书属性提取出来。当这四个属性提取出来后,我们把它们分别作为函数function setCertificationFromCookies(accessKeyId, secretAccessKey, sessionToken, expiration)的四个参数,把它们保存到cookies当中。该函数具体代码如下所示:

//把证书写到Cookies当中

function setCertificationFromCookies(accessKeyId, secretAccessKey, sessionToken, expiration){

    var date = new Date(expiration);

    $.cookie('accessKeyId', accessKeyId, { expires: date, path: '/' });

    $.cookie('secretAccessKey', secretAccessKey, { expires: date, path: '/' });

    $.cookie('sessionToken', sessionToken, { expires: date, path: '/' });

    $.cookie('expiration', expiration, { expires: date, path: '/' });

}

可以看到,我们把证书的过期时间作为cookies的过期时间。

另外,我们在运行的过程中还需要检查该证书是否已经过期,具体代码如下:

//检查证书是否过期

function checkExpiration(){

    if($.cookie('expiration') == null || new Date() > new Date(parseInt($.cookie('expiration')))){

        return false;

    }else{

        return true;

    }

}

需要注意的是,由于临时证书的有效期限较短,因此建议在每次使用kinesis对象前,都需要把临时证书的expiration和当前的时间做对比,以防止临时证书的过期而导致的kinesis对象方法调用的失败。具体的代码如下:

//检查当前的Kinesis是否可用。原则上在每次使用Kinesis之前都应该检查一遍。为了加快相应速度,应该在页面加载的时候运行之以达到预加载证书的效果

function checkKinesis(){

    if(!checkExpiration()){

        getCertification();

        initKinesis();

    }else if(sessionToken == null){

        initKinesis();

    }

}

另外,为了减轻TVM服务器的负载,我们建议从TVM获取临时安全证书后,把临时安全证书保存在客户端当中,在有效期内重复使用。您可以选在Javascript变量或者cookies等方式进行保存。在上述说明中,我们使用cookies的方式对之进行保存。

九.使用AWS的托管服务Cognito获取临时证书

Amazon Cognito 是专为想要将用户管理和同步功能添加到其移动和 Web 应用程序的开发人员设计的。Cognito分为Federated Identities和User Pools两部分。Federated Identities能够让您创建一个用户身份认证服务,通过认证可以给客户颁发临时的、自定义权限的证书。而User Pools是一个可以安全存储用户资料属性的用户目录,您可以把包括登录和注册信息在内的用户信息保存在User Pools中统一管理。

类似于在自建TVM服务器中自行选择提供验证保护机制,Federated Identities允许用户提供认证和未认证两种方式,有差异地提供不同权限的临时证书。

在本节中,我们假设在某一个User Pool中保存了用户信息,并把该User Pool作为Identity的Authentication  provider。另外,我们在该Identity的Authenticated role中赋予上述第六部分的访问Kinesis的最低权限。这样从该Identity所获取到的临时证书就拥有访问Kinesis的权限。关于如何创建及配置identity pools和user pools,请参考AWS的官方文档(http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/what-is-amazon-cognito.html)和AWS的官方微博(https://aws.amazon.com/cn/blogs/aws/category/amazon-cognito/)。

另外,当我们使用Javascript向User Pool认证身份的时候,要正常调用该API,需要使用jsbn.js、jsbn2.js、sjcl.js、moment.min.js、aws-cognito-sdk.min.js、amazon-cognito-identity.min.js等第三方或AWS额外的js包,具体的js包依赖及下载地址请查看AWS官方文档 http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/setting-up-the-javascript-sdk.html

一切就绪后,我们就能够在前端通过User Pools认证身份获取用户的IdToken,然后用该IdToken向Identity Pools获取临时证书的accessKeyId、secretAccessKey、sessionToken。凭借该临时证书,我们就能够通过上述的第七部分访问Kinesis。具体从Cognito获取临时证书的javascript方法封装在下面的getAuthenticatedIdentity(username, password)方法当中:

//获取登录认证的临时证书

function getAuthenticatedIdentity(username, password){//传入参数为User Pools中的用户名和密码

    AWSCognito.config.region = 'us-west-2'; //所使用的Cognito服务的Region,这里假设为us-west-2

    var poolData = {

        UserPoolId : 'us-west-2_xxxxxxxxx',//填写User Pool的id

        ClientId : 'xxxxxxxxxxxxxxxxxxxxxxxxxx'//填写User Pool中对应App的client id

    };

    var userPool = new AWSCognito.CognitoIdentityServiceProvider.CognitoUserPool(poolData);

    var authenticationData = {

        Username : username,

        Password : password

    };

    var authenticationDetails = new AWSCognito.CognitoIdentityServiceProvider.AuthenticationDetails(authenticationData);

    var userData = {

        Username : username,

        Pool : userPool

    };

    var cognitoUser = new AWSCognito.CognitoIdentityServiceProvider.CognitoUser(userData);

    cognitoUser.authenticateUser(authenticationDetails, {

        onSuccess: function (result) {

            // Set the region where your identity pool exists

            AWS.config.region = 'us-west-2'; //所使用的Cognito服务的Region,这里假设为us-west-2

            // Configure the credentials provider to use your identity pool

            AWS.config.credentials = new AWS.CognitoIdentityCredentials({

                IdentityPoolId: 'us-west-2:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', //填写Identity Pool的id

                Logins: {

                    'cognito-idp.us-west-2.amazonaws.com/us-west-2_r12hRvjCr': result.getIdToken().getJwtToken()

                }

            });

            // Make the call to obtain credentials

            AWS.config.credentials.get(function(){

                // Credentials will be available when this function is called.

                accessKeyId = AWS.config.credentials.accessKeyId;

                secretAccessKey = AWS.config.credentials.secretAccessKey;

                sessionToken = AWS.config.credentials.sessionToken;

            });

        },

        onFailure: function(err) {

            alert(err);

        }

    });

}

需要注意的是,我们需要从前端把客户的用户名和密码传入到该js方法当中。cognitoUser根据该用户名、密码等参数从User Pool获取该客户的IdToken。特别地,该IdToken的有效期为一小时。当IdToken失效后,用户可通过RefreshToken获取新的IdToken。用户可以在创建User Pool的app的时候自定义RefreshToken的有效期(1~3600天,默认30天)。另外,从Identity Pool获取的临时证书有效期为一小时。同样地,用户可以通过Javascript变量或者cookies等方式保存临时证书,以达到复用的效果。

另外,在上述的红色代码中,我们特别需要注意是Provider Name的格式为:cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>,而Value值为User Pool ID。具体如何把Identity Pool和User Pool集成使用,可参考AWS的官方文档 http://docs.aws.amazon.com/zh_cn/cognito/latest/developerguide/amazon-cognito-integrating-user-pools-with-identity-pools.html

十.总结

AWS Kinesis服务能够在短时间内实现弹性扩展,帮助您实时处理大规模的流数据。而且Kinesis服务还极其灵活,能够从任何可以调用Web服务的地方收集数据。本文介绍了如何通过Javascript对Kinesis进行交互,除此之外,用户还能够通过AWS所提供的丰富的开发工具包实现兼容各种语言和平台的Kinesis交互客户端,使用户能够从多个渠道收集数据。

既然一切都准备就绪,那就出发吧,详细AWS Kinesis服务会给你带来不一样的惊喜。Good Luck!

作者介绍:

邓明轩

亚 马逊AWS解决方案架构师;拥有15年IT 领域的工作经验,先后在IBM,RIM,Apple 等企业担任工程师、架构师等职位;目前就职于AWS,担任解决方案架构师一职。喜欢编程,喜欢各种编程语言,尤其喜欢Lisp。喜欢新技术,喜欢各种技术 挑战,目前在集中精力学习分布式计算环境下的机器学习算法。

邱越俊

亚马逊AWS解决方案架构师实习生,擅长Web开发,熟悉使用Java、Javascript、Html5、Mysql数据库,曾在多个互联网公司从事软件平台开发工作,对计算机网络架构、云平台的开发和部署有一定的经验。

 

算法改变世界 - 从Prisma 的走红说开去

假设你是一个摄影爱好者,估计最近这几天应该正忙着用一款热门的手机App去修图并晒到朋友圈里面。原因很简单,用这款软件提供的滤镜处理过的照片看起来更像是个艺术品,而不是那种常见的苍白的脸蛋和色彩失真的风景。这款爆红的程度可媲美Pokémon Go 的App的名字叫做Prisma。对于这个现象级的App,一个笑话是这样说的,“全球有一半的人正在用Pokémon GO抓皮卡丘玩,另一半的人则用Prisma在修图”。

6月24日,俄罗斯总理梅德韦杰夫在自己拥有230万粉丝的Instagram上传了一张莫斯科风景照,解说文字是“滤镜里的莫斯科”。这张照片使用了Prisma的其中一款滤镜,让整张照片呈现出浓郁的铅笔画效果,获得了超过7.8万个点赞。

Prisma 面世是在今年的6月11日,是由一个不足9人的名为Prisma Lab的俄罗斯团队在一个半月以内开发出来。一经面世就引起了轰动,在发布短短4天后就成了年轻人的新宠,10个国家的App Store榜首,两周内下载量超过160万。这个数字也创造了一个App下载的新的记录。

 

包括我在内的许多人喜欢这款应用的原因是因为它所提供的30多款滤镜完全不同于VSCO、Snapseed 以及Instagram 这些成名已久的的软件,经它处理过的图片看起来就像是我们熟悉的毕加索、梵高、爱德华.蒙克的作品,或者是强烈的线条、简洁概括夸张的造型,或者是用色阴暗的紫、绿色调的蚀刻风格,又或者是粗旷而狂野的印象派。总之,一幅色彩暗淡、构图不佳的照片一经处理就变成了大师范的艺术品。这样的软件如何不让像我这样的低级别的摄友痴狂呢。

 

如果仅仅是几个还算不错的滤镜也难逃昙花一现的结局,就如同曾经大热过许多款软件一样。但是如果你可以了解这些滤镜的来源,恐怕你会和我一样会大吃一惊了。不同与传统的设计出来的滤镜,Prisma 有自己一套独特的方法。当用户上传照片时,Prisma系统会使用基于神经网络的人工智能算法,获取著名绘画大师和主要流派的艺术风格,然后对你的照片进行智能化处理。也就是说,它所提供的每一个滤镜,都是模仿过去伟大艺术家的风格而对你的照片进行智能分析和重绘而产生的。

 

作为一个程序员,这个励志故事却有着不一样的味道。通常情况下,我们总是习惯于在我们熟悉的领域去捕捉灵感,并将这种灵光乍现的想法都过程序变成一个个具体的应用。但是如果你已经读过上面的故事,你应该也会与我一样蹦出来这样的一个想法,人工智能或许可以可以让我们跳出这样的思维的局限。让我们可以在跟更广阔的领域去发掘新的需求。

 

为了验证这个想法,我打算复制Prisma 核心算法的实现。当然,这种实现并不是你想像的那么高深莫测。在一篇名为“Neural networks with artistic talent” 的博客文章里面,我大致梳理出来了这个算法的脉络。早在2015年9月在ariV 上面就刊出了德国学者的一篇名为”A Neural Algorithm of Artistic Style“论文。在这片文章里面,了如何使用神经网络学习一副画的绘画风格,并把这种风格用于处理一幅照片使之具有了该种艺术风格。而这篇论文所提出的算法据说所就是Prisma 的核心。

看到这里我想许多人都会产生实现这个算法的冲动。且慢下手,因为有意境找到了一个更简洁的方法。斯坦福大学的Justin Johnson 已经在github 上面为我们提供了一个很好的框架,而基于这个项目的成果实现这个算法就变得轻而易举。

实现这个深度学习的算法需要具备一定的条件,重要的就是计算的性能。而目前解决这个问题的通常思路就是使用GPU来提高处理能力。对于普通程序员来说,我们通常并不具备这一类的资源。但解决问题的思路已经有人给出了。早在2014年2月Netflix 久通过他们的技术博客分享过一篇实现分布式神经网络的文章,文章的题目是“Distributed Neural Networks with GPUs in the AWS Cloud“。

于是我的尝试就从AWS 提供的云计算的环境 。我需要的仅仅是启动一个AWS EC2 的实例,EC2这个服务可以理解为一个托管的虚拟服务器。 Amazon EC2 提供多种经过优化,适用于不同使用案例的实例类型,而适合于深度计算的类型无疑就是G2这个 具有GPU 加速能力的实例。而AWS云计算的好处在这个时候尽显无余,我只需要在控制台上做简单的选择一个完整的计算环境就可以准备就绪。而这一切所需要的时间不过几分钟。

接下来的操作和设置就是照本宣科的过程,

1、安装Torch,这是一个基于Lua语言实现的深度学习的框架。今年年初击败李世石九段的Alpha Go就是基于这个框架

2、安装Load Caffe networks,将Caffe 这个框架加载到 Torch,需要注意的是这个框架依赖于protobuf

3、下载下载Neural Style的实现,这包括了训练好的神经网络模型VGG-19和它的改进型,VGG-19为缺省的设置

最后就是执行你的程序,验证一下你的的成果的时刻了。

也许你会认为Prisma 不过是一个好玩的App,不会真的对这个世界带来多大的影响。但是上面的小小的实验可以证明这一个结论,通过一个好的算法就可以让计算机通过学习以往的经验和积累而迅速成为这个领域的最顶级的专家。今天Prisma 可以让我们称为梵高,明天的一款智能应用也可以让我们我们具有贝多芬、李世石、莫言甚至是爱因斯坦、牛顿一样的能力。我相信这个日期不回很远。

我很喜欢那一本谈论算法的通俗读物《How Algorithms came to rule our world》》。在那本书的最后一段,作者克里斯托弗.斯坦纳有过这样一段描写,我想有这段话做为这篇短文的结尾。

“未来,会编写代码的人有许多事情可以做。如果你还能构思并构造出复杂精妙的算法,那就更好了- 你很有可能通知世界,如果没有机器人抢在你的前头的话。”

作者简介

费良宏

亚马逊AWS首席云计算技术顾问,拥有超过20年在IT行业以及软件开发领域的工作经验。在此之前他曾经任职于Microsoft、Apple等知名企业,任职架构师、技术顾问等职务,参与过多个大型软件项目的设计、开发与项目管理。目前专注于云计算以及互联网等技术领域,致力于帮助中国的开发者构建基于云计算的新一代的互联网应用。

 

 

我喜欢我的Amazon WorkSpaces

去年年初,我的同事 Steve Mueller 来到我的办公室,告诉我一项他认为我会感兴趣的内部试点计划。他解释说,他们正准备在 Amazon 上运行 Amazon WorkSpaces,并提出把我加入候选名单。我是一个喜欢生活在最前沿的人,自然接受了他的提议。

开始使用

此后不久,我开始在办公室的桌面上运行 WorkSpaces 客户端,那台电脑配置非常好,有两台显示器,内存充足。当时,我在工作日使用该桌面,出差或者在家办公时有一台单独的笔记本电脑。虽然我使用 Amazon WorkDocs 在两个环境之间共享文件,但切换环境时还是有些不顺畅。我得到了两组不同的浏览器标签、书签,诸如此类。无论我如何尝试,就是没有办法在各环境之间保持办公应用程序的同步。

在办公室使用 WorkSpaces 两周后,我意识到它的速度和响应能力与我的桌面相当。从此之后,我开始使用 WorkSpaces 作为我的主要工作环境,并慢慢脱离我曾经信赖的桌面。

我每周有两到三天在家办公。我家里的桌面配备了两个大屏幕显示器、大量内存、顶级的机械键盘,并运行 Ubuntu Linux。我在 Linux 系统上运行 VirtualBox 和 Windows 7。换句话说,我有一个快速且像素丰富的环境。

在我习惯了办公室的 WorkSpaces 之后,我在家里也安装了客户端并开始使用。这对我来说是向前迈进了一大步,瞬间开启了新的世界。现在,我能够使用快速而像素丰富的家用环境去访问我的工作环境。

此刻,您可能在想,客户端虚拟化和服务器虚拟化的组合一定很慢、有延迟,或者响应能力不如本地设备。但事实并非如此。我是一个非常苛刻的用户。我敲键盘速度飞快,我会同时打开大量窗口并频繁快速在窗口间切换,而且我绝对不能忍受被系统拖后腿。我的 WorkSpaces 速度快、响应能力强,让我拥有更高的工作效率。

移至零客户端

在我使用 WorkSpaces 几个月后,Steve 发消息跟我谈到了他的计划,他想要给试点计划的成员提供一些零客户端设备。我很喜欢他的想法,并同意参与。他和他的帮手 Michael Garza 帮我设置了 Dell 零客户端,并从 Steve 的办公桌下面搬来两台全新的显示器。此时,我的办公室桌面对我已经不再有用处了。我拔掉它的接线,向它的精诚服务表示敬意,然后把它送到复印室的硬件回收架。现在,我已经没有退路,只能完全依赖我的 WorkSpaces 和我的零客户端了。

零客户端是一个小巧而安静的设备。它没有风扇,也没有内部存储。它简单地连接至本地外围设备(显示器、键盘、鼠标、音箱和耳机)以及网络。它的发热量极小,并且与整套桌面相比可大量节能。

那时,我也经常需要到国内外各地出差。我开始在路上登录我的 WorkSpaces。这样做之后,我意识到我现在实现了一件非常酷的事,我拥有一个统一的工作环境,它可以横跨我的办公室、我的家庭和我的笔记本电脑。我有一套文件和一套应用程序,我可以从任意设备访问它们。现在我拥有一个便携式桌面,并且几乎可以从任何地点访问它。

我在使用远程 WorkSpaces 而不是本地计算能力的事实,很快就变得可以忽略不计。有一天早上,我用带有刺激性的标题给团队发了一封电子邮件说“我的 WorkSpaces 消失了!”他们看到邮件后先是很恐慌,然后很快就意识到我是在逗他们,我只是想告诉他们,我已经能够专注在工作上,并且不去在意我的 WorkSpaces了。我曾经给 WorkSpaces 团队报告过一些错误,但都不是严重问题,而且所有问题都很快得到解决。

笔记本电脑死机

去年年底的一个早上,我的笔记本电脑硬盘坏掉了,使这次过渡的现实意义变得更加显而易见。我把笔记本电脑送到我们的 IT 支持中心,他们为我换了硬盘。回到办公室后,我重新安装了 WorkSpaces 客户端就可以继续工作了。我没有安装其他应用程序,也没复制任何文件。当时,我笔记本电脑上仅有的个人数据是 WorkSpaces 的注册码和我的 Sticker!我确实仍在本地运行 PowerPoint,因为我们不能确定会议或公司演示会上的网络连接条件如何。

同时,我开始注意到其他一些使 WorkSpaces 与众不同并更加出色的优势。由于笔记本电脑的便携性和脆弱性,我们倾向于把笔记本电脑上存储的信息视为暂时性的。在潜意识中,我们知道有一天会发生不好的事,我们将失去笔记本电脑和其中的内容。移至 WorkSpaces 消除了这一担忧。我知道我的文件存储在云端,而且知道失去我的笔记本电脑并无大碍。

它总是可以正常工作

用我的同事 James Hamilton 的话来说,WorkSpaces 总是可以正常工作。它的外观、使用体验和行为表现与本地桌面无异。

我之前说过,我是一个苛刻的用户。我有两台大屏幕显示器,运行许多办公应用程序,并且会同时打开大量浏览器窗口和标签。直到现在,我仍会从事一些并不非常适合在虚拟桌面上运行的工作。举例来说:

图像编辑 – 我要为这个博客捕捉并编辑所有屏幕截图(感谢 Snagit)。

音频编辑 – 我使用 Audacity 编辑 AWS 播客。今年我计划使用新的音频输入支持在我的 WorkSpaces 上录制播客。

音乐 – 我安装了 Amazon Music 播放器并在写博文时收听喜爱的音乐。

视频 – 我会观看内部和外部的视频。

打印 – 我始终可访问公司网络上的打印机。当我在家时,我还可以访问家庭网络上的激光打印机和喷墨打印机。

由于 WorkSpaces在 Amazon 网络上运行,我在下载大文件时不受本地速度限制或带宽上限的影响。下面是一个具有代表性的速度测试(通过 Bandwidth Place 完成):

永恒感

去年年底,我们从试点 WorkSpaces 过渡到生产环境,目前正在为许多 AWS 团队成员配置 WorkSpaces。我的 WorkSpaces 现在就是我的便携式桌面。

在顺利使用 WorkSpaces 一年多之后,我不得不说的是,WorkSpaces 与本地环境的最大区别并不在于技术,而是在于它的感觉不同(且更好)。它给人一种强烈的永恒感,无论身在何处,我的 WorkSpaces 都是我的环境。在登录后,我的环境将始终与上次离开时相同。在下线一两周后再打开时,我不必像在笔记本电脑上那样等待同步电子邮件或安装补丁。

Now With Tagging

随着企业不断评估、采用和大量部署 WorkSpaces,他们询问我们是否具有针对成本分配目的而跟踪使用量的能力。在很多情况下,他们希望看到各个部门和/或项目正在使用哪些 WorkSpaces。目前,我们正在推出 WorkSpaces 对标签的支持。现在,WorkSpaces 管理员可以使用AWS Management ConsoleAWS Command Line Interface (CLI)WorkSpaces API 给每个 WorkSpaces 最多分配 10 个标签(键/值对)。加上标签后,可以在 AWS 成本分配报告中看到针对报告目的根据需要进行切片和分块的成本。

下面显示了 WorkSpaces 管理员如何使用控制台管理一个 WorkSpaces 的标签:

目前,在提供 WorkSpaces 的所有区域都可以使用标签:US East (Northern Virginia)、US West (Oregon)、Europe (Ireland)、Asia Pacific (Singapore)、Asia Pacific (Tokyo)和Asia Pacific (Sydney)。

了解更多信息

如果您对我的 WorkSpaces 经历感兴趣,并希望了解更多信息,下面的资源可以帮助您入门:

申请演示

如果您和您的组织可能从 Amazon WorkSpaces 受益并希望了解更多信息,请访问 workspaces-feedback@amazon.com 与我们的团队联系。

Jeff;

如何使用AWS 命令行分段上传大文件

1.S3上传文件介绍

使用亚马逊云的朋友经常需要上传文件到S3存储,亚马逊S3提供了在单个操作中上传文件和分段上传文件两种方式。使用单个操作上传,每次可以上传最大5GB的文件。如果使用分段上传来上传文件,可以 上传最大大小为5TB的文件。

2.分段上传的概念及其优势

分段上传允许将一个文件分割成多个分段 ,您可以按任意顺序上传这些文件分段。如果任意分段传输失败,可以重新传输该分段且不会影响其他分段。当对象的所有段都上传后,S3 可以使用这些分段创建对象。一般而言,如果您的文件大小达到了 100 MB,您应该考虑使用分段上传,而不是在单个操作中上传文件。

分段上传的优势主要有以下几点:

  • 提高吞吐量

如果需要上传的文件比较大,使用直接上传方式,效率很低。而使用亚马逊S3分段上传功能,通过并行上传分段以提高吞吐量,能充分利用当前的带宽,提高了上传效率。

  • 从网络问题中快速恢复

如果使用分段上传,某个分段失败了,你只需要重新上传这个分段,将上传文件时由于网络错误所产生的影响降至最低。

  •  突破S3单文件上传限制

当文件大于5GB,你只能将文件分片,然后分段上传。

3.S3分段上传的核心规范

S3分段上传的部分指标如下表所示:

4. S3分段上传的权限配置

使用S3分段上传需要适当的权限配置,相比于S3的单文件上传,S3在分段上传时需要部分额外的权限,最低的S3分段上传权限配置如下所示:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "s3:AbortMultipartUpload",

                "s3:GetObject",

                "s3:ListBucketMultipartUploads",

                "s3:ListMultipartUploadParts",

                "s3:PutObject"

            ],

            "Resource": [

                "*"

            ]

        }

    ]

}

具体AWS API分段上传的权限要求,请参考AWS官方文档:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuAndPermissions.html

5. 使用AWS CLI的自动分段上传

使用AWS的s3 cp命令和s3 sync等命令可以自动对要上传的大文件分片,然后上传。下面以一个视频文件myvideo.mp4为例,详细介绍如何使用s3 cp命令将文件分段上传到AWS 北京区域。

第一步:配置AWS 命令行(CLI)环境

使用命令行上传S3文件,首先要安装AWS CLI环境,AWS CLI是管理和访问AWS服务的工具,AWS CLI可以安装在Windows、OSX、Linux、Unix等多种环境上,关于如何安装CLI环境,也可以参考下面链接:

http://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-welcome.html

完成CLI的安装后,首先运行下面命令配置CLI环境:

[ec2-user@ip-192-10-x-xxx mnt]$ aws configure

命令输出内容如下:

AWS Access Key ID [********************]:

AWS Secret Access Key [********************]:

Default region name [None]:

Default output format [None]:

如上示例可以看到,运行aws configure后,需要输入下面四个参数:

AWS Access Key ID

要访问AWS的资源,需要配置用户认证信息。在AWS CLI中可以通过访问密钥来实现用户认证。本例通过访问密钥来实现认证,如果您还没有为用户生成访问密钥,可以在AWS console中,选择“用户”后,可以看到“Security Credentials”的选项,点击“Create Access Key”就可以为用户生成访问的Key ID和Access Key,你可以下载生成的Excel密钥文件,查看Access Key ID和Secret Access Key的值。另外,请确保您生成密钥的用户具有访问S3的相关权限。最低的S3分段上传权限配置在文档的前半部分已经介绍。

AWS Secret Access Key:

查看用户生成的密钥文件并输入Access Key的值。

Default region name:

默认区域名称。这是您希望默认对其进行调用的区域的名称。由于在本用例中我们需要调用北京区域的S3服务,因此请输入cn-north-1。

Default output format

默认输出格式,此格式可以是json、文本或表。如果不指定输出格式,将使用 json。这里我们使用默认的json选项。

第二步:运行复制命令

运行s3 cp命令如下:

[ec2-user@ip-192-10-x-xxx data]$ aws s3 cp myvideo.mp4 s3://multiple-upload-test/myvideo.mp4

上面我们使用cp命令将myvideo.mp4文件上传到北京区multiple-upload-test存储桶中,输出信息如下:

upload: ./myvideo.mp4 to s3://multiple-upload-test/myvideo.mp4

在命令运行过程中,你可以看到文件自动被分成多个片段然后分段上传到目标存储通,上传完成后,你就可以在目标存储桶中看到完整的文件。使用aws s3 sync也可以实现自动的分段上传。

6.使用AWS CLI的手工分段上传

在有些情况下,您可能希望手工分段上传文件到S3,下面还是以视频文件myvideo.mp4为例,介绍如何将大文件手工分段然后上传到AWS 北京区域。

第一步:配置AWS 命令行(CLI)环境

请参考上一节配置CLI环境,如果已经配置好环境,可以直接进入第二步。

第二步:将文件分割成多个分片

目前需要上传myvideo.mp4,使用ls命令查看要上传的文件,如下所示:

[ec2-user@ip-192-10-x-xxx data]$ ls -l

total 76272

-rwxrwxrwx 1 ec2-user ec2-user 78102279 Jun 24 06:51 myvideo.mp4

可以看到目前文件大概78M,使用split命令将文件分成40M大小的文件。

split -b 40m myvideo.mp4 myvideo-part-

split命令的参数说明如下:

1.   -b参数指定分割文件大小;

2.   myvideo-part-是指定生成分割文件的文件名前缀。

当运行完命令后,我们查看当前目录,即可发现生成的分割片段。

[ec2-user@ip-192-10-0-232 data]$ ls -l

total 152544

-rwxrwxrwx 1 ec2-user ec2-user 78102279 Jun 24 06:51 myvideo.mp4

-rw-rw-r-- 1 ec2-user ec2-user 41943040 Jun 24 06:57 myvideo-part-aa

-rw-rw-r-- 1 ec2-user ec2-user 36159239 Jun 24 06:57 myvideo-part-ab

可以看到split命令将myvideo.mp4分割成两个以myvideo-part-开头的分片文件。

第三步:初始化分段上传

使用AWS分段上传create-multipart-upload命令启动分段上传,运行下面命令:

aws s3api create-multipart-upload --bucket multiple-upload-test --key myvideo.mp4

其中:

bucket:要上传S3的bucket名称;

key:要上传文件的名称。

运行命令后返回信息如下:

{

    "Bucket": " multiple-upload-test",

    "UploadId": "_m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO",

    "Key": "myvideo.mp4"

}

看到返回具体的UploadId则说明初始化分段上传成功,后续我们需要使用UploadId来完成上传分段文件的各项操作,因此请妥善保管该UploadId。

启动分段上传后,可以使用list-multipart-uploads命令查看分段上传具体信息,示例如下:

aws s3api list-multipart-uploads --bucket multiple-upload-test

同样地,当中的bucket为要上传S3的bucket名称,与上述命令一致。

返回信息:

{

    "Uploads": [

        {

            "Initiator": {

                "DisplayName": "xxxxxxx",

                "ID": "arn:aws-cn:iam::xxxxxxxx:user/xxxxx"

            },

            "Initiated": "2016-06-24T07:17:28.000Z",

            "UploadId": "_m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO",

            "StorageClass": "STANDARD",

            "Key": "myvideo.mp4",

            "Owner": {

                "ID": "9ad8x098aa27467exxxf6f04d5eaxxx6e6e93d5067ba5bdd86dbb68ddb2511bd"

            }

        }

    ]

第四步:上传文件分片

首先上传第一个分片文件,命令如下:

aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 1 --body myvideo-part-aa --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

其中:

bucket:要上传S3的bucket名称;

key:要上传文件的名称。

part-number:当前上传分片文件的分段编号。(需要注意的是,上传分段时,除了指定上传 ID,还必须指定分段编号。您可以选择 1 和 10000 之间的任意分段编号。分段编号在您正在上传的数据元中唯一地识别分段及其位置。如果您使用之前上传的分段的同一分段编号上传新分段,则之前上传的分段将被覆盖。无论您何时上传分段,Amazon S3 都将在其响应中返回 ETag 标头。对于每个分段上传,您必须记录分段编号和 ETag 值。您需要在随后的请求中包括这些值以完成分段上传。这个参数很重要,当完成所有的分段上传后,S3将按照分段编号从小到大的顺序把分段拼接起来。)

body:当前上传分片文件的本地路径。

upload-id:初始化分段上传时系统返回的UploadId。

返回信息:

{

    "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\""

}

看到返回码ETag则说明上传成功。

同样地,我们继续上传第二个分片文件,命令如下:

aws s3api upload-part --bucket multiple-upload-test --key myvideo.mp4 --part-number 2 --body myvideo-part-ab --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

返回信息:

{

    "ETag": "\"03902e3af09f974cd406f988587d0814\""

}

上传分段文件后,可以使用list-parts命令查看上传信息:

aws s3api list-parts --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

返回信息如下:

{

    "Owner": {

        "ID": "9ad8c098aa27467ec9ef6f04d5ea97a6e6e93d5067ba5bdd86dbb68ddb2511bd"

    },

    "Initiator": {

        "DisplayName": "lanyong",

        "ID": "arn:aws-cn:iam::xxxxxxxxxx:user/xxxxxx"

    },

    "Parts": [

        {

            "LastModified": "2016-06-24T07:34:21.000Z",

            "PartNumber": 1,

            "ETag": "\"82eba7dcefdb5dd5bc72247c3f5543ca\"",

            "Size": 41943040

        },

        {

            "LastModified": "2016-06-24T07:39:16.000Z",

            "PartNumber": 2,

            "ETag": "\"03902e3af09f974cd406f988587d0814\"",

            "Size": 36159239

        }

    ],

    "StorageClass": "STANDARD"

}

在返回的信息中我们可以查看分段上传的所有者信息以及各分段的详细信息。在下述的完成文件组装中您需要用到各分段的ETag信息,您可以在本条命令的返回中获取。当然,在每次分段上传后也会返回ETag信息,您也可以把他们分别记录下来。

第五步:完成文件组装

所有分段都被上传后,S3需要具体分段信息来重新组装原始文件,需要的内容包括每次上传的分段序号及上传后返回的ETag。每个分段的文件序号和ETag可以从上个命令list-parts中获取。 获取的文件序号和ETag需要使用如下示例格式包装:

{

"Parts": [

        {

            "ETag": "82eba7dcefdb5dd5bc72247c3f5543ca",

            "PartNumber": 1

 

        },

        {

            "ETag": "03902e3af09f974cd406f988587d0814",

            "PartNumber": 2

        }

        ]

}

将上文本保存为文件,放于当前目录下。然后运行complete-multipart-upload命令完成文件的组装:

aws s3api complete-multipart-upload --multipart-upload file://mpustructs --bucket multiple-upload-test --key myvideo.mp4 --upload-id _m6b1l5DMGTl_a6rkmhrUxMaqlzzY6CICEVS4gEXlXv7PWHBIZTi90RrmNQclc6PRRnYzCaA6auA5pDaH4p13Bp8xyuCtwwLVl_xeU1yiX0KOQNhMzbE7_1AMA0WM7uO

 

当中的mpustructs为上述组装文件的文件名,用户可自定义。

返回信息:

{

    "ETag": "\"45f9fd2960aa026c44eec4618bc592a2-2\"",

    "Bucket": "multiple-upload-test",

    "Location": "https://s3.cn-north-1.amazonaws.com.cn/multiple-upload-test/myvideo.mp4",

    "Key": "myvideo.mp4"

}

完成分段上传后,Amazon S3 会按分段编号的升序顺序将各个段连接起来,从而创建对象。如果在开始分段上传请求中提供了任何数据元元数据,则 Amazon S3 会将该元数据与数据元相关联。成功完成请求后,分段将不再存在。

需要特别注意的是,启动分段上传并上传一个或多个分段之后,您必须完成或中止分段上传,才能停止收取上传的段的存储费用。只有在完成或中止分段上传之后,Amazon S3 才会释放段存储并停止向您收取段存储费用。具体的段存储费用,请参考AWS官方文档:http://aws.amazon.com/cn/s3/pricing/

为了防止用户上传分段后没有完成或中止分段所产生的不必要费用,作为最佳实践,AWS建议在分段上传操作中加入存储桶生命周期管理策略,在超过一定时间后,自动中止未完成的分段上传。具体存储桶生命周期策略的设置方法,请参考AWS官方文档:https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/mpuoverview.html#mpuploadpricing

第六步:检查您S3 bucket中的文件

上传完成后,请检查您的bucket,你就可以看到文件已成功上传并组装完成了。

7.总结

本文介绍了如何使用AWS CLI向S3分段上传大数据文件,以打破S3单文件上传的限制、提高网络吞吐量以及快速地从网络问题中得以恢复。除此之外,AWS还提供包括Java、PHP、.NET等丰富的开发工具包以实现S3分段上传大文件,用户可以根据自己的需要选择不同的接入渠道。既然一切都准备就绪,那就开始吧。相信S3分段上传将有效地解决用户的大文件上传问题,提供更好的用户体验。

作者简介

蓝勇

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在DR解决方案、数据仓库、RDS服务、企业应用、自动化运维等方面有着广泛的设计和实践经验。在加入AWS之前,在甲骨文中国担任资深售前工程师,负责售前方案咨询和架构设计,在数据库,中间件,大数据及企业应用方面有丰富经验。

为员工进行云培训时的11条箴言

Tell me and I forget. Teach me and I remember. Involve me and I learn.      – Benjamin Franklin

(告诉我,我会忘记;演示给我,我会记住;但让我参与其中,我才能真正学会。      – 本杰明﹒富兰克林)

作为一个CCMO,培训你的员工就能使他们加快你的上云历程吗?每个组织的培训历程都是独一无二的,但我发现在这方面做得很好的一些组织中,它们是有一些共性的。从这些共性中我们可总结出11条箴言:

1.从基础的但有意义的事情开始。当你的团队完成一些业务相关的重要事情时,他们将很快意识到云技术的实际好处。我见过很多公司的项目进展慢于预期,因为他们过于注重细枝末节。你肯定不想把全部身家赌在前几个项目上,你将会想从几个能很好阐明业务好处的项目开始做起。其实有很多适合刚开始着手进行的项目,例如一个简单的网站、一个移动应用、一个可以便捷访问数据的API或者一个文件备份及灾难恢复的改进。如果你的员工培训基于实际的应用,那你的团队将能够更快地把他们所学的东西应用于更多项目。

2.利用Amazon Web Services Training(AWS Training)。AWS可提供良好的培训计划。这些计划已经帮助了上千家公司增强它们的云技能。AWS将每一个培训视为一次提升的机会,并且开发了不同的课程和一系列交付机制以便客户能定制培训计划来满足他们的具体需求。当我在Dow Jones时,我们使用现在称为AWS Technical Fundamentals的课程来培训我们团队的几乎每一个技术人员。除了让我们的员工具备新的能力之外,这个培训也消除了员工对一些项目开始时的未知的恐惧。

3.给团队时间去尝试。构建一种探索文化是这段旅途中的下一个最佳实践,这在激励你的员工去学习时尤其重要。创新来源于尝试,因为云消除了尝试新事物时的前期投入,所以没有什么能够阻止你的团队创造你行业中的新产品。给你的团队足够的自由空间来以全新的方式实现已有的项目。

4.设置目标来鼓励学习和实践。大部分公司为员工设定目标或KPI并将此与员工绩效挂钩。使用这些现有机制来巩固你的策略,并形成以后的行为。你可以设定相关培训课程的完成目标,多少预算被释放,或者通过利用适当的云架构如何改善你的卓越运营。这样做表明,领导很注重让每个人都有机会尝试和学习。

5.设置时间限制,跟上步伐。当你向实验文化转变时这一点尤其重要。每天结束时,以结果为导向。你可以通过为每个项目设定最后期限帮助你的团队成员平衡试验和他们的现有知识。有时候你的团队会因为这些约束而做出一些折衷,随着项目的进行,你需要制定一个如何应对这些折衷的机制。但是你的团队会在将来的项目中不断学习并提高能力。

6.定位并处理变革阻力。所有这些因素都旨在通过给予你的员工成功所需的工具来抑制他们对变革的抵触。但是即使有这些机会,你的组织中也可能会有对此持续抵触的人。观察并理解来自你的团队的担忧,以开放的心态对待有效的和无效的,迅速处理不必要的摩擦。这也是我下一个要谈的。

7.别害怕给人新的角色。以有意义的方式迁移到云不仅是技术变革更是文化变革。我发现给人一个担当新角色的机会将帮助他们克服对变革的抵抗。我倾向于首先观察公司的内部,因为习以为常的知识是一种昂贵的且不必要的损失。在我在Bloomberg任职的11年间,我担任了6个不同且差异很大的角色。有数不清的机会是我在那里呆了那么久的原因之一。想方设法给员工新的机会将让他们保持参与并帮助留住员工。

8.向你的员工展示他们应该如何融入伟大的构想。当你知道你的工作是如何融入组织的大局时,会很容易激发你对工作的热情。确保你考虑到了每个角色并且沟通过他对你的团队有多大意义。再次强调,我期待看到你的组织如何权衡部门和/或个人目标与大局的关系,并设法为每个人量身定做。

9.深入行业活动,看看别人在做什么。大多数人从别人的成功和失败中学到很多。至今我已经为大公司开发基于云的策略有五年时间了,现在我也惊异于我参加AWS re:Invent、 AWS Summits或其他技术竞赛所学到的知识。给你员工时间来让他们组织并带着新的想法回去。设想许多的、甚至有一些你根本不会去实施的想法,这是创造有教育意义的时刻并强化你策略的好方法。

10.向你的搭档学习。AWS Partner Network中有数以万计的不同组织。他们中许多可能已经和你们是稳定的合作伙伴关系,但那可能也有值得你们学习的新的合作伙伴。我很惊异于看到很多大公司正转变成小的、年轻的、诞生于云的,像系统集成商Cloudreach2nd WatchMinjar,加速推进云策略并改变它们的IT文化。

11.在你的组织中制度化具有你特色的培训。当你推进云进程时,你会希望看到你的组织中的一些团队或个人想与他人分享他们所学到的。这将来自你卓越的云中心。我在Dow Jones时我们的DevOps团队定期举行DevOps日,在那里他们相互分享他们开发的云的实践、架构、管理模型等。跟我谈过的其他几家世界500强企业也已经建立了专门针对他们组织的类似的计划。

 

作者介绍

史蒂芬﹒奥本

史蒂芬·奥本 (Stephen Orban) 于 2014 年9月加入亚马逊AWS 担任企业战略总经理。奥本与多名企业技术高管合作,在云如何实现业务成果、加快创新和简化流程方面进行经验和战略分享。在加入亚马逊AWS 之前,奥本曾在道琼斯担任首席信息官 (CIO)一职,他通过借力 AWS 和其他软件即服务 (SaaS) 合作伙伴,引入现代软件开发方法、实现降低成本、执行云优先政策。这些转型变革加快了产品开发周期并提高了全部业务线的生产能力,这其中就包括《华尔街日报》、MarketWatch.com、道琼斯通讯社及Factiva。奥本还曾在彭博有限合伙公司(Bloomberg LP)工作 11 年,并且在股权和消息平台担任不同的领导职务;2008 年,奥本创建彭博体育(Bloomberg Sports)并担任首席技术官 (CTO)。

协同合作伙伴 合力加速上云战略

“You can do what I cannot do. I can do what you cannot do. Together we can do great things.” -Mother Teresa

(你能做我所不及的,我能做你所不及的。双方合力,我们可以做些伟大的事情。– 修女特蕾莎)

不同的组织采取不同的方法与第三方进行专业技术合作。有些组织偏向于构建自己的技术;而另一些则将部分或全部研发工作外包,并将他们的技术运营交给第三方。不论你的组织处于什么位置,几乎可以肯定的是你与少数硬件、工具及云服务提供商合作开发针对内部和外部客户的产品和服务。

我已经与数百名在过去几年中不断发展其组织技术战略的高管交谈过,许多人开始重新审视自己的合作方式,因为他们开始了解云计算如何能够帮助他们改变自己的业务。这篇文章探讨了一些我观察到的云技术是如何改变整个技术圈的以及关于吸引合作伙伴的话题。

关注快速增长的生态系统

云生态系统的快速增长不断的令我感到惊讶。最近四年我参加了AWS re:Invent,每次我都对比前一年更大的合作伙伴规模感到惊讶。从全局来看,从2012年到2015年,合作伙伴的展位数量增长了一倍多,全部走完去了解最新的工具和技术从原来需要一个小时增长到了一天时间。没有更好的领域更适合风投来投资这一市场了。

貌似在这种快速增长的生态系统中寻找适合你的合作伙伴很难,但有多个供应商争夺你的业务对你也会是有利的。你的AWS客户经理和我们的AWS合作伙伴目录可以帮助你缩小选择范围,AWS Marketplace能够帮助你在几秒内从广泛的供应商和类别中发现并部署解决方案。

改变你的文化

现如今看到大型组织变得乐意与资金缺乏的、 “不可靠”的小型组织合作,来创建面向企业的工具、专业服务和管理服务等,这种现象是令人鼓舞的。当我在十五年前开始代表我的组织购买技术时,我被告知只能与规模大的公司长期合作。现在我看到很多财富500强公司与那些比我四岁女儿还年轻的公司合作,帮助他们处理最繁杂的问题。在一些情况下,这样做会帮助企业改变它们的整个业务。

当许多技术主管带领它们的组织走向数字化和客户至上的方向时,他们意识到如果可以接受年轻的基于云的供应商的一些文化,他们将可以实现更加迅速地反应。当我在Dow Jones担任CIO时,我和AWS合作的主要动机是吸收一些亚马逊的文化。我想要的是使亚马逊具备能够快速定位顾客、迅速反应的工具。我也迫切想构建一个DevOps文化来鼓励尝试。许多年轻的供应商—2nd Watch, Cloudreach, Cloud Technology Partners, Minjar, New Relic, App Dynamics, Chef, Puppet, CloudEndure,也出于同样的原因在发掘新的业务。

这并不是说现存的大型工具和服务提供商不能快速利用这种转变的优势。在许多情况下,它更适合利用现有的关系来改造业务或文化。

在你关注的领域寻找可靠的合作伙伴

你应该始终致力于与你业务目标相一致的组织合作。如果你正想具有DevOps能力,并且希望你的团队学会怎样“运行他们所构建的”,例如,确保你的合作伙伴能够帮助你具有像他们所展示的那样的能力。这也是AWS开发了AWS认证计划的原因之一。我们希望确保你在我们的平台上能成功,这个计划会协助你找到能帮你在这些领域取得成功的合作伙伴,这些领域也是你的组织特别关注的。我们现在正在这个生态系统中的一些领域开发认证系统,如DevOps移动安全数字媒体市场和商务大数据存储健康管理生命科学微软工作负载SAPOracle等。

不论你的组织处于什么合作状态,我们都乐于帮助你找到合适的合作伙伴来实现你的目标。

作者介绍

史蒂芬·奥本

史蒂芬·奥本 (Stephen Orban) 于 2014 年9月加入亚马逊AWS 担任企业战略总经理。奥本与多名企业技术高管合作,在云如何实现业务成果、加快创新和简化流程方面进行经验和战略分享。在加入亚马逊AWS 之前,奥本曾在道琼斯担任首席信息官 (CIO)一职,他通过借力 AWS 和其他软件即服务 (SaaS) 合作伙伴,引入现代软件开发方法、实现降低成本、执行云优先政策。这些转型变革加快了产品开发周期并提高了全部业务线的生产能力,这其中就包括《华尔街日报》、MarketWatch.com、道琼斯通讯社及Factiva。奥本还曾在彭博有限合伙公司(Bloomberg LP)工作 11 年,并且在股权和消息平台担任不同的领导职务;2008 年,奥本创建彭博体育(Bloomberg Sports)并担任首席技术官 (CTO)。