上篇文章首先指出了 Serverless=No Server 这一常见误区, 然后明确定义了函数这个 Serverless 中的核心概念, 接着介绍了 Serverless 的 4 个关键特性: 运行成本更低自动扩缩容事件驱动无状态性, 最后分析了 Serverless 和微服务 DevOps 之间的关联关系为了帮助大家更直观的理解 Serverless, 本文将介绍三种在 AWS Lambda 上创建函数的方式
1 Hello, AWS Lambda!
1.1 注册 AWS 账户
首先, 打开 Amazon AWS 官网, 点击右上角注册按钮开始注册流程
注册 AWS 除了邮箱地址手机号 (用于接受语音验证码) 等基本信息之外, 还需要绑定一张信用卡(银联 MasterCardVISA), 绑卡过程中会发生一笔 1 美元的信用卡预授权扣费
注册成功之后, 即可获赠 AWS 免费套餐大礼包, 包括 12 个月免费的基础 IaaS & PaaS 服务(比如 EC2, S3, RDS 等), 以及永久免费的 AWS Lambda 免费套餐(包括每月 100 万个免费请求以及每月 400000GB - 秒的计算时间, 对于个人使用而言完全是足够了)
1.2 创建函数
接下来, 就来创建第一个 AWS Lambda 函数吧
登录 AWS, 点击最上方的菜单栏服务 ->计算: Lambda, 进入 Lambda 控制台
在页面上找到并点击创建函数按钮
作为第一个函数, 选择从头开始创作, 输入函数名称 hello-lambda, 运行语言选择 Node.js 6.10, 角色选择系统默认创建的 service-role/admin, 点击创建函数完成创建
1.3 简单测试
新函数创建好之后, 就可以开始测试了在函数详情页的右上角找到并点击测试按钮, 第一次会提示你先创建一个测试事件, 输入名称, 使用默认模板完成创建回到详情页, 再次点击测试按钮, 就会触发测试测试完成之后, 展开详细信息, 就可以看到具体的响应结果, 以及本次测试产生的计费时间
1.4 公网测试
函数详情页的测试按钮是最简单的一种测试 Lambda 函数的方式, 但这种方式仅限于 AWS 内网, 如果想在公网环境下进行测试, 该如何操作呢? 最自然的方式是绑定 API Gateway, 将函数转化为可公开调用的 API
1.4.1 绑定 API Gateway
同样是函数详情页, 在左侧找到添加触发器, 点击 API Gateway, 保持默认设置完成添加
修改函数代码, 返回符合 API Gateway 格式要求的响应结果, 参考这里
保存上述改动
- exports.handler = (event, context, callback) = >{
- var responseBody = {
- "key3": "value3",
- "key2": "value2",
- "key1": "value1"
- };
- var response = {
- "statusCode": 200,
- "headers": {
- "my_header": "my_value"
- },
- "body": JSON.stringify(responseBody),
- "isBase64Encoded": false
- };
- callback(null, response);
- };
示例函数代码
点击最上方的菜单栏服务 ->网络和内容分发: API Gateway, 进入 API Gateway 控制台, 在左侧导航栏应该能够看到 API->LambdaMicroservice, 说明函数已经成功绑定依次点击 API->LambdaMicroservice->阶段 ->prod->/->hello-lambda->GET, 记下调用 URL
1.4.2 创建用户
API Gateway 默认使用的鉴权方式是 AWS_IAM, 即调用方必须拥有特定的 IAM Permssions 才能调用 API, 参考这里具体来说, 需要一个拥有 execute-api:Invoke 权限的用户
点击最上方的菜单栏服务 ->安全身份与合规: IAM, 进入 IAM 控制台
点击左侧导航栏用户, 进入用户面板
点击添加用户按钮, 输入用户名, 访问类型选择编程访问, 点击下一步: 权限
选择直接附加现有策略, 搜索并选中
AmazonAPIGatewayInvokeFullAccess
, 完成创建
返回用户列表页, 点击刚刚创建的用户进入用户详情页, 点击安全证书 ->创建访问密钥, 记下访问密钥 ID 和私有访问密钥
1.4.3 使用 Postman 测试 API
做完前两步的准备工作, 就可以使用 Postman 进行测试了
下载并启动 Postman
创建一个新的请求, Authorization 选择 AWS Signature, 输入之前记下的 URLAccessKey(访问密钥 ID)和 SecretKey(私有访问密钥),AWS Region 填入 URL 中紧邻 amazonaws.com 的一个子域名, Service Name 填入 execute-api
点击 Send, 稍等一会, 应该就能看到正常的响应结果
进一步信息可参考这里
2 加餐一: Spring Cloud Function
除了 Node.js,AWS Lambda 还支持 Java 8C#GoPython 等多种运行语言接下来, 就以一个 Spring Cloud Function(简称 SCF)应用为例, 展示如何创建一个 Java 8 的函数
SCF 是 Spring 社区提供的一个以函数为核心的开发框架除了本地运行, SCF 应用还可以部署到 AWSAzureOpenWhisk 等多种 Serverless 平台最新的发布版本是 1.0.0.M3
打包应用:
git cloneSCF 官方仓库
进入 spring-cloud-function-samples/function-sample-aws 目录, 运行 mvn clean package
运行成功后在 target 目录下可以找到名为 function-sample-aws-1.0.0.BUILD-SNAPSHOT-aws.jar 的应用包
创建函数:
和之前一样, 进入 Lambda 控制台, 点击创建函数按钮, 运行语言选择 Java 8, 完成创建
进入函数详情页, 点击函数代码 ->上传按钮, 选择之前打好的应用包, 处理程序改为
org.springframework.cloud.function.adapter.aws.SpringBootStreamHandler
保存修改
测试函数:
进入函数详情页, 点击右上角的测试按钮, 填入
{"value": "hello, lambda!"}
创建新的测试事件
再次点击测试按钮, 触发第一次测试不出意外, 第一次测试会提示失败, 错误消息类似于
errorMessage ":"2018 - 02 - 04T13: 09 : 59.745Z b1c9b0a1 - 09ac - 11e8 - 9fdf - 858e20f0ff70 Task timed out after 3.00 seconds ""
出错的直接原因是函数设置的超时时间太短(默认 3 秒), 根本原因是函数的无状态性, 每次函数调用都要经历一次冷启动, 这对于 Node 应用没有太大问题, 但对于 Java 8 应用, 即便是一个最简单的 Hello World 应用, 完成一次冷启动至少需要 5 到 10 秒
修改基本设置 ->内存为 512MB, 基本设置 ->超时为 5 分钟, 保存然后重新测试这一次测试应该可以成功, 返回结果为
{"value": "HELLO, LAMBDA!"}
3 加餐二: serverless toolkit
除了直接在 AWS 后台创建函数, 还有一种更为简便的方式, 使用 serverless.com 平台提供的 serverless toolkit
操作非常简单, 这里就不展开了, 不过有两点需要注意:
在将应用部署到 AWS 之前, 先要创建一个拥有
AdministratorAccess
权限的用户, 参考这里
默认创建的应用鉴权为空, 即可以在公网直接访问
4 小结
以上简单介绍了三种在 AWS Lambda 上创建函数的方式, 希望对你理解 Serverless 有所帮助有关 Serverless 其他特性的研究, 以后有机会我再跟你分享欢迎你到我的留言板留言交流, 和大家一起过过招
5 参考
Serverless 应用开发指南
Introducing Spring Cloud Function
来源: https://juejin.im/post/5a7715f26fb9a0633c65e93b