gpt4 book ai didi

node.js - 如何在下类时间将我的 AWS Lambda 预配置容量设置为零?

转载 作者:行者123 更新时间:2023-12-04 17:15:40 33 4
gpt4 key购买 nike

我正在使用无服务器框架 (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)

有没有人有一个巧妙的解决方案来在一天中的某些时间关闭配置的容量?

最佳答案

经过一番思考,如果您仍然致力于将 Lambda 作为计算解决方案,我认为您最好的选择是完全在无服务器框架之外管理预配置的并发。

你已经有了一个 orchestrator 函数,它将启用预配置的并发,你可以尝试从你的 serverless.yml 文件中删除 provisionedConcurrency,在你的 orchestrator 中添加另一个方法来在晚上禁用预配的货币,并验证您是否可以在编排器将您的功能设置为任一状态时进行部署。

如果您愿意放弃协调器功能,AWS 建议使用 Application Auto Scaling ,这对于您正在做的事情非常有用。 (向@mpv 致敬)

话虽如此,Lambda 并不是特别适合可预测的稳态流量。如果成本是一个问题,我建议探索 Fargate 或 ECS 并编写一些自动缩放规则。您的 Lambda 代码已经是无状态的,并且可能是可移植的并且具有非常有限的网络规则。还有其他形式的计算,使用起来会便宜得多。

关于node.js - 如何在下类时间将我的 AWS Lambda 预配置容量设置为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68785753/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com