在一个side project中用到了AWS的一些Services。AWS提供了很多的服务,比如
- Compute
- EC2
- Storage
- S3
- Database
- RDS
- Networking & Content Dilivery
- Route 53
- Developer Tools
- Cloud 9
- Machine Learning
- Amazon Lex
- Security, Identity, & Compliance
- IAM
一开始接触有点头大,看到一个个新名词,有点不知所措。而且文档内容非常详细,感觉是写给技术人员而不是用户看的。静下心来学习了一段时间后,算是摸到了一点门道。下面就挑几个重点的讲下是怎么使用的。
1. IAM
Identity and Access Management
权限控制
一开始注册并登陆AWS之后,我们是作为root user进去的,权限非常大,比如可以管理账单,加减服务器等等。但是我们的应用调用AWS的服务时,肯定不能用root user的账号,否则会有安全隐患。这时,就需要在IAM里面创建其他的User,并给与相应的权限。
IAM构建权限控制的层次关系如下:Group里面可以多个Users,一个User可以又多个Roles,一个Role可以有多个Policies。最细化的粒度是在Policy上,可以在Permissions policies中查看自己有哪些权限。
Group
User
Role
Policy
同时,为了方便管理,IAM还有一个Permissions boundary,to control the maximum permissions this user can have。一般可以不设。
Access Key
在调用AWS服务时,需要一个access key,这样AWS才知道这个HTTP request是哪个用户发来的,有没有权限调用对应的服务。生成路径如下:
Users -> Summary -> Security credentials -> Access keys -> Create access key
生成的access key格式如下:
Access key ID:ABCDEFG
Secret access key:ID:ABCDEFG
MFA device
如果想要给账号加一层防护,可以添加MFA device,即手机上装一个软件(比如Google Autenticator),之后每次登陆都需要额外输入一次手机令牌。
Users -> Summary -> Security credentials -> Assigned MFA device
2. S3
S3 buckets,即文件服务器。一般用来存放一些静态文件。比如图片,视频,或者需要import的css,js脚本等等。
Web上面的操作比较简单,创建一个bucket,然后往里面放东西即可。唯一需要注意的是它需要设置访问权限(Access),区域(Region)等属性。
当然,除了在Web上直接操作,它也支持在程序中调用S3 API,完成上传或管理等操作。
3. Lex
Amazon Lex,可以完成一些NLP,语义识别与处理。一开始需要注意的是,不是每个Region都提供这项服务,为此,我选择了美东(N. Virginia)的服务器。
初步使用下来的感受是,Lex是一个简单的以解决问题为导向的系统。我们可以和机器人对话,来订花,客服等等,但可能闲聊就比较难了。这是由它的设计决定的。
Lex的核心有几个组成部分:
- Bot:和我们对话的机器人,比如一个订机票的bot
- Intent:机器人试图理解到我们的意图,比如订机票,查航班,订酒店。
- Utterances:我们可以定义一些“话语”,和Intent相关联。比如“我要订机票”,“我想订一张机票”等等。
- Slot type:试图拿到一些与意图有关的参数,比如订机票的话,需要什么时间,什么航班。
分析订机票这个事件,对话可能如下
A:我要订机票。
Bot:你想要订哪个航班?
A:BK8767。
Bot:你想要订什么时间的?
A:2019年11月1号。
Bot:好的,给你定好了,订单号为12345。
经过一系列的对话,机器人拿到了所有的Slot,即可以去做最终的Fulfillment,导向下单支付页面等等。当然,实际的对话肯定要比这个复杂,比如,顾客可能会问:11月1号从北京飞巴黎的航班有哪些,按价格高低排列。如此反复多次才会完成下单。这就需要额外的代码来支持这些功能。
Lex支持扩展代码功能,它既支持在utterances处理的最初阶段调用Lambda,也支持在Fulfillment阶段再调用Lambda。
- Lambda initialization and validation:拿到utterances之后做一些处理,比如validation,但同时它也可以做更多的事,甚至包括确定Slot的内容等等。
- Fulfillment:拿到Intent和Slot之后,怎么去做进一步处理。
当然,Lex也支持外部调用集成,比如自己写一个Presentation Layer,后台调用Lex做NLP,然后返回数据到前台进行展示。
个人认为,Lex是一个简单的半集成的NLP Bot,可以用低成本,快速定制一个由业务需求驱动的机器人,但其中不涉及复杂/高阶的NLP处理。
和S3甚至几乎所有的AWS服务一样,Lex的所有操作都可以通过Web Service完成。
4. Lambda
在上面我们说到了Lex支持调用Lambda,那么什么是Lambda呢?
个人理解就是,比如一个Function,AWS会管理它的运行环境或生命周期,你只需要调用就好了。如下:
def order_flowers_info(intent_request):
return something
用户的需求很简单,调用order_flowers方法,然后得到something,我最终的关注点在于something对不对,其它并不那么重要。所以,可以在Lambda中实现这个方法,并完成调用。
我觉得,Lambda更多的是面向其他的AWS服务。比如当你使用了AWS其他一些机器学习框架时,想要做一些hack或者写一些自己的逻辑,就可以用自集成的Lambda,非常方便。如果我自己有一个应用,那么我本地就直接写一个Function去调用,不需要集成Lambda。