我正在使用无服务器框架(serverless.com),看起来我可以节省相当多的钱,只需在工作时间(上午9点到下午5点,每周40小时)增加我的Lambda函数的配置容量,然后在非工作时间将其缩减为零。我的应用程序在非工作时间使用得不是很多,如果是这样,我的用户可以接受冷启动,而且需要更长的时间。
在我的serverless.yml中,我声明了如下函数:
home_page:
handler: homePage/home_page_handler.get
events:
- http:
path: homePage
method: get
cors: true
authorizer: authorizer_handler
provisionedConcurrency: 1
我还有一个Lambda,它定期运行,根据一天中的时间设置帐户中其他Lambda的配置容量。在Lambda中如果我调用:
await lambda.putProvisionedConcurrencyConfig({
FunctionName: myFunctionName,
ProvisionedConcurrentExecutions: 0,
Qualifier: "provisioned",
}).promise();
然后我得到了这个错误:
Received error: ValidationException: 1 validation error detected: Value '0' at 'provisionedConcurrentExecutions' failed to satisfy constraint: Member must have value greater than or equal to 1
at Object.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:52:27)
at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/rest_json.js:55:8)
at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:688:14)
at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)
at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)
at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)
at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:690:12) {
code: 'ValidationException',
time: 2021-08-14T17:45:48.932Z,
requestId: '8594fad6-d5dd-4a00-adca-c34f9d38b25e',
statusCode: 400,
retryable: false,
retryDelay: 77.81562781029108
}
另一方面,如果我尝试完全删除已配置的容量,如下所示:
await lambda.deleteProvisionedConcurrencyConfig({
FunctionName: myFunctionName,
Qualifier: "provisioned",
}).promise();
这很好用,但当我试图在下班时间再次部署我的函数时(这是常态),CloudFormation错误如下:
No Provisioned Concurrency Config found for this function (Service: AWSLambdaInternal; Status Code: 404; Error Code: ProvisionedConcurrencyConfigNotFoundException; Request ID: 75dd221b-35d2-4a49-80c5-f07ce261d357; Proxy: null)
有没有人有一个整洁的解决方案,可以在一天中的某些时间关闭预置的容量?
发布于 2021-08-16 23:08:51
经过思考,如果您仍然致力于将Lambda作为计算解决方案,我认为您的最佳选择是完全在无服务器框架之外管理预置的并发。
您已经有了一个orchestrator函数,它将启用预置并发,您可以尝试从serverless.yml
文件中删除provisionedConcurrency
,在orchestrator中添加另一个方法来禁用晚上预配的货币,并验证当orchestrator将您的函数设置为任一状态时,您是否可以进行部署。
如果你愿意放弃你的编排功能,亚马逊网络服务建议使用Application Auto Scaling,这对你正在做的事情非常有用。(向@mpv致敬)
也就是说,Lambda并不是特别适合可预测的、稳定状态的流量。如果成本是个问题,我建议探索一下Fargate或ECS,并编写一些自动扩展规则。您的Lambda代码已经是无状态的,并且很可能是可移植的,并且网络规则非常有限。还有其他形式的计算,使用起来会便宜得多。
https://stackoverflow.com/questions/68785753
复制相似问题