AWS Lambda的简介与使用

Lambda的简介

AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 AWS Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,并且不必进行任何管理。AWS Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录。您只需要以 AWS Lambda 支持的一种语言提供您的代码。

Lambda 如何返回结果

lambda返回API GW是JSON格式的,格式要求如下:

{
"isBase64Encoded" : "boolean",
"statusCode ": "number",
"headers": { ... },
"body": "JSON string"
}

Lambda 的调用方式

同步调用 lambda

异步调用 lamda

API Gateway 调用 lambda默认是同步调用,但是可以实现异步调用,实现异步调用有以下几个好处

  1. 利用 lambda retries, 同步调用是不重试的,异步调用重试2次
  2. 突破 API Gateway connection timeout 29秒的限制
  3. 提高application 的performance

实现方式,

1) 在API Gateway 的 集成请求中 配置 http头,指定 X-Amz-Invocation-Type: Event

https://stackoverflow.com/questions/52452897/trying-to-add-x-amz-invocation-typeevent-to-existing-api-gateway-post-method

2) 流式调用

 

  1. Set up an API configured to send requests to Amazon Kinesis. This API could acknowledge the request.
  2. Set up AWS Lambda to consume your Kinesis stream.

https://stackoverflow.com/questions/37297339/aws-api-gateway-default-response-and-trigger-aws-lambda

Lambda启动

Lambda 原理  

Lambda启动

所以必须有效的重用容器的资源,如下面的代码,容器生成的时候执行,在容器重用,即lambda function第二次调用的时候不再执行

var AWS = require('aws-sdk');

var Enumerable = require('linq');

但是下面的代码是 lambda function 函数每次被调用的时候执行

exports.CheckApprovalHandler = function (event, context) {

EventService.checkIfApproval(event, function (err, result) {

context.done(err, result);

});

};

所以,百分之99情况不会遇到冷启动,如果实际情况经测试,冷启动时间较长,影响用户的体验,可以进行定时预热,特别是Java和C#的应用并发预热,可以利用 cloud watch定时任务触发预热的lambda, 利用诸如Node.js的非阻塞机制进行并发预热一定数量的容器。

Lambda in VPC

所以如果不是确实必要,不要将lambda运行在VPC模式,lambda的VPC ENI IP地址只会是私有的IP

Lambda最佳实践

Lambda VPC最佳实践

至少配置运行在两个可用区,给 lambda functions配置专门的子网 subnets,lambda的子网要有足够的IP地址,以对应潜在的并发扩容

 

如果 lambda函数需要发起访问 Internet,需要配置NAT,可以参考:https://amazonaws-china.com/cn/premiumsupport/knowledge-center/internet-access-lambda-function/

Lambda并发控制

lambda根据增加的流量动态扩展容量,突增流量,lambda将立即根据预定量增加并发执行函数

设定单个function的保留并发,如下三种模式

1.预留

2.封顶

3.停用

跨账户lambda权限配置

https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/access-control-resource-based.html#access-control-resource-based-example-cross-account-scenario

账户A要访问账户B的function b, 只要用账户B的account运行 以下AWS CLI命令

aws lambda add-permission --region us-east-1 --function-name function b --statement-id 6 --principal  账户A的ID --action lambda:InvokeFunction

然后可以到function b的lambda控制台进行确认权限赋值,在代码中就可以使用账户A访问账户B的function b

Lambda 层的应用

我们在开发 Lambda 应用的时候,通常会有多个 Lambda 函数都共用的代码以及依赖的第三方包。 Lambda 函数要调用这些依赖包,原来的做法是在每个 Lambda 函数打包的时候,连带依赖包一起打包。每个函数都这么做是不方便,也影响速度的。或者可以多个 Lambda 函数连同所有依赖包打包成一个大的包,但这样也不好管理。

以nodeJS为例,将第三方lib打包成如下文件目录

并创建新的layer

可以看到相比以前包含node_modules文件夹的打包文件,现在去掉node_modules文件夹后,打包大小从15M降低到了257KB,使得打包效率显著提升,但是需要注意有第三方库升级需要重新create新version的layer,然后在每个lambda function中重新引用新版本的layer,在要使用的lambda中引用当前层就可以了,可以看到lambda返回正常的结果了。

注意:

每个 Lambda 函数最多可以配置5个层,函数加上层的总大小不能超过  250 MB ( unzipped size ) 。详见 AWS Lambda Limits https://docs.aws.amazon.com/lambda/latest/dg/limits.html, 当然还可以引用其他 AWS 账户的包, 详见 https://amazonaws-china.com/cn/blogs/china/use-aws-lambda-layer-function/?nc1=b_rp

Lambda版本的控制

通过使用版本控制,您可以在 AWS Lambda 中更好地管理生产环境中的函数代码。在 AWS Lambda 中使用版本控制时,您可以发布 Lambda 函数的一个或多个版本。因此,您可在开发工作流(例如开发、测试和生产)中使用 Lambda 函数的不同变型。详见 https://docs.aws.amazon.com/zh_cn/lambda/latest/dg/versioning-aliases.html

有两个方案可以实现部署备份

1)现在每次部署每个环境我们在部署前都可以建一个version 比如version1,然后再部署新的LB代码,这样假如新的代码有问题,可以快速把version1的代码download下来替换最新的代码。

2)第二个方案相对复杂,每个lambda 可以定义后缀alias名字,例如: xxxx_scenario:crossAlias, 这个alias可以在后台指定不同的version版本,所以回滚代码只要lambda 那边用alias指向想要部署的那个版本。不过我们要把每个API gate way的地方的调用lambda 名字都改成alias的那种,代码里面有调用lambda 名字的地方也要改成alias

Lambda@Edge

Lambda@Edge 允许您运行 Node.js Lambda 函数来自定义 CloudFront 提供的内容,从而在更靠近查看器的 AWS 位置执行函数。这些函数在不提供或管理服务器的情况下运行,以响应 CloudFront 事件。您可以在以下时间点使用 Lambda 函数来更改 CloudFront 请求和响应,下面的例子是设置Lambda的定制化header

创建一个新的Lambda,自定义header的值

在对应的cloud front的Default Cache Behavior Settings 配置上述的Lambda

再次部署cloud front,可以看到新的header已经生效了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值