浅谈AWS: IAM+S3+Lex+Lambda

在一个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。

转载于:https://www.cnblogs.com/maxstack/p/11499440.html

AWS::S3::S3Client是AWS提供的用于与S3服务进行交互的客户端库。它具有上传文件到S3存储桶的功能。 在使用AWS::S3::S3Client上传文件时,可以通过使用S3的`TransferManager`类来获取上传进度。`TransferManager`类提供了一个`Upload`方法,该方法接受一个`PutObjectRequest`对象作为参数,该对象包含了要上传的文件信息。 要获取上传进度,可以在`PutObjectRequest`对象中设置一个`ProgressListener`。`ProgressListener`是一个接口,它定义了一些回调方法,当上传进度发生变化时,这些方法会被触发。 通过实现`ProgressListener`接口,并将其实例作为参数传递给`PutObjectRequest`对象的`setGeneralProgressListener`方法,就可以获取上传进度。在`ProgressListener`的回调方法中,可以获取当前上传的字节数、总字节数以及上传百分比等信息。 例如,可以创建一个实现`ProgressListener`接口的类`MyProgressListener`,并将其传递给`PutObjectRequest`对象的`setGeneralProgressListener`方法: ```java public class MyProgressListener implements ProgressListener { @Override public void progressChanged(ProgressEvent progressEvent) { long bytesTransferred = progressEvent.getBytesTransfered(); long totalBytes = progressEvent.getBytes(); int percent = (int) (bytesTransferred * 100 / totalBytes); System.out.println("上传进度:" + percent + "%"); } } ``` 然后,在上传文件之前,创建`MyProgressListener`的实例,并将其设置为`PutObjectRequest`对象的`ProgressListener`: ```java MyProgressListener progressListener = new MyProgressListener(); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, new File(filePath)); putObjectRequest.setGeneralProgressListener(progressListener); TransferManager transferManager = new TransferManager(client); Upload upload = transferManager.upload(putObjectRequest); upload.waitForCompletion(); ``` 这样,当文件上传时,`MyProgressListener`中的`progressChanged`方法会根据上传进度的变化被触发,并打印出上传的百分比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值