代码改变世界

serverless 项目配置及创建helloworld应用(二)

2019-06-26 21:58  龙恩0707  阅读(4263)  评论(0编辑  收藏  举报

阅读目录

一:学习使用AWS Lambda来作为服务器引擎

在开发应用中,我们一般采用 AWS Lambda 来作为 Serverless服务背后的计算引擎。AWS Lambda 是一种函数即服务的计算服务,简单的来说就是开发人员可以直接编写运行在云上的函数,功能及服务,由云服务器供应商提供操作系统、运行环境、网关等一系列的基础环境。我们只需要编写我们的业务代码即可。
我们不需要考虑可扩展、部署等一系列的问题,Amazon运维工程师已经帮助我们打造了一系列的基础设施。并且它是按流量收钱的。

1. AWS Lambda 是如何收费的?

我们知道AWS Lambda 是按流量来收费的,如果没有使用流量是不需要钱的,那么它是怎么样来收费的呢?如果想对一个运行的函数收费,那肯定会考虑这几个方面,运行时间、CPU、内存占用、硬盘等几个主要条件。那么对于应用程序代码来讲,一个应用占用的硬盘空间我们可以忽略不计。
因此AWS会采用的是 运行时间 + 内存的计算方式来计算收费的。

内存(MB)            每个月的免费套餐秒数                  每100ms的价格(USD)

128                  3,200,000                           0.000000208
192                  2,133,333                           0.000000313
256                  1,600,000                           0.000000417
...                  ...                                 ...
1024                 400,000                             0.000001667

如下图所示:

具体可以看下AWS官网收费的 (https://aws.amazon.com/cn/lambda/pricing/)

在运行程序的时候,AWS 会统计出一个时间和内存,如下所示:

REPORT RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d Duration: 2.49 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 20 MB

如下图所示:

Memory Size的含义是:是我们选用的套餐类型。
Duration 的含义是:运行的时间。
Max Memory Used 的含义是:我们应用运行时占用的内存。

因此我们可以根据 Max Memory Used 的数值及应用的计算量,我们可以选择我们需要的套餐。

比如我们现在选用的是1024M的套餐,如果运行了是320次的话,那么一共使用了320G的流量,假如上面我们的程序运行的时间是2.49ms,也会被当做100ms来计算的, 那么假如我们的320次计算一共花了1s的时间,也就是 10 * 100ms,由于1024MB的套餐,每100ms需要 0.000001667 美元,因此我们需要支付的总费用就是 10 * 320 * 0.000001667 = 0.0053344刀,即使转成人民币也就是不到 4 毛钱的 0.03627392。
那么相对来说是非常的便宜了。并且AWS Lambda 每个月也有免费的套餐的。因此在很长的一段时间内,我们的费用是很低的或不需要一分钱。

具体我们可以下AWS官网介绍(https://aws.amazon.com/cn/lambda/pricing/). 如下图所示:

二:使用serverless环境搭建

在实践demo之前,我们需要注册一个AWS账号,AWS提供了一年的免费使用。去官网注册下(https://aws.amazon.com/cn/)如下图所示:

注意:申请过程中,尽量不要绑定真正的信用卡了,具体原因我也不多解释,反正我是不敢绑定真正的信用卡,具体原因看人家怎么说(https://www.v2ex.com/amp/t/433538)。但是我们可以绑定一个 visa 虚拟的信用卡,我特意申请了中国建设银行信用卡,然后办理了一个虚拟信用卡。然后绑定虚拟信用卡,然后AWS会扣1美元来确认你该信用卡是否正确,最后你完成注册,会发4位短信验证码到我们手机上,我拿到验证码是输入,注册就成功了。我们现在就可以使用AWS里面的云服务了。

2.1 安装 serverless

首先我们需要安装serverless框架,如下命令:

npm install -g serverless

如下所示:

2.2 设置AWS凭证

1. 登录AWS账号,然后点击进入IAM,如下图所示:

2. 点击用户,然后添加用户,比如叫 serverless-admin, 并且在 【选择AWS访问类型】里,勾选上 编程访问,如下图所示:

3. 点击 "下一步权限" 按钮,选择 【直接附加现有策略】,勾选 AdministratorAccess, 然后创建用户。如下图所示:

注意:AdministratorAccess 权限,所以尽量不要泄漏你的密钥出去。

如下我们需要添加新密钥和密钥值,如下所示:

我们需要输入一个密钥和值即可。然后继续下一步等操作后,最后我们会出现如下的页面,从下面我们可以看到,我们可以看到我们当前的用户,访问密钥ID, 私有访问密钥等信息,如下图所示:

最后我们可以导出证书后,我们需要保存好证书即可。接着我们使用官方的命令,将会自动生成配置到 ~/.aws/credentials

如下命令:

serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

--key:应该就是我们刚刚生成的 "访问密钥 ID".
--secret: 就是我们的 “私有访问密钥”。

可以对应的我们如下图所示的"访问密钥 ID" 和 "私有访问密钥":

然后我们可以在命令中使用命令后,会自动生成配置到  ~/.aws/credentials, 如下所示:

三:创建我们的第一个应用,hello world 服务

 使用命令如下所示:
serverless create --template aws-nodejs --path hello-world

如下图所示:

因此在我项目目录下,会生成 hello-world 文件夹,该文件夹包含两个文件:handler.js 和 serverless.yml。 如下图所示:

1. .gitignore 代码如下:

# package directories
node_modules
jspm_packages

# Serverless directories
.serverless

.gitignore里面有3个忽略项,分别如下:
node_modules, 是Node.js包管理安装后的目录。
jspm_packages: jspm是javascript包管理器,它是基于 SystemJS这种通用模块加载器之上的包管理器。
.serverless: 它是一个serverless部署时的打包生成目录,当我们执行 serverless deploy 时才会生成。

2. handler.js 代码如下:

'use strict';

module.exports.hello = async (event) => {
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }, null, 2),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

handler.js 是通过如上命令 serverless create --template aws-nodejs --path hello-world 中的 --template aws-nodejs 参数生成出来的js文件,如上hello函数代码就是返回一个json文件。

3. serverless.yml 的内容如下:

service: hello-world 

provider:
  name: aws
  runtime: nodejs10.x

functions:
  hello:
    handler: handler.hello

该文件是serverless的描述文件,服务名为:hello-world, 服务器提供商为:aws, 运行环境为:nodejs10.x

functions:
  hello:

这样的,如上hello是调用时的名称。如代码:serverless invoke -f hello -l 这样的语法来触发hello函数。如果我们的hello改成 helloxxx, 那么我们调用的函数命令就变成:serverless invoke -f helloxxx -l

functions:
  hello:
    handler: handler.hello

如上代码:handler: 是不能乱改的。handler.hello 这个的含义:点号(.)前面的handler是文件名,也就是我们说的 handler.js,点号后面的 hello 是默认的函数名,也就是说我们的 handler.js中的 module.exports.hello 这个导出的函数名。如果我们现在把handler.js 重命名为 handler2.js 的话,那么我们需要把 serverless.yml里面的内容改成:handler: handler2.hello.  同理如果我们把handler.js中的hello函数改成其他名称的话,那么serverless.yml的调用名也要改了。

4. 部署 hello-world

使用如下命令:

serverless deploy -v

注意:-v 不是显示版本,而是 --verbose 详细信息

在如上命令运行后,我们打印的日志如下:

如上命令,当我们执行 serverless deploy 命令之后就会变成如下目录:

|----- hello-world
|  |--- .serverless
|  | |--- cloudformation-template-create-stack.json
|  | |--- cloudformation-template-update-stack.json
|  | |--- hello-world.zip
|  | |--- serverless-state.json
|  |--- .gitignore
|  |--- handler.js
|  |--- serverless.yml

如下所示:

hello-world.zip 是项目代码文件打包后的压缩文件。
serverless-state.json 是服务部署后的信息,包含服务名称,服务提供商等信息。

5. 调用服务

然后我们需要通过如下命令来触发下该函数,命令如下所示:

serverless invoke -f hello -l

运行命令后如下所示:

然后我们服务器会返回如上结果,如上返回的结果就是我们项目下的 handler.js 中的hello函数返回的代码。也就意味着,我们的第一个服务已经成功上线了。

如上命令解释:

invoke 是调用服务的意思。
-f 是表示 function 名的含义
-l 是表示log(日志)的含义

如上 serverless 我们也可以写成它的缩写形式 sls,

-d 表示传入的data(数据)

更多的 invoke 解释,我们只需要使用命令: sls invoke -h 查看即可: