AWS-lambda笔记

什么是AWS Lambda

简介

  • 计算服务:只关心代码,不需要考虑服务器
  • 事件驱动:代码只在需要时执行,并自动缩放

优势

  • 无需维护
  • 天然高可用
  • 自动扩展
  • 按调用付费
  • 安全可靠

Lambda编程模型、并发问题、版本控制

Lambda编程模型

1
2
3
4
5
6
7
8
9
10
11
//helloWorld.js
/*

event:将时间数据传递到处理程序
content:提供运行时信息,与Lambda执行环境作为交互,服务将此对象作为第二个参数传递给Lambda函数处理程序
callback:回调参数是可选的,取决于您是否希望将信息返回到调用方

*/
exports.awsHandler = function(event,content,callback){

}

Lambda 并发问题

  • AWS Lambda通过扩展容量,动态增加实例来处理并发问题
  • AWS Lambda将根据增加的流量动态扩展,具体取决于您的AWS账户并发执行限制。为了处理突增流量,Lambda将立即根据预定量增加并发执行函数

Lambda 版本控制

  • 版本号自增
  • 设置别名

Lambda 触发器

同步:

  • Elastic Load Balancing(应用程序负载均衡器)
  • Amazon Cognito
  • Amazon Lex
  • Amazon Alexa
  • Amazon API Gateway
  • Amazon CloudFront (Lambda@Edge)
  • Amazon Kinesis Data Firehose

异步:

  • Amazon Simple Storage Service
  • Amazon Simple Notification Service
  • Amazon Simple Email Service
  • AWS CloudFormation
  • Amazon CloudWatch Logs
  • Amazon CloudWatch Events
  • AWS CodeCommit
  • AWS Config

Lambda 权限

  • AWSLambdaFullAccess – 授予对 AWS Lambda 操作和其他用于开发和维护 Lambda 资源的服务的完全访问权。
  • AWSLambdaReadOnlyAccess – 授予对 AWS Lambda 资源的只读访问权限。
  • AWSLambdaRole – 授予调用 Lambda 函数的权限。

层的编写

lambda 层: https://medium.com/appgambit/part-1-getting-started-with-aws-lambda-layers-1677a6b006

注意点:

  1. 路径格式一定要对,文件名称 nodejs,node_modules 一定要对
  2. 引用是使用 xxxxx_moduleName

xxx.zip

1
2
3
4
5
nodejs
- node_modules
- xxxxx_moduleName
-- xxxx.js
-- ...

错误处理

  • 调用错误
    • 请求 : 请求事件太大或JSON无效;函数不存在;参数值是错误类型
    • 调用方: 用户或服务无权调用该函数
    • 账户:已在运行最大数量的函数实例,或者请求过快
  • 函数错误
    • 函数 代码抛出异常或者返回错误对象
    • 运行时 运行时 终止了您的函数;检测到语法错误;函数退出,返回错误码

环境变量使用

1
2
3
4
5
// 从 process.env 获取,有自定义的,有AWS预设的
exports.handler = function(event, context, callback) {
var bucketName = process.env.S3_BUCKET;
callback(null, bucketName);
};

版本控制

  • 每个Lambda函数版本具有唯一的ARN,版本一旦发布,则不能更改
  • 别名管理规则
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    实例一:
    例如,假设 Amazon S3 是在存储桶中创建新对象时调用您的 Lambda 函数的事件源。当 Amazon S3 为事件源时,您将事件源映射信息存储在存储桶通知配置中。在该配置中,您可以指定 Amazon S3 可调用的 Lambda 函数 ARN。不过,在这种情况下,每次发布新的 Lambda 函数版本时,您都需要更新通知配置以便 Amazon S3 调用正确的版本。

    相反,假设您在通知配置中指定别名 ARN (例如,PROD 别名 ARN),而不是指定函数 ARN。在将 Lambda 函数的新版本提升到生产环境时,您只需要更新 PROD 别名以指向最新的稳定版本。您无需更新 Amazon S3 中的通知配置。

    当您需要回滚到 Lambda 函数的之前的版本时,也同样适用。在此方案中,您只需更新 PROD 别名以指向其他函数版本。无需更新事件源映射。

    在构建涉及多个依赖项和开发人员的应用程序时,我们建议您使用版本控制和别名以部署 Lambda 函数。

    实例二:
    根据需要更轻松地支持 Lambda 函数的新版本的提升和回滚 – 在最初创建 Lambda 函数($LATEST 版本)后,可以先发布其版本 1。通过创建名为 PROD 的指向版本 1 的别名,现在可以使用 PROD 别名调用 Lambda 函数的版本 1

    现在您可以使用所有改进来更新代码($LATEST 版本),然后发布另一个改进后的稳定版本(版本 2)。可以通过重新映射 PROD 别名以使其指向版本 2,来将版本 2 提升到生产中。如果发现问题,您可以通过重新映射 PROD 别名以使其指向版本 1,来轻松将生产版本回滚到版本 1

    实例三:

文档

lambda:https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/welcome.html