掌握无服务器这些技巧可以帮助你节约时间
极客时间编辑部
讲述:丁婵大小:2.41M时长:05:16
近日,Launch First Agency 的首席工程师丹·雅凯蒂(Dan Jakaitis)介绍了他去年在 AWS 上基于 Serverless Framework 构建的一个生产级项目所获得的经验,他将这些无服务器的实践清单列出,希望能对开发者有所帮助,帮助开发者节约一些时间,减少一些麻烦。
1. 将 Lambda 函数连接到 RDS 数据库
要将 Lambda 函数连接到 RDS 数据库,可行的方法有两种:
其一,RDS 位于 VPC 中,但对所有 IP 开放,这会造成安全弱点。其本质在于设置 VPC 安全组允许任何入站 IP 地址连接你的数据库(假设客户端有正确的用户名和密码)。这会导致 RDS 实例在面对互联网上肆虐的爬虫这种自动化攻击措施时门户大开。如果缺乏足够的技术和保护能力,最好别这样做。
其二,RDS 和 Lambda 位于同一个 VPC 中,虽然更复杂,但这是正确的做法。对于新手,你的所有函数必须包含与 RDS 集群共享的恰当子网和安全组。随后需要确保为 Lambda 提供了 ENI 访问。ENI 的分配存在一些硬性限制,在将任何 Lambda 放入 VPC 前必需妥善考虑。
对于在 VPC 中运行 Lambda,会遇到一些有关冷启动和延迟的问题。在某些安全设置下,这些问题不可避免,因此你需要确保仅将必要的 Lambda 放入 VPC 中,并尽可能使用缓存来避免不必要的 ENI 分配或 DB 连接。
2. 确保你的 Lambda 附加了正确的角色
如果未能给函数添加正确的权限,Serverless Framework 在部署或打包阶段并不会给出任何错误信息。因而随后只能翻查海量 CloudWatch 日志来判断到底哪里出错了。请养成良好习惯:部署任何新函数之前,务必要检查 iamRoleStatements。
3. IAM 角色名称最多只能用 64 个字符
这条原则含义显而易见,但在 sls deploy 过程中却很不容易发现问题。对于函数和 Stage 的名称一定要妥善规划。
4. CloudFormation 的资源上限为 200
如果不使用 Serverless Framework,解决方案也很简单,在 CloudFormation 中创建嵌套的栈即可。嵌套栈可以在函数层面或域实体层面组织成为一个函数,具体怎么做完全取决于你的偏好。
目前还不能(很轻松地)直接在 serverless.yml 文件中配置嵌套栈,而是需要借助插件。对于一些非常成熟的服务,如果包含多个相互穿插的依赖项,可能还无法直接由这样的插件来处理。
5. 可将多个事件附加给同一个 Lambda
如果有多个应用程序客户端访问同一个 API,那么这将是一种很棒的解决方案。客户端 A 会有自己的 Lambda 授权方(Authorizer),客户端 B 会使用另一个授权方。这样做的优势在于,可以用最少的工作量为不同客户端应用不同的 API 网关设置(如缓存、跟踪、错误代码、请求限制)。
6. 自定义授权方需要手工禁用缓存
这一点很重要,因为你肯定不希望自己的授权方将基于之前的请求所创建的拒绝 / 允许策略缓存起来。
7. AWS SDK 也是 Lambda 运行时的一部分
AWS 在自己的文档中并未提及这一点,但需要提醒你,不要将该 SDK 包含在自己已部署的依赖项中,这会导致整个部署的体积迅速激增。
8. 单独打包,不要包含测试文件
丹·雅凯蒂表示,他们 sls deploy 的 Zip 文件非常庞大。对于包含约 20 个 Lambda 的一个服务,最终压缩之后的整个部署文件的体积约为 15GB。因此他们很快就碰到了 Lambda 75GB 的软性限制而不得不申请服务扩容。
尽管扩容后的上限提高到 150GB,但他们依然开始调查这些软件包到底出了什么问题。此时可以通过两个操作让部署文件的体积实现数量级的“瘦身”:
第一步,最简单的方法是在 Webpack 配置中进行文件排除,这样可以避免所有测试文件进入到最终构建中。之后可以单独打包所有函数,这一做法真正让软件包实现了数量级的瘦身,并且远远低于 150GB 的限制。
以上就是今天的内容,希望对你有所帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论