搭建无服务器应用的 10 个秘密 黄卓斌,AWS 解决方案架构师
议程 1. 快速搭建 Web 应用 2. 如何正确响应 3. 调用方式 4. 消息队列消费 5. 优化性能 6. AWS Lambda 的启动 7. 关于 Amazon VPC 8. 并发控制 9. 网关与其他 AWS 服务集成 10. 网关与后端 HTTP 服务集成
什么是无服务器应用 无需维护服务器灵活自动扩展高可用没有闲置的资源
无服务器应用组件 计算数据流数据库 AWS Lambda Amazon Kinesis Amazon DynamoDB 网关存储消息 Amazon API Gateway Amazon S3 Amazon SQS / SNS 其他更多更多
快速搭建 Web 应用
Amazon API Gateway + AWS Lambda 模式 AWS Mobile apps Internet Amazon API Gateway AWS Lambda Other AWS services Amazon S3 无需维护基础架构, 只需要上传代码即可搭建无服务器 Web 应用
三步完成 Amazon API Gateway 与 AWS Lambda 的集成
1. 新建 API 并创建一个 资源 1. 勾选 代理资源 点 创建资源
2. 选择要集成的 Lambda 函数 2. 选择区域以及对应的 Lambda 函数 保存 保存时弹出提示 将权限添加到 Lambda 函数 点 确认
3. 部署 API 可以在 Console 上进行 API 在线测试 3. 直接部署 API 部署完之后就可以访问 API 了
Amazon API Gateway 消息传递给 AWS Lambda Amazon API Gateway 触发 AWS Lambda, 并把以下信息在 JSON 发给 Lambda: Amazon API Gateway JSON AWS Lambda Request Method GET/POST Request Header X-header-extend: string Request QueryString example.com/?min=1&max=2 Client Information Source IP, useragent Request Body Auth, Account
AWS Lambda 如何返回结果
AWS Lambda 应该如何返回结果 JSON Amazon API Gateway AWS Lambda AWS Lambda 响应示例 Node.js AWS Lambda 响应格式要求 { } "isbase64encoded" : "boolean", "statuscode": "number", "headers": {... }, "body": "JSON string" 具体参见文档 https://docs.aws.amazon.com/apigateway/latest/developerguide/handle-errors-in-lambda-integration.html
AWS Lambda 的调用方式
同步调用 AWS Lambda Amazon API Gateway 触发 Lambda Lambda 函数运行 最终结果返回 AWS Lambda AWS IoT
异步调用 AWS Lambda Amazon S3 触发 Lambda 返回确认消息 Lambda 函数运行 AWS Lambda Amazon CloudWatch 事件
Amazon API Gateway AWS Lambda 调用 ( 进阶 ) Amazon API Gateway Trigger AWS Lambda 默认是同步调用 可以实现异步调用 AWS Lambda 吗? 为什么 Amazon API Gateway 要异步调用 AWS Lambda? 利用 Lambda retries 同步调用是不重试的, 异步调用重试 2 次 突破 API Gateway connection timeout 29s Performance 原因 JSON API Gateway Lambda
异步调用 Amazon API Gateway 调用 AWS Lambda 的 Header 指定 : X-Amz-Invocation-Type: Event 则是异步调用 ( 事件方式 ) 取消 Lambda 代理集成模式 在 Amazon API Gateway 的 集成请求 中配置 增加一个自定义 Header 名称是 X-Amz- Invocation-Type 属性是 'Event'
流式调用 Amazon Kinesis Amazon DynamoDB Stream AWS Lambda
无服务器的消息队列消费架构
传统的处理消息队列的方式 定时任务触发 批量读取 SQS Message 应用集群 Amazon SQS Delete Message 监控堆积的消息数量增减应用服务器数量
Amazon SQS 触发调用 AWS Lambda 自动触发并自动完成 : 批量读取 SQS Message Amazon SQS Lambda 函数正常完成自动删除 SQS Message AWS Lambda Lambda 函数只需负责处理所收到的 SQS Message
AWS Lambda 优化性能
设置内存 当前 AWS Lambda 最大支持 3GB 内存 自动匹配相应的 CPU 资源
内存大就价格更高吗? 一个大数据运算的例子 : 128 MB 11.722965sec $0.024628 256 MB 6.678945sec $0.028035 512 MB 3.194954sec $0.026830 1024 MB 1.465984sec $0.024638 参考 https://github.com/alexcasalboni/aws-lambda-power-tuning
AWS Lambda 启动
AWS Lambda 原理
AWS Lambda 的启动 下载你的 code 启动新的 container 引导 runtime 启动你的 code Cold start Warm start AWS 优化的部分 你优化的部分
利用 AWS Lambda 容器重用机制 有效地重用容器资源 var AWS = require('aws-sdk'); var uuid = require('node-uuid'); var db; 容器生成的时候执行在容器重用, 即 Lambda Function 第二次调用时不再执行 Lambda Function 函数被调用时执行 exports.myhandler = function(event, context, callback) { if (!db db.isconnected()) { db = setupconnection(); } // Rest of logic } P99 情况不会遇到冷启动 如果经测试, 冷启动时间较长, 影响用户体验, 可以进行定时预热, 特别是 Java 和 C# 的应用 并发预热, 可以利用 Amazon CloudWatch 定时任务触发预热的 AWS Lambda, 利用诸如 Node.js 的非阻塞机制进行并发预热一定数量的容器
AWS Lambda 与 Amazon VPC
AWS Lambda in Amazon VPC 下载 your code 启动新 container 建立 VPC ENI 连接 VPC ENI 引导 runtime 启动 code Full cold start Warm start 如非确实必要, 则不要将 Lambda 运行在 VPC 模式 Lambda 的 VPC ENI IP 地址只会是私有 IP
AWS Lambda in Amazon VPC 最佳实践 至少配置运行在两个可用区 给 Lambda functions 配置专门的子网 subnets Lambda 的子网要有足够的 IP 地址, 以应对潜在的并发扩容
AWS Lambda in Amazon VPC 最佳实践 如果 Lambda 函数需要发起访问 Internet, 需要配置 NAT, 参考 : https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/ 给 AWS Lambda 的 Role 配置权限 ec2:createnetworkinterface, ec2:describenetworkinterfaces, ec2:deletenetworkinterface 以上三个权限包含在了系统自带的 AWSLambdaVPCAccessExecutionRole 中
AWS Lambda 并发控制
AWS Lambda 并发 AWS Lambda 根据增加的流量动态扩展容量 突增流量,Lambda 将立即根据预定量增加您的并发执行函数 500 增加您的并发执行函数 直到达到账户的安全限制, 或并发执行的函数数量足以成功处理增加的负载 THINK CONCURRENT, NOT TPS
需求 AWS Lambda 调用的后端系统顶不住那么多突发流量怎么办? 同一个账号, 测试环境的 Lambda 占用过多并发, 生产环境受影响? 关键应用怎么确保有足够的并发? 怎么暂停 Lambda?
AWS Lambda 并发控制 设定单个 Function 的保留并发 1. 预留 2. 封顶 3. 停用
Amazon API Gateway 与其他 AWS 服务集成
例如 : 直接写 Amazon DynamoDB AWS Mobile apps Internet Amazon API Gateway Amazon DynamoDB
为什么经 Amazon API Gateway 访问 AWS 其他服务 更灵活的认证方式 访问 AWS 服务而不使用 AWS API 所要求的认证 利用 API Gateway 所提供的功能 : 缓存, 数据转换, 响应码转换等 减少中间的应用服务层, 例如不用 AWS Lambda 一些旧有的应用, 特殊的应用, 不方便修改为直接访问 AWS API
直接写 Amazon DynamoDB API Gateway Integration 中配置 集成 AWS 服务 服务选择 Amazon DynamoDB HTTP 方法 POST 操作 PutItem 设置执行角色的 Role ARN Amazon API Gateway 作为 Amazon DynamoDB 的 Proxy 参考文档 https://amazonawschina.com/cn/blogs/compute/using-amazon-apigateway-as-a-proxy-for-dynamodb/
映射模版 写 Amazon DynamoDB 举例, 在 POST 中带参数 https://xxx.xxx.com/prod/comments?pageid=02&username=jamesh&message=ok Amazon API Gateway 映射模板
Amazon API Gateway 与后端 HTTP 服务集成
HTTP 服务集成 AWS Mobile apps Internet Amazon API Gateway HTTP Endpoint 利用 Amazon API Gateway 认证 请求参数转换 响应码转换 缓存
提取 QueryString, 作为向后端请求的 Header 方法请求 举例请求 https://xxx.xxx.com/prod/comments?myquerystring=12 转换到输出的请求中含一个自定义 header x-custom-header01: 12 集成请求
编写映射的参考文档 Request and Response Data Mapping Reference (Path/QueryString/Header) https://docs.aws.amazon.com/apigateway/latest/developerguide/request-responsedata-mappings.html Mapping Template Reference (Body) https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gatewaymapping-template-reference.html Apache Velocity http://velocity.apache.org/engine/devel/vtl-reference.html
感谢参加 AWS INNOVATE 2018 在线技术大会 我们希望您在这里找到感兴趣的内容! 也请帮助我们完成投票打分和反馈问卷 欲获取关于 AWS 的更多信息和技术内容, 可以通过以下方式找到我们 : 微信公众号 :AWSChina 新浪微博 :https://www.weibo.com/amazonaws/ 领英 :https://www.linkedin.com/company/aws-china/ 知乎 :https://www.zhihu.com/org/aws-54/activities/ 视频中心 :http://aws.amazon.bokecc.com/ 更多线上活动 :https://aws.amazon.com/cn/about-aws/events/webinar/