赞
踩
AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行您的代码并自动缩放,从每天几个请求到每秒数千个请求。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 AWS Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,并且不必进行任何管理。AWS Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录。您只需要以 AWS Lambda 支持的一种语言提供您的代码。
lambda返回API GW是JSON格式的,格式要求如下:
{
"isBase64Encoded" : "boolean",
"statusCode ": "number",
"headers": { ... },
"body": "JSON string"
}
同步调用 lambda
异步调用 lamda
API Gateway 调用 lambda默认是同步调用,但是可以实现异步调用,实现异步调用有以下几个好处
实现方式,
1) 在API Gateway 的 集成请求中 配置 http头,指定 X-Amz-Invocation-Type: Event
2) 流式调用
https://stackoverflow.com/questions/37297339/aws-api-gateway-default-response-and-trigger-aws-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运行在VPC模式,lambda的VPC ENI IP地址只会是私有的IP
至少配置运行在两个可用区,给 lambda functions配置专门的子网 subnets,lambda的子网要有足够的IP地址,以对应潜在的并发扩容
如果 lambda函数需要发起访问 Internet,需要配置NAT,可以参考:https://amazonaws-china.com/cn/premiumsupport/knowledge-center/internet-access-lambda-function/
lambda根据增加的流量动态扩展容量,突增流量,lambda将立即根据预定量增加并发执行函数
设定单个function的保留并发,如下三种模式
1.预留
2.封顶
3.停用
账户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 函数连同所有依赖包打包成一个大的包,但这样也不好管理。
以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
通过使用版本控制,您可以在 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 允许您运行 Node.js Lambda 函数来自定义 CloudFront 提供的内容,从而在更靠近查看器的 AWS 位置执行函数。这些函数在不提供或管理服务器的情况下运行,以响应 CloudFront 事件。您可以在以下时间点使用 Lambda 函数来更改 CloudFront 请求和响应,下面的例子是设置Lambda的定制化header
创建一个新的Lambda,自定义header的值
在对应的cloud front的Default Cache Behavior Settings 配置上述的Lambda
再次部署cloud front,可以看到新的header已经生效了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。