Author: AWS Team


Token Vending Machine:移动应用客户端安全访问AWS服务的解决方案

背景介绍

广大移动互联网应用和移动游戏开发者在利用AWS服务进行开发过程中,经常需要为移动客户端提供AWS服务访问安全证书,以便让这类移动端应用有权限直接访问AWS服务,比如通过AWS S3服务上传图片文件或者通过AWS SQS服务发送消息。

有些移动开发者可能会考虑为每个移动应用用户分配一个固定的AWS IAM安全证书来实现移动客户端访问AWS服务。但是一款热门的移动互联网应用或者移动游戏往往拥有数百万甚至上千万的用户基数,让系统管理员为每一个用户分配和管理IAM 安全证书工作量将会非常巨大。而且移动客户端相对服务器端具有较低的安全等级,保存在移动设备内部的敏感信息比如用户账号或密码存在泄露的风险,强烈建议移动开发者不要将AWS安全证书长期保存在用户的移动设备中。

利用AWS 安全令牌服务Security Token Service (简称STS)可以动态的为大量移动客户端用户分配临时安全证书 ,并且可以限制这些临时安全证书的AWS服务访问权限和有效时间。使用AWS STS临时安全证书没有用户总数的限制,也不需要主动轮换,证书自动会过期,拥有非常高的安全性。对于这种采用AWS STS和其他相关AWS服务构建的移动客户端访问AWS服务安全证书分配系统,我们把它命名为Token Vending Machine,即令牌售卖机,简称TVM。

下面我们以一个典型的手机图片管理APP演示项目为例来介绍如何利用AWS相关服务设计和开发一套TVM系统。读者可以通过参考演示项目的设计思想和相关源码快速开发出符合自己项目需求的TVM系统。

假设该演示项目的基本需求如下:

1) 用户在使用该APP前要先完成注册

2)   用户成功登录后可以通过APP上传,查看和管理自己的图片

3)   用户不可以访问到其他用户的图片

实现原理


整个演示项目实现可以分为三个主要模块:移动客户端、TVM系统和S3服务。

A. 移动客户端

  • 包括访问TVM系统获取临时安全证书的客户端代码
  • 包括直接访问AWS S3存储桶用户个人目录内容和图片管理相关的代码逻辑实现。

B. TVM系统

  • 使用了一台AWS EC2实例来运行Apache Tomcat Web服务器,用于向移动客户端提供远程访问接口以获取临时安全证书。在Tomcat内部则部署了使用JAVA语言开发的TVM服务器端实现。
  • 使用了AWS 高性能的NoSQL数据库DynamoDB做为后台用户数据库。该数据库用来保存注册用户的账号、密码和会话Key等信息。

开发者自行设计和实现TVM系统的时候,完全可以使用自己熟悉的数据库产品或者集成第三方已有的用户数据库服务,比如基于LDAP的企业内部用户数据库。

  • TVM系统的JAVA实现通过访问AWS STS服务获取临时安全证书以提供给移动客户端。
  • 在真实的项目中,运行TVM系统的服务器端往往还将直接管理S3中保存的所有用户资源,比如可以限制每个用户允许上传图片的数量和文件合计大小等等。这部分功能在本演示项目中暂时没有实现。

C. S3服务

  • AWS S3服务为用户上传图片提供了持久化存储能力。

在用户成功完成账号注册后,TVM系统的基本工作流程如下:

1) 用户通过移动客户端输入账号和密码,登录系统。

2) TVM查询用户数据库,校验账号和密码组合的合法性。

3) TVM访问AWS STS服务,请求分配临时证书,TVM将获得的临时安全证书返回移动客户端。

4) 移动客户端使用获取的临时安全证书,调用AWS S3 API,执行文件的上传、列表和下载等操作。

部署过程

  1. 使用IAM用户账号登录AWS控制台
  2. 创建IAM EC2角色
  3. 创建临时安全证书角色
  4. 在Launch TVM EC2实例的过程中,选择使用创建的IAM EC2角色
  5. 在TVM EC2实例中部署Tomcat和TVM war包
  6. 下载并安装TVM apk文件到安卓移动终端

细节说明

IAM EC2角色定义

基于对生产环境高安全性要求的考虑,我们没有在JAVA代码中直接使用静态配置的IAM用户Access Key Id和Access Key来访问AWS DynamoDB, S3和STS等AWS服务,而是希望使用AWS动态分配的临时安全证书。为此我们创建了一个专门的IAM EC2角色,并为该角色赋予了足够的AWS服务访问权限。这样一来,运行在带有该IAM角色的EC2实例中的TVM组件,就可以通过EC2上下文获得拥有足够AWS服务访问权限的临时安全证书。请注意不要将TVM组件自己使用的临时安全证书与TVM组件将为移动客户端分配的临时安全证书相混淆。这里通过EC2上下文获取的临时安全证书主要用于TVM组件在服务器端访问AWS相关服务,比如读写DynamoDB或者向STS服务请求为移动客户端分配临时安全证书。

下面的例子IAM Policy文件赋予了IAM EC2角色访问AWS STS服务的AssumeRole接口和其他AWS服务的权限。开发者可以根据自己的实际需求增加或减少相关权限分配。

{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "sts:AssumeRole",

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "sqs:*" ,

                "sns:*" ,

                "dynamodb:*"

            ],

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:*"

            ],

            "Resource": "*"

        }

    ]

}

TVM组件实现代码在构造STS服务访问客户端对象的时候,我们使用了AWS JAVA SDK提供的com.amazonaws.auth.InstanceProfileCredentialsProvider证书加载类文件。该类实例可以自动访问EC2运行环境上下文,获取临时安全证书以供构造的STS服务访问客户端对象使用。并且当获取的临时安全证书即将失效时,该类实例还可以自动去获取新的安全证书。通过使用该类实例,TVM组件开发者就不再需要考虑访问STS或DynamoDB服务时需要提供的安全证书问题。

下面的代码片段演示了如何构建一个带有自动安全证书管理能力的STS服务访问客户端对象。

代码片段来自于TVM组件的com.amazonaws.tvm.TemporaryCredentialManagement.java源文件。

AWSSecurityTokenServiceClient sts =

    new AWSSecurityTokenServiceClient(

        new InstanceProfileCredentialsProvider() );         

STS API方法选择和使用

AWS STS服务提供了多个API方法,分别用于不同场景下的临时证书获取。其中的AssumeRole 方法是唯一支持临时安全证书调用的。这种STS API方法的调用方式看上去非常有趣:我们使用了来自EC2上下文的临时安全证书去调用STS AssumeRole 方法,目的是为了帮助移动客户端用户申请访问AWS S3服务的临时安全证书。实际上通过EC2上下文获取的临时安全证书也是来自AWS STS服务的动态分配。这一点恰恰也证明了AWS服务的松耦合设计思想,用户可以通过灵活组合不同的服务来达到自己的设计目的。


STS AssumeRole 方法提供了多个参数,可以灵活的设置分配的临时安全证书的各种特性。我们这里主要介绍演示项目用到的几个重要参数。

 
名称 类型 必填 含义
DurationSeconds 整型

以秒为单位的临时安全证书有效时间限制。最小可以是15分钟(900秒),最大可以是1个小时(3600秒)

默认值:3600秒。

RoleArn 字符串

临时安全证书对应的角色Arn值。开发者在为移动客户端分配临时安全证书的时候,需要首先在AWS系统中创建该角色对象,并且为角色设置适当的权限。STS AssumeRole方法返回的临时安全证书的权限就将以该角色所拥有的权限为基础。如果开发者调用STS API时候还提供了Policy参数,返回的安全证书权限还将在此基础上做进一步限制。以两个参数提供权限的交集作为返回的临时安全证书的最终权限设置。

RoleArn格式举例:

“arn:aws-cn:iam::358620XXXXXX:role/TVMClientRole”

Policy 字符串 以Json格式表示的附加权限设置。如果该参数被设置,STS服务将使用RoleArn参数中指定的角色对应的权限和该参数设置权限的交集来定义即将返回的安全证书的权限。一种常用的做法就是使用该参数来进一步限制返回安全证书的权限到每个具体的实体。在我们的演示项目中,就是通过设置Policy来进一步限制每个登录用户只能访问属于自己的S3文件。
RoleSessionName 字符串

角色会话名称,主要用来区分申请临时安全证书的不同用户或者不同使用场景。

在我们的演示项目中,设置的角色会话名称就是用户通过手机客户端应用输入的登录名。

下面的代码片段演示了如何调用STS AssumeRole方法申请新的临时安全证书。

代码片段来自于TVM组件的com.amazonaws.tvm.TemporaryCredentialManagement.java源文件。

//构造请求对象

AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest();

 

assumeRoleRequest.setRoleArn("Arn of your TVM role");

 

assumeRoleRequest.setPolicy(

        TemporaryCredentialManagement.getPolicyObject( myUserName ));

 

assumeRoleRequest.setRoleSessionName(myUserName);

 

assumeRoleRequest.setDurationSeconds(

new Integer( Configuration.SESSION_DURATION ));   

 

//获取临时安全证书

AssumeRoleResult assumeRoleResult = sts.assumeRole(assumeRoleRequest);

 

if (assumeRoleResult != null && assumeRoleResult.getCredentials() != null)

{   

    log.info("利用EC2角色从STS服务获取临时证书操作成功!");

 

    log.info("AccessKeyId = "

    + assumeRoleResult.getCredentials().getAccessKeyId());

 

}

else

{

    log.warning("利用EC2角色从STS服务获取临时证书操作失败!");

}       

设置安全证书权限

在我们演示项目的需求列表中,有一个需求是不同的用户只能访问S3对象存储服务中属于自己的文件。实现该需求有不同的方法,我们这里采用方法的是限制移动客户端使用的AWS 临时安全证书的S3访问权限。在AWS STS AssumeRole 方法中有两个参数可以设置返回的临时安全证书的权限:一个是临时安全证书角色Arn值,一个是附加的Policy字符串。

在我们演示项目的实现过程中,我们为创建的临时安全证书角色分配了如下权限策略,保证AWS STS服务返回的临时安全证书拥有指定S3存储桶的必要操作权限。

{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "s3:ListBucket",

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:GetObject",

                "s3:PutObject",

                "s3:DeleteObject"

            ],

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket/*"

        }

    ]

}

请注意,在创建临时安全证书角色的过程中,还需要添加该角色对于之前创建的IAM EC2角色的信任关系。否则TVM服务器端组件在执行AssumeRole方法时候,AWS系统会提示当前用户没有对临时安全证书角色执行AssumeRole操作的权限。

接下来我们将利用模板文件动态地构造附加的Policy,目的是限制每个登录用户只能够访问自己目录下的S3资源。

模板文件的格式如下:

{

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

    "Statement": [

        {

            "Effect": "Allow",

            "Action": "s3:ListBucket",

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket"

        },

        {

            "Effect": "Allow",

            "Action": [

                "s3:GetObject",

                "s3:PutObject",

                "s3:DeleteObject"

            ],

            "Resource": "arn:aws-cn:s3:::tvm-examplebucket/__USERNAME__/*"

        }

    ]

}

以下的例子代码利用登录用户名替换模板中的“__USERNAME__”,构造出指定用户的权限Policy。

代码片段来自于TVM组件的com.amazonaws.tvm.TemporaryCredentialManagement.java源文件。

protected static String getPolicyObject( String username ) throws Exception

{

    // Ensure the username is valid to prevent injection attacks.

    if ( !Utilities.isValidUsername( username ) )

    {

        throw new Exception( "Invalid Username" );

    }

    else

    {

        return Utilities.getRawPolicyFile()

                        .replaceAll( "__USERNAME__", username );

    }

}

权限分级控制

在本演示系统中,用于开发和部署TVM系统的IAM用户、最终运行TVM系统的EC2实例对应的IAM角色和移动客户端所获得的临时安全证书分别拥有不同大小的权限,实现了很好的权限分级控制。

移动客户端临时安全证书的过期问题处理

在前面我们介绍的TVM系统的基本流程里面,移动客户端应用在登录成功后,TVM组件将直接返回临时安全证书。而实际的实现过程要比这复杂一些,主要是为了解决移动客户端获取的临时安全证书过期后的自动更新问题。


TVM系统的完整工作流程如下:

1) 用户通过移动客户端输入账号和密码,登录系统。

2) TVM查询用户数据库,校验账号和密码组合的合法性,创建并返回代表当前用户会话的Key值给移动客户端。

3) 移动客户端在本地缓存获取的会话Key。移动客户端利用本地保存的会话Key和用户动态ID向TVM系统发起请求,申请临时安全证书。

4) TVM系统校验移动客户端用户身份和会话Key,访问AWS STS服务,请求分配临时安全证书,TVM将获取的临时安全证书返回移动客户端。

5) 移动客户端在本地缓存获取的临时安全证书。移动客户端使用本地保存的临时安全证书,持续调用AWS S3 API,执行文件的上传、列表和下载等操作。

关于移动客户端获取临时安全证书,请注意下面的细节:

  • 在临时安全证书有效时间范围内,移动客户端可以直接使用本地保存的临时安全证书访问AWS 服务,比如S3存储桶。
  • 一旦临时安全证书过期,移动客户端需要凭借本地保存的用户会话Key和动态用户ID向TVM系统再次申请临时安全证书,不需要再提供用户名和密码信息。
  • 如果是刚刚启动移动客户端或者TVM用户会话Key已经失效,移动客户端需要执行上述完整的登录和临时安全证书获取过程。

下面的代码片段演示如何登录TVM系统,获取当前用户的会话Key。

代码片段来自于安卓移动客户端组件的com.amazonaws.tvmclient.AmazonTVMClient.java源文件。

public Response login( String username, String password ) {

    Response response = Response.SUCCESSFUL;

    if ( AmazonSharedPreferencesWrapper.getUidForDevice( this.sharedPreferences ) == null ) {

        String uid = AmazonTVMClient.generateRandomString();

        LoginRequest loginRequest = new LoginRequest(this.endpoint,

                                                     this.useSSL,

                                                     this.appName,

                                                     uid,

                                                     username,

                                                     password );

 

        ResponseHandler handler = new LoginResponseHandler( loginRequest.getDecryptionKey() );

        response = this.processRequest( loginRequest, handler );

 

        if ( response.requestWasSuccessful() ) {

            AmazonSharedPreferencesWrapper.registerDeviceId(this.sharedPreferences,

                                                            uid, 

                                                            ((LoginResponse)response).getKey());

            AmazonSharedPreferencesWrapper.storeUsername( this.sharedPreferences, username );                       

        } 

    }

    return response;

}

下面的代码片段演示如何使用当前用户的会话Key和动态用户ID访问TVM系统,更新本地保存的临时安全证书。

代码片段来自于安卓移动客户端组件的com.amazonaws.demo.personalfilestore.AmazonClientManager.java和com.amazonaws.tvmclient.AmazonTVMClient.java源文件。

public Response validateCredentials() {

    Response ableToGetToken = Response.SUCCESSFUL;

    if (AmazonSharedPreferencesWrapper.areCredentialsExpired( this.sharedPreferences ) ) {

        //清空本地保存的过期临时安全证书   

        clearCredentials();      

        AmazonTVMClient tvm =

            new AmazonTVMClient(this.sharedPreferences,

                                PropertyLoader.getInstance().getTokenVendingMachineURL(),

                                PropertyLoader.getInstance().getAppName(),

                                PropertyLoader.getInstance().useSSL() );

        if ( ableToGetToken.requestWasSuccessful() ) {

            ableToGetToken = tvm.getToken();           

        }

    }

    if (ableToGetToken.requestWasSuccessful() && s3Client == null ) {        

        AWSCredentials credentials =

            AmazonSharedPreferencesWrapper.getCredentialsFromSharedPreferences(

                this.sharedPreferences );

        s3Client = new AmazonS3Client( credentials );

        s3Client.setRegion(Region.getRegion(Regions.CN_NORTH_1));

    }

    return ableToGetToken;

}

 

public Response getToken() {

    String uid = AmazonSharedPreferencesWrapper.getUidForDevice( this.sharedPreferences );

    String key = AmazonSharedPreferencesWrapper.getKeyForDevice( this.sharedPreferences );

    Request getTokenRequest = new GetTokenRequest( this.endpoint, this.useSSL, uid, key );

    ResponseHandler handler = new GetTokenResponseHandler( key );

 

    GetTokenResponse getTokenResponse =

        (GetTokenResponse)this.processRequest( getTokenRequest, handler ); 

 

    if ( getTokenResponse.requestWasSuccessful() ) {

        AmazonSharedPreferencesWrapper.storeCredentialsInSharedPreferences(

            this.sharedPreferences,                                                                    

            getTokenResponse.getAccessKey(),                                                                    

            getTokenResponse.getSecretKey(),                                                                                   

            getTokenResponse.getSecurityToken(),                                                                    

            getTokenResponse.getExpirationDate() );

    }

 

    return getTokenResponse;

}

移动客户端和TVM系统安全通信设计

开发者如果需要移动客户端应用在非安全的互联网上直接与TVM系统通信,比如直接使用HTTP而非HTTPS发送登录请求和接收临时安全证书,开发者还需要自己实现一定程度的消息加密解密过程,避免敏感信息比如会话Key或临时安全证书内容在传输过程中被泄密。

演示效果

用户通过手机客户端注册新账号,执行完成登录操作后,就可以上传,查看和删除属于自己的图片文件。上传文件过程支持用户输入文本内容由系统自动产生上传文件和直接从手机客户端选择需要上传的图片文件。


通过查看AWS S3存储桶内容,我们可以看到每个用户上传的图片或文本文件都保存在属于该用户自己的S3存储桶路径下面:

在TVM系统DynamoDB用户数据库的用户表中保存了用户名、用户动态ID和加密的用户密码信息:

在TVM系统DynamoDB用户数据库的设备表中保存了用户的会话Key值:

例子源码

TVM系统服务器端源码

https://s3.cn-north-1.amazonaws.com.cn/mwpublic/projects/tvm/TVMServer.zip

安卓客户端源码

https://s3.cn-north-1.amazonaws.com.cn/mwpublic/projects/tvm/TVMAndroidClient.zip

参考链接

http://aws.amazon.com/articles/4611615499399490

https://aws.amazon.com/code/Java/8872061742402990

http://aws.amazon.com/code/4598681430241367

http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/IAM_Introduction.html

http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles.html

http://docs.aws.amazon.com/zh_cn/STS/latest/UsingSTS/Welcome.html

http://docs.aws.amazon.com/zh_cn/STS/latest/APIReference/Welcome.html

敬请关注

在移动应用设计开发过程中,开发者除了完全靠自己开发实现用户注册和管理功能外,还可以考虑与主流社交媒体身份提供商实现联合身份认证,让已经拥有这些社交媒体身份提供商注册账号的用户能够顺利访问其移动应用。AWS Cognito服务已经支持与Google、Facebook、Twitter 或 Amazon等国际知名社交媒体身份提供商的联合身份认证。后续我们会陆续推出如何与微信、QQ和微博等国内主要社交媒体的联合身份认证方案探讨。

作者介绍:

蒙维

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构咨询和设计,有超过十年以上电信行业和移动互联网行业复杂应用系统架构和设计经验,主要擅长分布式和高可用软件系统架构设计,移动互联网应用解决方案设计,研发机构DevOps最佳实施过程。

 

利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶

背景介绍

Amazon S3是互联网存储解决方案,能让所有开发人员访问同一个具备可扩展性、可靠性、安全性和快速价廉的数据存储基础设施。Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 互联网上的任何位置存储和检索任何数量的数据。开发人员可以利用Amazon提供的REST API接口,命令行接口或者支持不同语言的SDK访问S3服务。

对于原来使用本地目录访问数据的应用程序,比如使用本地磁盘或网络共享盘保存数据的应用系统,如果用户希望把数据放到S3上,则需要修改数据的访问方式,比如修改为使用AWS SDK 或CLI访问S3中存储的数据。为了让用户原来的应用系统能在不做修改的情况下直接使用Amazon S3服务,需要把S3存储桶作为目录挂载到用户服务器的本地操作系统上。常用的挂载工具有S3fs和SubCloud等。本文主要介绍如何利用S3fs将S3存储桶挂载到Amazon EC2 Linux实例上。

S3fs介绍

S3fs是基于FUSE的文件系统,允许Linux和Mac Os X 挂载S3的存储桶在本地文件系统,S3fs能够保持对象原来的格式。关于S3fs的详细介绍,请参见:https://github.com/s3fs-fuse/s3fs-fuse

利用S3fs挂载S3存储桶

一、准备

  1. 使用拥有足够权限的IAM账号登录AWS控制台。
  2. 创建S3存储桶,给存储桶命名如“s3fs-mount-bucket”(如果使用已有存储桶,本步骤可略过)。

     3. 创建具有该S3存储桶访问权限的 IAM 用户,并为该IAM用户创建访问密钥。

a) 关于如何创建IAM用户,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console

b) 关于如何为IAM用户创建访问密钥,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_credentials_access-keys.html

c) 关于如何为IAM用户设置权限策略,请参见:http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/access_policies_create.html

https://aws.amazon.com/cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/

4. 创建并启动Amazon EC2 Linux实例

具体过程请参见:http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/launching-instance.html

二、安装和配置S3fs

  1. 安装s3fs

a) 使用Amazon EC2默认用户“ec2-user”和对应的私钥文件登录启动的Linux实例(请注意将下边例子中的私钥文件和ec2实例域名替换为用户自己的值)

ssh -i /path/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com

b) 安装必要的软件包

sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

c) 下载,编译并安装s3fs

git clone https://github.com/s3fs-fuse/s3fs-fuse.git

cd s3fs-fuse

./autogen.sh

./configure

make

sudo make install

d) 检查s3fs是否安装成功

[ec2-user@ip-172-31-23-148 s3fs-fuse]$ s3fs

s3fs: missing BUCKET argument.

Usage: s3fs BUCKET:[PATH] MOUNTPOINT [OPTION]...

 

[ec2-user@ip-172-31-23-148 ~]$ which s3fs

/usr/local/bin/s3fs

2. 创建IAM用户访问密钥文件

  • IAM用户访问密钥内容可以写入当前用户默认密钥文件比如“/home/ec2-user/.passwd-s3fs”或者用户自己创建的文件。
  • 命令格式:echo [IAM用户访问密钥ID]:[ IAM用户访问密钥] >[密钥文件名]
  • 命令举例:下面的例子将在当前用户默认路径创建密钥文件

echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /home/ec2-user/.passwd-s3fs

请注意:访问海外AWS S3服务和中国 S3服务使用的是不同的IAM账号,对应不同的密钥。

3. 设置密钥文件只能够被当前用户访问

  • 命令格式:chmod 600  [密钥文件名]
  • 命令举例:下面的例子将设置密钥文件只能被当前用户访问

chmod 600 /home/ec2-user/.passwd-s3fs

三、手动挂载S3存储桶

S3fs挂载存储桶使用的命令是s3fs

s3fs的命令格式是:

  • s3fs BUCKET MOUNTPOINT [OPTION]…
  • s3fs [S3存储桶名] [本地目录名] [OPTION]
  • OPTION是可选项,格式是 –o <option_name>=<option_value>,常用的options有:
     名称 含义 缺省值
    passwd_file 指定挂载的密钥文件
    connect_timeout 设置超时连接等待的时间,单位秒 300
    url 设置访问s3的url http://s3.amazonaws.com
    endpoint 设置s3存储桶的endpoint us-east-1
    allow_other 设置allow_other允许所有用户访问挂载点目录,设置这个选项需要在 /etc/fuse.conf 文件添加user_allow_other选项

手动挂载AWS海外区域S3存储桶

  • 命令格式:s3fs [S3存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o endpoint=[区域名]

命令举例:下面的例子将名为“s3fs-mount-bucket”的新加坡区域S3存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”。

s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o endpoint=ap-northeast-1

手动挂载AWS中国北京区域S3存储桶

  • 命令格式:s3fs [S3存储桶名] [本地目录名] -o passwd_file=[密钥文件名] -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1
  • 命令举例:下面的例子将名为“s3fs-mount-bucket”的北京区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”。

s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1

检查挂载结果

  • 挂载操作执行结束后,可以使用Linux “df”命令查看挂载是否成功。出现类似下面256T的s3fs文件系统即表示挂载成功。用户就可以进入本地挂载目录去访问存储在S3存储桶中的对象。

[ec2-user@ip-172-31-23-148 ~]$ df -h

文件系统        容量  已用  可用 已用% 挂载点

devtmpfs        488M   56K  488M    1% /dev

tmpfs           498M     0  498M    0% /dev/shm

/dev/xvda1      7.8G  1.2G  6.6G   15% /

s3fs            256T     0  256T    0% /home/ec2-user/s3mnt

 

[ec2-user@ip-172-31-23-148 ~]$ cd /home/ec2-user/s3mnt

[ec2-user@ip-172-31-23-148 s3mnt]$ ls -l

总用量 1

-rw-rw-r-- 1 ec2-user ec2-user 19 10月 18 07:13 a.txt

[ec2-user@ip-172-31-23-148 s3mnt]$

卸载挂载的S3存储桶

  • 如果不再需要通过挂载方式访问S3存储桶,可以使用Linux “umount”命令卸载。

[ec2-user@ip-172-31-23-148 ~]$ sudo umount /home/ec2-user/s3mnt

[ec2-user@ip-172-31-23-148 ~]$ df -h

文件系统        容量  已用  可用 已用% 挂载点

devtmpfs        488M   56K  488M    1% /dev

tmpfs           498M     0  498M    0% /dev/shm

/dev/xvda1      7.8G  1.2G  6.6G   15% /

调试

如果遇到手动挂载不成功的问题,请尝试在执行的命令后面添加下面的参数,并检查输出日志中的错误提示信息:

  • 命令格式:[完整的s3fs挂载命令] -d -d -f -o f2 -o curldbg
  • 命令举例:下面的例子试图将名为“s3fs-mount-bucket”的S3存储桶挂载到指定的本地目录“/home/ec2-user/s3mnt”下,并输出挂载过程详细调试日志。

[ec2-user@ip-172-31-23-148 ~]$ s3fs s3fs-mount-bucket /home/ec2-user/s3mnt -o passwd_file=/home/ec2-user/.passwd-s3fs -o url=http://s3.cn-north-1.amazonaws.com.cn -o endpoint=cn-north-1 -d -d -f -o f2 -o curldbg

[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [CRT] to [INF]

[CRT] s3fs.cpp:set_s3fs_log_level(254): change debug level from [INF] to [DBG]

[INF]     s3fs.cpp:set_moutpoint_attribute(4196): PROC(uid=500, gid=500) - MountPoint(uid=500, gid=500, mode=40775)

FUSE library version: 2.9.4

nullpath_ok: 0

nopath: 0

utime_omit_ok: 0

四、设置开机自动挂载S3存储桶

A. 创建全局IAM用户访问密钥文件

切换Linux系统用户账号到“root”用户,把IAM用户访问密钥内容写入/etc/passwd-s3fs文件中,并限制该文件的访问权限。“/etc/passwd-s3fs”文件是s3fs保存IAM用户访问密钥的全局默认路径。

请注意:访问海外AWS S3服务和中国 S3服务使用的是不同的IAM账号,对应不同的密钥。

sudo su

echo AKIAIOEO4E2VOHLxxxxx:2LXBboddEpRLmWl48i3+b4ziwPL3bJ4vxxxxxxxx > /etc/passwd-s3fs

chmod 600 /etc/passwd-s3fs

B. 修改/etc/fstab文件

编辑/etc/fstab文件,添加后面的自动挂载命令。

vi /etc/fstab

B.1 自动挂载海外区域S3存储桶

  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse _netdev,allow_other,endpoint=[区域名] 0 0
  • 命令举例:添加下面的语句到/etc/fstab后,Linux系统启动后将自动把名为“s3fs-mount-bucket”的新加坡区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”,并允许其它操作系统用户(非root用户)访问。

/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse _netdev,allow_other,endpoint=ap-northeast-1 0 0

B.2 自动挂载中国北京区域S3存储桶

  • 命令格式:s3fs#[S3存储桶名] [本地目录名] fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0  0
  • 命令举例:添加下面的语句到/etc/fstab后,Linux系统启动将自动把名为“s3fs-mount-bucket”的北京区域S3存储桶挂载到本地目录“/home/ec2-user/s3mnt”下,并允许其它操作系统用户(非root用户)访问。

/usr/local/bin/s3fs#s3fs-mount-bucket /home/ec2-user/s3mnt fuse allow_other,url=http://s3.cn-north-1.amazonaws.com.cn,endpoint=cn-north-1 0  0

局限性

利用S3fs可以方便的把S3存储桶挂载在用户本地操作系统目录中,但是由于S3fs实际上是依托于Amazon S3服务提供的目录访问接口,所以不能简单的把S3fs挂载的目录和本地操作系统目录等同使用。用户使用S3f3挂载S3存储桶和直接访问S3服务有类似的使用场景。适用于对不同大小文件对象的一次保存(上传),多次读取(下载)。不适用于对已保存文件经常做随机修改,因为每次在本地修改并保存文件内容都会导致S3fs上传新的文件到Amazon S3去替换原来的文件。从访问性能上来说,通过操作系统目录方式间接访问Amazon S3存储服务的性能不如直接使用SDK或CLI接口访问效率高。以本地配置文件方式保存访问密钥的安全性也不如使用EC2 IAM角色方式高。

关于S3fs使用时候需要注意的更多细节,请参考下面s3fs官网内容:

 

“Generally S3 cannot offer the same performance or semantics as a local file system. More specifically:

  • random writes or appends to files require rewriting the entire file
  • metadata operations such as listing directories have poor performance due to network latency
  • eventual consistency can temporarily yield stale data
  • no atomic renames of files or directories
  • no coordination between multiple clients mounting the same bucket
    no hard links ”

通常S3不能提供与本地文件系统相同的性能或语义。进一步来说:

  • 随机写入或追加到文件需要重写整个文件
  • 元数据操作比如列出目录会因为网络延迟原因导致性能较差
  • 最终一致性设计可能临时导致过期数据
  • 没有对文件或目录的原子重命名功能
  • 挂载相同存储桶的多个客户端之间没有相互协调机制
  • 不支持硬链接

总结

利用S3fs可以把共享的Amazon S3存储桶直接挂载在用户服务器本地目录下,应用不需要做修改就可以直接使用Amazon S3存储服务,这种方式可以作为临时解决方案将传统应用快速迁移到AWS平台。

在已经提供了Amazon EFS(Elastic File System)服务的AWS区域,建议用户优先考虑使用Amazon EFS服务,因为它具有更高的性能。在目前还没有提供EFS服务的AWS区域,用户可以先暂时使用S3fs实现快速业务迁移。然后逐步调整S3数据访问实现方式,最终修改为使用AWS SDK或CLI方式高效并更加安全地访问S3存储服务。

 

作者介绍:

蒙维

亚马逊AWS解决方案架构师,负责基于AWS的云计算方案架构咨询和设计,有超过十年以上电信行业和移动互联网行业复杂应用系统架构和设计经验,主要擅长分布式和高可用软件系统架构设计,移动互联网应用解决方案设计,研发机构DevOps最佳实施过程。

Amazon Aurora Update – PostgreSQL 兼容性

就在两年前 (恍如昨日),我在我发布的帖文 Amazon Aurora – New Cost-Effective MySQL-Compatible Database Engine for Amazon RDS 中向大家推荐了 Amazon Aurora。在那个帖文中,我告诉大家 RDS 团队如何以全新、不受限的观点来看待关系数据库模型,并解释了他们如何为云端构建关系数据库。

自那之后,我们收到了一些来自客户的反馈,非常感人。客户非常喜欢 MySQL 兼容性,重视高可用性和内置加密。他们对以下事实充满期待:Aurora 围绕具有容错能力和自我修复能力的存储而构建,使他们能够从 10 GB 一直扩展到 64 TB,而无需预先配置。他们知道,Aurora 跨三个可用区创建了其数据的六个副本,并在不影响性能或可用性的情况下将数据备份到了 Amazon Simple Storage Service (S3)。随着他们不断扩展,他们知道自己可以至多创建 15 个低延迟只读副本,这些副本从公用存储中获取。要了解有关我们的客户如何在全球范围的生产环境中使用 Aurora 的详细信息,请花一些时间阅读我们的 Amazon Aurora 客户评价

当然,客户永远在追求更多,而我们也将竭尽全力了解他们的需求并尽力满足。下面是对我们根据客户的具体反馈所做的一些近期更新的回顾:

10 月 – 从存储过程中调用 Lambda 函数
10 月 – 从 S3 中加载数据
9 月 – 读取器终端节点用于实现负载均衡和更高的可用性
9 月 – 并行预读、更快的索引、NUMA 感知
7 月 – 从 MySQL 备份中创建群集
6 月 – 跨区域只读副本
5 月 – 跨帐户快照共享
4 月 – RDS 控制台中的群集视图
3 月 – 额外故障转移控制
3 月 – 本地时区支持
3 月 – 亚太区域 (首尔) 可用性
2 月 – 亚太地区 (悉尼) 可用性

而且现在提供 PostgreSQL 兼容性

除了功能级的反馈外,我们还收到了许多有关其他数据库兼容性的请求。居于首位的是与 PostgreSQL 的兼容性。该开源数据库 20 年来不断发展,在很多企业和初创公司中受到了广泛应用。客户喜欢使用与 PostgreSQL 相关联的企业功能 (类似于由 SQL Server 和 Oracle 所提供的功能)、性能优势以及地理空间对象。他们希望能访问这些功能,同时又能使用 Aurora 所提供的所有功能。

目前我们正在推出与 PostgreSQL 兼容的 Amazon Aurora 预览版。它提供了以上所列的所有优势,包括高持久性、高可用性以及快速创建和部署只读副本的能力。以下是您将会喜欢的关于该版本的几个方面:

性能 – Aurora 提供的性能是传统环境中运行的 PostgreSQL 性能的两倍。

兼容性 – Aurora 与 PostgreSQL 的开源版本 (版本 9.6.1) 完全兼容。在存储过程方面,我们正在计划支持 Perl、pgSQL、Tcl 和 JavaScript (通过 V8 JavaScript 引擎)。我们还计划支持 Amazon RDS for PostgreSQL 中所支持的所有 PostgreSQL 功能和扩展。

云原生 – Aurora 会充分利用它在 AWS 内运行这一事实。以下是一些交触点:

以下是您从 RDS 控制台访问所有这些的方式。首先选择 PostgresSQL Compatible 选项:

然后选择您的数据库实例类型,决定多可用区部署,命名您的数据库实例,然后设置用户名和密码:

我们正在预览目前美国东部 (弗吉尼亚北部) 区域提供的 Amazon Aurora 的 PostgreSQL 兼容性,并且您可以通过立即注册来进行访问。

快速比较

我的同事 David WeinGrant McAlister 运行了一些测试,将 Amazon Aurora 的 PostgreSQL 兼容性性能与 PostgreSQL 9.6.1 进行比较。数据库服务器在 m4.16xlarge 实例上运行,测试客户端在 c4.8xlarge 实例上运行。

PostgreSQL 利用 45K 的预配置 IOPS 存储运行,该存储由条带化至一个逻辑卷中的三个 15K IOPS EBS 卷组成,还使用了一个 ext4 文件系统。他们启用了 WAL 压缩和积极的 autovacuum,这两者都可以提高他们所测试的工作负载上的 PostgreSQL 性能。

David 和 Grant 运行的是标准 PostgreSQL pgbench 基准测试工具。他们采用了 2000 的缩放因子,这会创建一个 30 GiB 数据库并会使用多个不同的客户端计数。每个数据点运行一个小时,每次运行之前重新创建数据库。下图显示了测试结果:

David 还分享了其中一次运行的最后几秒钟的过程:

Bash

progress: 3597.0 s, 39048.4 tps, lat 26.075 ms stddev 9.883

progress: 3598.0 s, 38047.7 tps, lat 26.959 ms stddev 10.197

progress: 3599.0 s, 38111.1 tps, lat 27.009 ms stddev 10.257

progress: 3600.0 s, 34371.7 tps, lat 29.363 ms stddev 14.468

transaction type:

scaling factor: 2000

query mode: prepared

number of clients: 1024

number of threads: 1024

duration: 3600 s

number of transactions actually processed: 137508938

latency average = 26.800 ms

latency stddev = 19.222 ms

tps = 38192.805529 (including connections establishing)

tps = 38201.099738 (excluding connections establishing)

 
          

他们还分享了涵盖一次类似运行的最后 40 分钟的每秒吞吐量图:

如您所见,Amazon Aurora 比 PostgreSQL 提供更高的吞吐量,具有约 1/3 的抖动 (分别为 1395 TPS 和 5081 TPS 的标准偏差)。

David 和 Grant 现在正在收集数据,用于撰写一篇更为详细的帖文,他们计划于 2017 年初发布这篇帖文。

即将推出 – Performance Insights

我们还在研究一项新的工具,旨在帮助您非常详细地了解数据库性能。您将能够深入查看每个查询,并详细了解您的数据库如何处理查询。以下是一个非正式预览的屏幕截图:

在预览时,您将能够访问新的 Performance Insights。稍后我将提供更多细节和全部预览。

— Jeff

Amazon Lightsail – 兼具 AWS 的强大功能与 VPS 的简易性

有的人喜欢用零件组装复杂系统 (房屋、计算机或者家具)。他们喜欢规划流程,认真研究每个零件,然后挑选那些能够按照他们的期望平衡强大功能与灵活性的零件。通过这样的规划,他们享受着将零件组装完工的过程。而有些人并不觉得这种自助 (DIY) 的方式有吸引力或者具有价值,他们只对尽快获得结果感兴趣,并不想在此过程中做出太多决策。

是不是听起来很熟悉?

我认为这种模式同样也适用于系统架构和系统构建。有时候您想要花时间去亲手挑选每个 AWS 组件 (服务器、存储、IP 地址等等),然后自己组装起来。但有的时候,您只是需要一个预先配置且预先组装的系统,您希望这个系统已准备就绪,可以让您运行自己的 Web 应用程序,而不必自己费力去构建系统。

在很多情况下,那些寻求预组装系统的人会求助于虚拟私有服务器 (或 VPS)。VPS 会为您呈现一些选项,每个选项都已准备就绪可运行,您通过支付可预测的每月费用便可使用。

VPS 是一个完美的入门工具,但随着时间的推移,其使用环境就会逐渐受限。从某种意义上来说,随着您的需求增长,您可能需要跨出现有计划的边界,但却发现您毫无选择,无法完成渐进式改进,因而就面临着需要作出颠覆性改变的境况。或者,您可能会发现自己可用于自动扩展或故障转移的选择有限,而且您需要自己来完成所有设置。

隆重推出 Amazon Lightsail

目前,我们正在推出 Amazon Lightsail。只需几次点击,您就可以从菜单中选择一种配置,并启动一个预配置了基于 SSD 的存储、DNS 管理和静态 IP 地址的虚拟机。您可以启动自己最喜欢的操作系统 (Amazon Linux AMI 或 Ubuntu)、开发人员堆栈 (LAMPLEMPMEAN Node.js) 或应用程序 (Drupal、Joomla、Redmine 和 GitLab 等),而定价计划当中每月支付的固定费率自 5 美元起,还包括普遍支持的数据传输。

下面是相关计划和配置:

您将获得 VPS 的简便性,并有 AWS 的强大功能、可靠性和安全性作为后盾。随着您的需求增长,您将能够顺利跨出初始边界,连接额外的 AWS 数据库、消息发送和内容分配服务。

最重要的是,Lightsail 是您开始使用 AWS 和快速启动您的云项目最轻松的方式,同时还为您带来顺畅、清晰的未来之路。

快速指南

我们来快速了解一下 Amazon Lightsail。Lightsail 控制台的每个页面都包含一个 Quick Assist 选项卡。您可以随时点击该选项卡来访问上下文相关文档,以便帮助您充分利用 Lightsail:

我从主页上开始。起先我没有任何实例或其他资源:

我点击 Create Instance 继续。为我的计算机映像 (一个应用和一个操作系统,或者只是一个操作系统) 选择一个实例计划,为我的实例提供一个名称,这些都在一个页面上完成:

我可以启动多个实例,设置一个配置脚本,或者如果自己喜欢,指定一个备用 SSH 密钥对。我还可以选择一个可用区。我将选择 10 美元计划中的 WordPress,其他保持原样,然后点击 Create。它会在几秒钟内启动并运行:

我可以通过点击实例来进行管理:

我的实例有一个公有 IP 地址,我可以在浏览器上打开这个地址。WordPress 已经安装和配置,并且正在运行:

我需要输入 WordPress 密码才能完成其设置。我在实例管理页面上点击 Connect using SSH,便可通过基于浏览器的 SSH 终端窗口连接,而无需进行任何密钥管理或安装任何浏览器插件。WordPress 管理员密码存储在 ~bitnami 目录中的文件 bitnami_application_password 中 (以下图片显示的是一个虚构密码):

您可以为终端窗口创建书签,以便于以后只点击一两次便可进行访问。

我可以从菜单栏中管理我的实例:

例如,我可以访问我的实例的性能指标:

而且我可以管理我的防火墙设置:

我可以使用快照捕获我的实例的状态:

稍后,我可以将快照恢复到一个新实例中:

我还可以创建静态 IP 地址和使用域名:

高级 Lightsail – API 和 VPC 对等

在结束之前,我们来讨论 Amazon Lightsail 的一些更高级的功能 – API 和 VPC 对等。

差不多和 AWS 的情况一样,我们刚刚查看的所有控制台功能的背后有一整组 API。以下是一些更为有趣的功能示例:

  • GetBundles – 获取捆绑包 (计算机配置) 列表。
  • CreateInstances – 创建一个或多个 Lightsail 实例。
  • GetInstances – 获取所有 Lightsail 实例列表。
  • GetInstance – 获取有关特定实例的信息。
  • CreateInstanceSnapshot – 创建某实例的快照。
  • CreateInstanceFromSnapshot – 通过快照创建一个实例。

一个帐户内的所有 Lightsail 实例都在 AWS 管理控制台中不可见的“影子”VPC 内运行。如果您在 Lightsail 实例上运行的代码需要访问其他 AWS 资源,您可以在您的帐户中的影子 VPC 与另一个影子 VPC 之间设置 VPC 对等,并在其中创建资源。点击 Account (右上角),向下滚动至 Advanced features,并选中 VPC peering

现在您可以将您的 Lightsail 应用连接到 VPC 内运行的其他 AWS 资源。

定价和可用性

目前我们正在美国东部 (北弗吉尼亚) 区域推出 Amazon Lightsail,并计划在近期将其扩展至其他区域。

起价为每月 5 美元。

-Jeff

原文链接:https://aws.amazon.com/cn/blogs/aws/amazon-lightsail-the-power-of-aws-the-simplicity-of-a-vps/

实力省钱,总有一款适合您

众所周知,Amazon EC2 有多种经过优化的实例种类及付费模式供选择。那么每一类实例的价格优势在哪里?计费有什么不同?哪一种计费模式在满足业务需求的同时更节省成本呢?今天我们就来八卦一下

按需实例

这是AWS最基本最朴实的经典款,计费模式简单明了,用多少付多少。价格公道,童叟无欺。

预留实例

地地道道的“经济适用型”,只选对的,不选贵的!

不差钱儿,钱也要花的漂亮不是~

相比较按需实例,预留实例有两个明显的优势:1.预留容量 2. 价格折扣,最高可节省 75%。

你可以把它理解为包年模式的按需实例,有1年期或3年期。

付款方式有三种:No Upfront、Partial Upfront、All Upfront

No upfront: 不需要任何预付款,按月支付,每小时的价格低于按需的费率30%左右

Partial Upfront:下单的时候先付一部分费用,剩下的费用分摊12个月里,每月支付

All Upfront:一次付完一年的费用,每月无需再付

竞价实例

除了以上两种实例,今天给您介绍的是另一款比预留实例更优惠的实例类型,绝对有竞争力!与按需实例的价格相比,这类实例最多可以为您节省 90% 的成本呢。它就是竞价实例!听这名字,立刻就能想到竟拍,恩,想象力不错,是这么回事儿,价高者得!咦,说好的省钱呢?价高者得?我四不四傻?……囧一个……听我细细道来哈,真相是酱式儿滴…

啥是竞价实例?

首先聊聊啥是竞价实例。想象一下,Amazon有个很大的池子,把闲置的资源以远远低于按需实例的价格投入市场(请注意,竞价实例的价格是不固定的,Amazon EC2根据市场的供求关系定价,每小时价格随着市场供需变化波动)。由于定价较低,大家都抢着买,给谁用不给谁用呢。游戏规则就出来了:竞价!所以它的名字由此而生。

竞拍价格游戏规则

卖方:Amazon EC2根据市场供需定价(请注意,价格像波浪一样随时变化)

买方:出价(您愿意为实例出多少钱您自己定,但请求一旦提交,出价不能更改)

计费规则

如果您的出价高于现价,您的竞价型实例就会运行。所谓价“高”者“得”,您以高于其他竞争者的出价获得启动实例的机会,但实际不一定是以您出的价格收费,而是按照低于或等于您出价的当时的市场价格计费。很划算吧?当然啦,为了保护所有买方免于产生额外费用,竞价型实例的出价限制为按需价格的十倍。

由于这种实例的特点是根据需求的变化,每小时价格都在波动。因此当您使用竞价型实例时,您必须做好应对中断的准备(建议您不要为不能中断的应用程序使用竞价型实例)。

当现货价格上涨超过了您的出价或闲置的EC2实例供应减少时, Amazon 将终止您的竞价实例收回资源。在实例终止时,Amazon EC2会提前两分钟发出警告通知您。

如果您需要保证在一定的时间内使用这个实例,您可以选择创建带有指定持续时间的竞价型实例。当市场价格发生更改时,您的这些实例不会终止。不过这样一来,每小时的价格会比竞价实例的每小时价格要高。

竞价型实例运行方式及生命旅程

要想使用竞价实例,您需要创建一个竞价型实例请求,其中包括您需要的实例类型、实例数量、可用区以及您的出价。(请注意:提交请求之后,您无法更改竞价请求的参数,包括出价),同时选择请求类型,一次性或持久性?如果是持久性请求,竞价型实例终止之后会重新打开请求,再次加入下一轮竞价。

举个栗子,小编打算在俄勒冈区域的某个可用区购买一个m4.large的竞价实例

辣嚒,首先小编需要从 Amazon EC2 控制台或describe-spot-price-history 命令 (AWS CLI)查看近期的现货价格历史记录(最多可查看近三个月的现货价格历史记录)。小编查看了最近一周这个实例的市场价格,以帮助小编举牌。知己知彼,百战不殆嘛!

从上图可以看出,最近一周的价格波动区间是$0.1478/小时-$0.163/小时, 也可以选择在一天的范围内查看)。思来想去,小编决定最高出价$0.155/小时,好,准备举牌了!

一个小时……两个小时……小编的请求没被接受,此时的请求状态是Open,处于等待执行状态。因为目前的市场价格是$0.160,而小编出的最高价格$0.155低于目前的现货价格。

两个小时后,市场价格降到$0.155啦。嗯,机会来了。小编暗喜。高兴的有点儿早哎,这个时候,只能说有机会,但不能肯定这个实例一定被小编买到。果真,被隔壁老王抢了机会…… 继续等待。

再等等,一个小时后,现货价格降到$0.150。这时候低于小编的最高出价,请求生效,实例立刻启起来,第一个小时的价格$0.150 。

又两个小时过去了……市场价格涨到$0.152,但这个价格仍然低于小编的最高价。现在需要按照新的市场价格$0.152付费。

一个小时后,市场价格涨到了最高价$0.155,跟上面的情况一样,小编的实例不确定会不会被终止。由根据供求情况决定,假设没有出现意外,继续运行,现在这一小时按照$0.155收费。

又过了十个小时,现货价格涨到$0.158,高于小编出的最高价$0.155,Amazon EC2收回了容量终止了小编的实例。由于小编的竞价型实例在运行小时的中间被Amazon EC2中断,则小编无需为中断的不足 1 个小时部分付费。 当然了,如果是小编在实例运行小时的中间主动中断了竞价型实例,则需要为该小时付费。

现在是不是对竞价实例有了一点点了解?这里讲到的只是其中小小一部分啦,更多精彩的内容,请参看以下文档。小编最想说的是,不管是按需、预留还是竞价实例,每一种都有自己的优势,选择最适合的,灵活地为您的应用程序选择适当的价格组合,更好的优化成本才是目的。

相关参考链接:

https://aws.amazon.com/cn/ec2/spot/

http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/using-spot-instances.html

 

作者介绍:

郭雯,亚马逊AWS CS Concierge专员,负责AWS企业级支持服务客户的成本、账单和帐户等非技术问题的解答。

 

如何在1个小时之内轻松构建一个Serverless 实时数据分析平台

数据分析平台,特别是实时数据分析,正在被越来越广泛的应用于各个行业。 举例来说,游戏公司在发布新游戏之后,需要实时定位用户的留存、增长等情况;快销公司需要精确地记录每一笔订单的情详情,并结合社交媒体,实时分析促销活动引起的用户购买行为与销量等等。基于这些需求, AWS提供了一整套成熟的解决方案与服务,并且得到了广泛的应用。

图1 AWS大数据参考架构示例

上图中,Amazon Kinesis 是实时的流式分析服务,而Amazon S3是AWS的海量数据存储服务。利用Kinesis与S3,我们可以十分方便的构建一个实时流式信息数据的采集与存储。 值得注意的是,作为Serverless计算服务的代表 , 用户只需要编写实现对应的ETL逻辑,Amazon Lambda就可以非常方便地对Kinesis流式数据进行抽取与分析而不需要部署任何服务器。另外,用户也可以使用Kinesis Firehose(Kinsis服务之一)实现原始数据的直接注入与收集。

随着Amazon Athena在AWS re:Invent 2016的重磅发布,AWS的大数据平台又增添了重要的一员!Amazon Athena 是一种交互式查询服务,用户可以使用标准SQL 分析 Amazon S3 中的数据。因为Athena底层是基于Serverless(无服务器)架构,用户不需要运维底层的服务器,并且查询处理能力会随着用户的数据将进行自适应与扩展,实现秒级别的数据查询与处理。

闲话少说,我们将利用AWS提供的三个重要服务——Amazon Kinesis Firehose,、Lambda和Athena在1个小时之内实现一套实时分析的Serverless数据分析平台!

准备好了吗?Let’s rock

1.数据源。作为测试,我们将对AWS VPC Flow Logs进行分析。您可以使用Kinesis Agent/Flume/Fluentd或者Amazon Kinesis SDK对前端的实时日志进行分析。Amazon VPC Flow Logs将实时记录VPC监控的网络端口的流量与通信日志,并将日志发布于AWS CloudWatch Logs。详细的配置请参见 https://aws.amazon.com/cn/blogs/aws/vpc-flow-logs-log-and-view-network-traffic-flows/

2.数据ETL。VPC Flow Logs进入CloudWatch Logs之后,可以利用Lambda对实时日志进行订阅处理。订阅之后,Lambda会在CloudWatch Logs更新之后,自动调用执行,进行数据ETL。

首先,在控制台创建一个Lambda函数(利用Python实现).为了确保Lambda有对应的执行权限,需要赋予Lambda函数相应的Permission Role.在这个示例中,我们只需要服务Lambda对应的CloudWatch Logs以及Kinesis Firehose的权限即可。

其次,Lambda 代码会对进入的CloudWatch日志的第一个Base64编码的转码并进行gzip解压(因为Cloudwatch Logs会对送往Lambda首先进行Base64编码并进行gzip压缩)。之后,Lambda会对具体的日志进行汇聚,以batch的方式发送给Kinesis Firehose。具体的代码如下:

代码中,利用环境变量 DELIVER_STREAM_NAME 传递Kinesis Firehose Stream,详见步骤3)。

最后,利用AWS CloudWatch logs的订阅功能,就可以实时地把日志发布到Lambda函数中了。

aws logs put-subscription-filter \

    --log-group-name myLogGroup \

    --filter-name demo \

    --filter-pattern "" \

    --destination-arn arn:aws:lambda:us-east-1:123456789123:function:helloworld\

具体的配置过程可以参考 http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/logs/Subscriptions.html

3.创建Kinesis Fireshose实现到S3的数据自动存储与汇聚。Kinesis Firehose提供了自动对数据进行汇聚,目前支持S3和Redshift, ElastiSearh。这里,我们利用控制台,十分简单地创建了如下一个Firehose Stream:

图2 Kinesis Firehose 配置过程

4.利用Amazon Athena进行数据查询。因为Athena底层是基于Hive Catalog对S3数据进行管理,上层基于Presto的方式进行SQL查询。因此我们首先需要使用Hive对S3的VPC Flow Logs进行外表DDL操作。具体代码如下:

我们在创建表的过程中,创建了 Year,Month, Day 与Hour的分区,是因为我们在实现Firehose的时候自动进行了时间和日期的前缀设置。同时,利用分区也可以大大提高hive的数据查询性能。

到这里,整个Serverless 处理能力自适应的架构已经构建完成,来测试一下Athena的查询结果吧。 Athena提供了Web Console让BI用户可以直接对S3数据湖进行查询,同时,用户也可以利用JDBC直接与第三方的BI工具集成实现自动化查询。查询结果也可以利用CSV的文件下载的方式直接分享给其他用户。

图3 利用Web Console对Athena进行数据分析

作者介绍:

肖凌

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内和全球的应用和推广,在大规模并发后台架构、跨境电商应用、社交媒体分享 、Hadoop大数据架构以及数据仓库等方面有着广泛的设计和实践经验。在加入AWS之前曾长期从事移动端嵌入式系统开发,IBM服务器开发工程师。并负责IBM亚太地区企业级高端存储产品支持团队,对基于企业存储应用的高可用存储架构和方案有深入的研究。

 

 

 

AWS Limit Monitoring ——书到用时方恨少,资源提限需趁早!

如何在AWS产品将要达到限额的时候得到通知,确保可以提前做好提升限额的准备?

Trusted Advisor (TA) 可以基于区域提供使用资源的限额以及用量,与此同时AWS 可以基于TA 监测的指标信息,当使用量达到产品限额的80%时触发邮件通知用户指定的邮箱。

工作原理

该解决方案使用AWS Lambda 自动检测服务用量以及限额并计算使用占比,当使用占比达到80%时,Lambda 将触发一个Amazon Simple Notification Service 主题 (Amazon SNS),为预先设定好的邮箱(邮箱组)发邮件通知。

监测本帐户限额(设置时间:大约5分钟)

1.点击以下AWS官方文档中的“Launch Solution”按钮:http://docs.aws.amazon.com/solutions/latest/limit-monitor/deployment.html

默认指向美东区域。一旦您在美东区域完成部署之后,AWS Limit Monitoring将为您监测当前设置账户在各个区域的使用情况。

2.系统自动生成S3 的URL,无需进行其它操作,点击下一步。

3.指定待监测的AWS帐户ID、通知邮箱(组)等参数,进入下一步。

4.检查确认参数正确后完成创建。

监测其他帐户限额

您也可以利用这种方式监控其他帐户限额,只需要在每个被监控的帐户中创建一个IAM角色,并赋予其权限,允许其通过跨帐户角色进行API 操作,获取被监测帐户的资源使用限额信息即可。

*注[1]:如果创建堆栈过程中设置多个账户,需要分别对除了设置账户之外的其他账户进行如上操作。

*注[2]:被监控帐户注册商用级别或企业级别支持服务适用此方式。

步骤一:创建IAM 角色

1.登陆被监控的账户,创建一个IAM role

2.为该IAM role 命名为- LimitCheckRole

3.选择IAM role 的类型为跨账户角色

4.输入创建堆栈中设置的账户的12 位账户 ID

步骤二:为创建的IAM 角色赋予三个权限:

1.为该IAM 角色分别赋予ReadOnlyAccess

2.为该IAM 角色分别赋予AWSSupportAccess

3.创建自定义Policy:

3.1 点击创建policy

3.2选择自定义policy

3.3将以下政策粘贴在政策正文,为当前policy 命名,点击validate policy,验证成功之后,点击create policy。

{

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

    "Statement": [

        {

            "Sid": "Stmt1455149881000",

            "Effect": "Allow",

            "Action": [

                "cloudformation:DescribeAccountLimits",

                "dynamodb:DescribeLimits"

            ],

            "Resource": [

                "*"

            ]

        }

    ]

3.4返回创建的IAM 角色LimitCheckRole

3.5赋予刚刚创建的自定义policy

当某个产品用量达到限额80%的情况下,设置的邮箱将收到以下提醒信息:

届时您可以通过开启案例进行该项产品的限额提升。

常见问题

Q: 为什么我需要关注追踪我的产品限额?

A: 通过追踪关注产品限额,可以及时了解自己的产品是否达到了当前限额,可以进行提前规划部署。

Q: Limit monitoring 可以监控哪些产品的限额?

A:

  • Amazon Elastic Compute Cloud(Amazon EC2)
  • Amazon Elastic Block Store (Amazon EBS)
  • Amazon Relational Database Service(Amazon RDS)
  • Amazon Simple Email Service (Amazon SES)
  • Amazon Virtual Private Cloud( Amazon VPC)
  • Auto Scaling
  • Elastic Load Balancing (ELB)
  • Identity and Access Management (IAM)

Q: AWS Limit Monitor可以同时查询多个账户的的指标么?

A: 可以,您在设置limit monitoring 过程中设置多个账户,并未每一个额外的账户赋予相应的IAM权限之后,即可对多个账户进行限额监控。

每一个监控的账户需要订阅商用/企业付费支持。

Q: 我可以在哪些区域使用该功能?

A:目前北京区域不适用。

对于海外账户,建议您在美东(US East)区域进行部署,即可实现对账户任意区域资源限额的监控。

参考指南

http://docs.aws.amazon.com/solutions/latest/limit-monitor/overview.html

https://aws.amazon.com/answers/account-management/limit-monitor/

https://aws.amazon.com/premiumsupport/ta-faqs/

作者介绍

李金萍

亚马逊AWS CS Concierge专员,负责AWS企业级支持服务客户的成本、账单和帐户等非技术问题的解答。

Amazon Polly – 支持47种语音与24种语言的文本到语音转换服务

在准备写下这篇文章时,我的思绪不禁回到了自己的孩提时代(那时候大部分时间都用在了看电视上)。上世纪六十到七十年代,出现了大批热门的计算机与机器人语音产品。一瞬间,哈尔-9000、B9(来自〈迷失太空〉)、初代《星际旅行》中的计算机以及罗茜(来自〈摩登家庭〉)等形象再次涌现在我眼前。那个时候,人们都热衷于这种机械生成的语音——声音精准、清晰且缺乏人类应有的情感。

时间快速推进,如今我们已经拥有大量出色的计算机生成语音应用及用例可供选择,业界将其称为文本到语音或者简称TTS功能。娱乐、游戏、公共发布系统、电子学习、电话、辅助应用及设备乃至个人助手都已经开始将其引入。其中大部分应用能够很好地对接移动环境,但本地处理及存储型方案则表现平平。

你好, Polly

为了解决此类用例的实际需求(当然也包括其它大家能够想到的场景),我们推出了Polly,这项云服务能够将文本转化为逼真的语音,并允许大家将其用于您的工具及应用程序当中。Polly目前支持总计47种男声/女声表达并涵盖24种语言(暂不支持中文),而更多语言及语音选项亦在路线图规划之中。

Polly的设计目标在于解决语音生成工作中的大部分常见挑战。举例来说,我们以“live”一词为例,“I live in Seattle”代表我生活在西雅图,而“Live from New York”则代表由纽约发回的现场直播,二者在意义上显然存在差别。Polly能够理解这种同一词汇在不同语境下的含义,并给出完全不同的发音。类似的例子还有“St.”。根据语言类别及上下文背景的不同,其可以代表(或者应该发音为)“Street(街道)”或者“saint(圣)”。Polly同样能够准确识别二者间的差别。另外,Polly亦能够处理单位、分数、缩写、货币、日期、时间以及其它复杂的语言成分与表达方式。

为了实现这一目标,我们与以Polly支持的目标语言为母语的语言专家们进行合作。我们要求每位参与者利用其选定的语种提供大量单词与短语发音,并将音频拆分为声音单元,即双音素。

Polly在处理普通文本时拥有良好表现。大家只需要提交文本,Polly即可顺利完成接下来的工作,即以音频文件或者流媒体的方式给出精准、自然且与人类相似的语音表达。对于其它更为复杂的应用,大家可以使用SSML(即语音合成标记语言)为Polly提供更多附加信息。举例来说,如果您的文本内容中包含多种语言(例如英语与法语混杂),则可利用SSML作出标记以纠正发音。

在本文中我无法直接提供相关语音片段,因此感兴趣的朋友可以直接访问Polly Consolehttps://console.aws.amazon.com/polly)并亲自加以尝试。大家只需要输入文本内容并点击Listen to speech(听取语音)即可:

大家也可以将生成的音频保存在MP3文件并将其运用于您的应用程序当中。

以下为完全展开的语言与地区菜单:

技术细节

通过Console使用Polly当然非常便利,不过大家也可以采取其它方式以实现更具动态的使用途径。大家可以在文本或者SSML当中调用SynthesizeSpeech API函数。大家可以直接将输出结果以流媒体形式直接交付至用户,或者生成MP3或Ogg文件以备需要时播放。Polly能够以MP3或者Vorbis格式生成高质量(最高采样率为22 kHz)音频,亦可以PCM格式生成电话质量级(8 kHz)音频。

大家也可以利用AWS命令行界面(CLI)生成音频。例如:

Polly会对全部闲置数据进行加密,并通过SSL连接进行音频传输。所提交文本与提交者间的关联将被移除,以加密形式存储最多6个月,并被用于维护及改进Polly功能。

价格与上线时间

大家每月可以利用Polly处理500万字而无需支付任何费用。在此之后,每个字的处理价格为0.000004美元,或者折合为音频生成约为每分钟0.004美元。本篇博文的语音转换价格约为0.018美元,而《哈克贝利-费恩历险记》全文的语音转换亦仅需约2.4美元。

Polly目前已经在美国东部(北弗吉尼亚州)、美国西部(俄勒冈州)、美国东部(俄亥俄州)以及欧洲(爱尔兰)服务区上线,大家可以从今天开始加以使用。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/polly-text-to-speech-in-47-voices-and-24-languages/

 

开发者预览版——EC2实例(F1)携手可编程硬件

你是否曾经在通用型工具与专用型工具之间左右为难?通用型工具可以解决多种不同的难题,但却未必是特定问题的最佳解决选项。相反,专用型工具擅长处理特定问题,但工具的使用频率往往不会很高。

工程师们在设计架构及指令集时同样需要考虑这一问题。他们始终追求能在更加通用的工作负载范围内,提供更佳性能表现的解决方案。然而新型工作负载与工作条件不断涌现,只有定制化硬件才是性能最佳之选。这就要求我们在其中找到平衡点:是要极出色的性能水平,还是要保证以年甚至季度为周期进行衡量的开发生命周期?

走入FPGA时代

作为一种备受瞩目的解决方案,我们迎来了基于定制化硬件的现场可编程门阵列机制,或者简称为FPGA。相较于单纯着眼于一种特定功能的专用型芯片,FPGA拥有更为出色的灵活性。其能够在现场完成编程,而后再接入PC主板的插槽当中。每块FPGA中包含一组固定且数量可观的简单逻辑门。对FPGA进行编程“基本上”就是将这些逻辑门彼此对接,从而建立起必要的逻辑功能(包括AND、OR以及XOR等等)或者存储元素(触发器与移位寄存器)。不同于CPU的串行本质(即数个并行元素)以及固定大小的指令集与数据路径(通常为32位或64位),FPGA能够以编程方式并行执行更多操作,而这些操作本身几乎不设任何宽度或者规模限制。

这种高并行模式非常适合用于构建定制化加速器,从而处理计算密集型工作负载。在经过有针对性的编程之后,FPGA能够在基因组学、抗震分析、金融网络分析、大数据搜索以及加密算法及应用领域提供高达30倍的速度增量。

希望这些优势能够鼓励大家尝试利用FPGA加速您的应用程序!不过必须承认,要实现这样的效果,我们还需要克服一系列挑战。首先,FPGA从传统角度讲属于大规模专用型系统的一类组件。大家无法单纯购买一款并将其接入自己的台式机。相反,实现FPGA型解决方案要求我们完成硬件原型设计、硬件设备构建、大规模生产以及漫长的销售与部署周期等筹备工作。漫长的实现时间会限制FPGA的适用性,这也意味着摩尔定律指导下的CPU类解决方案也许更具成本效益。

但我们相信,我们能够在这方面做得更好!

全新F1实例

现在,我们发布了全新F1实例的开发者预览版。除了构建应用及服务供您自己使用之外,大家也可以将其进行打包并在AWS Marketplace中出售并进行复用。总体而言,大家将能够避免使用FPGA支持型解决方案所带来的高昂资本投入与时间消耗,我们提供的方案将带来与其它类型软件相同的商业模式。大家将能够通过云工具设计您自己的逻辑、模拟方案以及验证流程,而后在数天之内将其推向市场。

F1实例配备有英特尔Broadwell E5 2686 v4处理器(基本速度为2.3 GHz,Turbo模式下全核心可达2.7 GHz,Turbo模式下单核最高可达3.0 GHz),最多976 GiB内存、最高4 TB NVMe SSD存储以及一到八块FPGA,这意味着其能够为大家提供充足的资源以构建自己的核心FPGA逻辑。各FPGA专用于此实例,且以隔离方式确保在多租户环境下的不致相互影响。

下在来看该FPGA的具体规格(请注意,单一F1实例中最多可使用八块FPGA):

  • Xilinx UltraScale+ VU9P,采用16纳米制程工艺制造。
  • 64 GiB ECC保护内存,配合288位总线(四DDR4通道)
  • 专用PCIe x 16 CPU接口
  • 约250万逻辑元素
  • 约6800套数字信号处理(简称DSP)引擎
  • 提供虚拟JTAG接口用于调试

在包含超过一块FPGA的实例当中,专用PCIe架构允许各FPGA共享同一套内存寻址空间并通过PCIe Fabric以最高每秒12 GB的单工速率实现彼此通信。单一实例中的各FPGA共同接入一套400 Gbps双向环状结构以实现低延迟水平与高传输带宽(大家需要定义自有协议以使用这项高级功能)。

FPGA开发流程

作为这套开发者预览版中的组成部分,我们还提供FPGA开发者AMI。大家可以在内存优化型或者计算优化型实例当中启动该AMI,从而实现开发与模拟,而后利用F1实例进行最终调试及测试。

此AMI包含多款开发者工具,大家可以在AWS Cloud当中免费加以使用。您需要使用VHDL或者Verilog编写FPGA代码,而后利用Xilinx Vivado设计套件(当然也可以使用第三方模拟工具、高级语言编译器、图形编程工具以及FPGA IP库)对代码进行编译、模拟与验证。

下面来看一段简单8位计数器的Verilog代码示例:

虽然这些语言常被描述为使用类C语法,但这并不代表大家可以直接使用现有代码并通过重新编译将其应用于FPGA当中。相反,大家需要首先对FPGA编程模式进行深入了解,学习布尔代数,而后掌握传播延迟与时钟脉冲边沿等概念。在此基础之上,大家才能够开始考虑将FPGA引入您的业务环境。如果这些底层知识对您来说太过艰深,大家亦可使用各类现有高级综合工具,包括OpenCL等,进行FPGA编程。

在启动自己的实例后,我进行登录、安装多款软件包并设置许可管理器,而后即可运行Vivado工具。接下来,我RDP到桌面,打开一个终端窗口并以GUI模式启动Vivado:

我随后打开该示例项目(counter.xpr),这就是我初次尝试后的FPGA设计与开发成果:

在一番探索之后,我了解了如何建立自己的首个FPGA(其实我基本上就是到处点点并了解其作用; 我本人在这方面甚至连新手都算不上):

从这里开始,我可以测试自己的设计并将其打包为Amazon FPGA镜像(简称AFI),而后将其运用在自有应用或者发布至AWS Marketplace当中。我还将继续摸索,希望能用几周时间弄清一切并向大家汇报。

F1硬件开发工具包

在了解了F1实例之后,我的第一个问题是如何处理FPGA、CPU以及主内存之间的接口。F1硬件开发工具包(简称HDK)当中包含多款预配置I/O接口及示例应用,适用于包括主机到FPGA、FPGA到内存以及FPGA到FPGA等的多种通信方法。其还提供编译脚本、参考示例以及一套现场调试工具。这套工具包可供F1开发者预览版的各位用户随意使用。

总结评述

总体来讲,F1实例、云开发工具与相关功能的结合共同实现了独特且强大的FPGA型应用方案。FPGA模式的强大性能及灵活性如今已经可供每位AWS用户使用; 可以肯定,这将激发出前所未有的应用方式与企业业务实现途径。

预览版现已上线!

正如之前提到,全新 F1实例现已在美国东部(北弗吉尼亚州)区域推出开发者预览版(我们还将在2017年年初将该实例的正式版本推向其它服务区)。如果大家此前拥有FPGA编程经验并对F1实例很感兴趣,请访问:

https://aws.amazon.com/ec2/instance-types/f1/

马上报名加入。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/developer-preview-ec2-instances-f1-with-programmable-hardware/

 

Amazon Lex – 构建对话语音与文本界面

尽管能够“说话”的计算机确实令人振奋,但学会了倾听与回应的计算机无疑更加出色!如果大家曾经使用过Amazon Echo,一定体会过在Alexa服务支持下的交互模式是多么简单、实用和强大。

今天,我们利用与Amazon Alexa相同的深度学习技术(ASR,即自动语音识别;NLU,自然语言理解),为大家带来能够在您的对话应用程序内生效的新服务。大家可以利用Amazon Lex服务构建聊天机器人及其它类型的Web与移动应用程序,其将带来逼真的对话交互能力。您的聊天机器人能够提供信息、支持应用程序、简化工作行为,或者为其它机器人、无人机乃至玩具提供控制机制。

Amazon Lex的设计目标在于帮助大家快速实现上述目标。大家首先可在Lex Console中设计您的对话,即为Lex提供某些示例性短语以构建自然语言模型。在此之后,您即可公布自己的Amazon Lex机器人并利用其处理来自您用户的文本或者语音对话内容。Amazon Lex是一项全托管服务,因此大家无需为其配套基础设施的设置、管理或者规模伸缩而费心。

您的聊天机器人目前可接入Facebook Messenger; 面向Slack与Twilio的整合工作正在进行当中。在AWS方面,Amazon Lex可与AWS Lambda、AWS Mobile Hub以及Amazon CloudWatch进行协作。您也可在代码中使用Amazon DynamoDB、Amazon Cognito以及其它服务。

Amazon Lex允许大家利用AWS Lambda函数以实现聊天机器人的业务逻辑,其中包括接入您的企业应用及数据。配合刚刚公布的、适配于AWS Mobile Hub的SaaS集成能力,大家可以使用自己构建的企业生产力机器人为客户、联系人、领导层,以及存储于其它SaaS应用程序内的企业数据提供对话界面。

综合上述内容,大家现在能够利用全部相关组件来构建全面集成化解决方案。Amazon Lex可由移动应用为起点,并可逐步推进至逻辑实现层面。

Amazon Lex概念

下面我们将对Amazon Lex的各项基本概念加以阐述:

机器人 –  一个包含了所有对话组件的聊天机器人。

意图 –  意图代表使用这个机器人的用户所希望达成的目标(包括购买机票、安排预约或者获取天气预报信息等)。

话语 –  话语指的是以语音或者文本形式表达的短语。每个话语会调用一项意图。“我想预订酒店”或者“我想预订鲜花”就是两条简单的话语。

槽位 – 每个槽位代表着满足用户意图所对应的数据片段。槽位内容拥有具体类别; 差旅机器人一般使用的槽位包括城市、州或者机场。

提示 –  提示表现为问题,用于要求用户提供某些数据(以填充槽位)来表述其意图。

实现 –  实现代表的是能够达成用户意图的业务逻辑。Lex支持利用Lambda函数作为实现手段。

机器人、意图以及槽位具备版本控制机制,因此大家可以在多开发者环境当中,在诸如开发、测试、分段以及生产等流程间设定明确的边界。大家可以为机器人创建多种别称,并将其映射至各组件的特定版本当中。

构建一套机器人

大家可以通过Lex Console定义Lex机器人并为其设置全部组件。作为起步,大家可以首先使用我们提供的样例或者直接创建您理想中的定制化机器人:

您可在下一页面中定义您的话语及其配套槽位:

而后利用以下设置对机器人进行自定义:

您可以通过交互进行机器人测试并随时调整,直到其反应与预期相符:

此后,您可以生成一条回调URL以将其应用在Facebook(或者其它支持平台)当中:

在本届re: Invent大会结束后,我将拿出更多时间对这项服务的相关细节进行深入阐述。

价格与上线时间

Amazon Lex目前已经在美国东部(北弗吉尼亚州)服务区提供预览版本,大家可以马上开始利用其构建自己的对话应用!

在登录之后,您每月可以发出1万条文本请求与5千条语音请求,且首年之内无需支付任何费用。在此之后,每1千条语音请求收费4美元,而每1千条文本请求收费0.75美元。

-Jeff

原文链接:

https://aws.amazon.com/cn/blogs/aws/amazon-lex-build-conversational-voice-text-interfaces/