Serverless 应用开发指南:serverless 的 hello, world
在翻译了几篇 serverless 与物联网相关的文章之后,我开始想着好好掌握一下 serverless 的相关知识。
我对于 serverless 的第一认知是:Serverless 是由一堆云服务构建后端服务的,如存储、计算、授权都是由不同的服务来构建的。而作为一个开发人员,我们所要做的就是了解如何搭配不同的云服务。
因此,在进行更多的定义之前,我打算先熟悉一下 serverless,以便于我更好地了解什么是 serverless 应用开发。
Serverless 框架 hello, world
考虑到直接使用 aws lambda 编写 serverless,对于我这样的新手相当的有挑战性。于是,我便先选择了 Serverless 框架,GitHub: https://github.com/serverless/serverless。
先让我们按官网的 demo,进行实验。开始之前,除了拥有一台电脑,你还需要有一个 AWS 账号。AWS 提供一年的免费试用,你所需要做的就是办一张支持 visa 的信用卡。
一、安装 serverless 框架
npm install -g serverless
或者,和我一样使用:
yarn global add serverless
二、设置 aws 凭证。
1.登录 AWS 账号,然后点击进入 IAM (即,Identity & Access Management)。
2.点击用户,然后添加用户,如 serveless-admin,并在『选择 AWS 访问类型』里,勾上编程访问。
编程访问 serverless
3.点击下一步权限,选择『直接附加现有策略』,输入AdministratorAccess,然后创建用户。
注意
:由于是 AdministratorAccess 权限,所以不要泄漏你的密钥出去。
- 创建用户。随后,会生成访问密钥 ID 和 私有访问密钥。请妥善保存好。
然后导出证书,并使用 serverless depoy
保存到本地。
export AWS_ACCESS_KEY_ID=<your-key-here>export AWS_SECRET_ACCESS_KEY=<your-secret-key-here>serverless deploy
将会自动生成配置到 ~/.aws/credentials
或者,如官方的示例:
serverless config credentials --provider aws --key AKIAIOSFODNN7EXAMPLE --secret wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
三、创建 hello-world 服务
serverless create --template aws-nodejs --path hello-world
Serverless: Generating boilerplate...Serverless: Generating boilerplate in "/Users/fdhuang/learing/serverless-guide/hello-world" _______ __| _ .-----.----.--.--.-----.----| .-----.-----.-----.| |___| -__| _| | | -__| _| | -__|__ --|__ --||____ |_____|__| ___/|_____|__| |__|_____|_____|_____|| | | The Serverless Application Framework| | serverless.com, v1.23.0 -------'Serverless: Successfully generated boilerplate for template: "aws-nodejs"(play-env)
生成两个文件;
├── handler.js└── serverless.yml
其中的 handler.js 的内容是:
'use strict';module.exports.hello = (event, context, callback) => { const response = { statusCode: 200, body: JSON.stringify({ message: 'Go Serverless v1.0! Your function executed successfully!', input: event, }), }; callback(null, response); // Use this code if you don't use the http event with the LAMBDA-PROXY integration // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });};
而 serverless.yml
的内容,因为注释所有的内容,因此相当于是空的。
四、部署及测试:
$serverless deploy -v
日志如下:
Serverless: Packaging service...Serverless: Excluding development dependencies...Serverless: Uploading CloudFormation file to S3...Serverless: Uploading artifacts...Serverless: Uploading service .zip file to S3 (409 B)...Serverless: Validating template...Serverless: Updating Stack...Serverless: Checking Stack update progress...CloudFormation - UPDATE_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-devCloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroupCloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecutionCloudFormation - CREATE_IN_PROGRESS - AWS::Logs::LogGroup - HelloLogGroupCloudFormation - CREATE_IN_PROGRESS - AWS::IAM::Role - IamRoleLambdaExecutionCloudFormation - CREATE_COMPLETE - AWS::Logs::LogGroup - HelloLogGroupCloudFormation - CREATE_COMPLETE - AWS::IAM::Role - IamRoleLambdaExecutionCloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunctionCloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Function - HelloLambdaFunctionCloudFormation - CREATE_COMPLETE - AWS::Lambda::Function - HelloLambdaFunctionCloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0CloudFormation - CREATE_IN_PROGRESS - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0CloudFormation - CREATE_COMPLETE - AWS::Lambda::Version - HelloLambdaVersionPSzzisjnTvvYknuXwQOlAvdkQZ67qXYSvgoAi9T8W0CloudFormation - UPDATE_COMPLETE_CLEANUP_IN_PROGRESS - AWS::CloudFormation::Stack - hello-world-devCloudFormation - UPDATE_COMPLETE - AWS::CloudFormation::Stack - hello-world-devServerless: Stack update finished...Service Informationservice: hello-worldstage: devregion: us-east-1stack: hello-world-devapi keys: Noneendpoints: Nonefunctions: hello: hello-world-dev-helloStack OutputsHelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:706605665335:function:hello-world-dev-hello:1ServerlessDeploymentBucketName: hello-world-dev-serverlessdeploymentbucket-bk066p5c9zgl
然后,让我们来触发一下这个函数:
$ serverless invoke -f hello -l
服务器返回了下面的结果:
{ "statusCode": 200, "body": "{"message":"Go Serverless v1.0! Your function executed successfully!","input":{}}"}--------------------------------------------------------------------START RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d Version: $LATESTEND RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773dREPORT RequestId: 041138f9-bc81-11e7-aa63-0dbab83f773d Duration: 2.49 ms Billed Duration: 100 ms Memory Size: 1024 MB Max Memory Used: 20 MB
这意味着,我们的第一个服务已经成功上线了。
我们也可以通过下面的命令来获取相应的日志:
serverless logs -f hello -t
末了,记得执行:
$ serverless remove
它可以帮你省很多钱
最近,我在玩 Serverless,先发篇 hello, world 的文章给大家解解馋。更多的内容,可以关注我在 GitHub 的项目《Serverless 应用开发指南》。
未来,会发一篇相关的整理知识的文章。
- 厚土Go学习笔记 | 25. 函数值 函数是函数也是值
- GoStub框架使用指南
- 厚土Go学习笔记 | 24. map字典测试用例(文字出现次数统计)
- .NET Core+MySql+Nginx 容器化部署
- Trie树分析
- 厚土Go学习笔记 | 23. map字典的使用
- JDK动态代理的底层实现原理
- 冷场了吗?我带着phpcms9.6.2 注入来救场了
- 厚土Go学习笔记 | 22. 实现Pic
- ie8和chrome获取上传图片的宽度和高度等尺寸
- 厚土Go学习笔记 | 21. range用法
- Golang Stub初体验
- 厚土Go学习笔记 | 20. slice 继续
- 数据挖掘算法之深入朴素贝叶斯分类
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go 使用三方 Redis 包操作 Redis
- 干货|这可能是最全的高并发、高性能、高可用解决方案总结
- 群晖多人协作开发
- 分享 Druid 连接池参数优化实战
- 使用 Eureka 简单实现服务健康监控日志分析
- Flask 入门系列教程(一)
- Flask 入门系列教程(二)
- CVE-2020-1472
- 盘点提高国内访问 GitHub 的速度的 9 种方案
- 如何用 Serverless 优雅地实现图片艺术化应用
- Unity3D网络通讯(四)--Socket通讯之Tcp通讯
- 笔记|Unity异步处理与UI Text显示的问题
- 项目中的全局缓存导致了内存泄露?
- 架构设计 | 分布式体系下,服务分层监控策略
- Hadoop框架:单服务下伪分布式集群搭建