serverless 项目配置及创建helloworld应用(二)
2019-06-26 21:58 龙恩0707 阅读(4303) 评论(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 查看即可: