首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在非工作时间将我的AWS Lambda配置容量设置为零?

如何在非工作时间将我的AWS Lambda配置容量设置为零?
EN

Stack Overflow用户
提问于 2021-08-14 17:50:40
回答 1查看 493关注 0票数 3

我正在使用无服务器框架(serverless.com),看起来我可以节省相当多的钱,只需在工作时间(上午9点到下午5点,每周40小时)增加我的Lambda函数的配置容量,然后在非工作时间将其缩减为零。我的应用程序在非工作时间使用得不是很多,如果是这样,我的用户可以接受冷启动,而且需要更长的时间。

在我的serverless.yml中,我声明了如下函数:

代码语言:javascript
运行
复制
  home_page:
    handler: homePage/home_page_handler.get
    events:
      - http:
          path: homePage
          method: get
          cors: true
          authorizer: authorizer_handler
    provisionedConcurrency: 1

我还有一个Lambda,它定期运行,根据一天中的时间设置帐户中其他Lambda的配置容量。在Lambda中如果我调用:

代码语言:javascript
运行
复制
await lambda.putProvisionedConcurrencyConfig({
    FunctionName: myFunctionName,
    ProvisionedConcurrentExecutions: 0,
    Qualifier: "provisioned",
  }).promise();

然后我得到了这个错误:

代码语言:javascript
运行
复制
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
}

另一方面,如果我尝试完全删除已配置的容量,如下所示:

代码语言:javascript
运行
复制
  await lambda.deleteProvisionedConcurrencyConfig({
    FunctionName: myFunctionName,
    Qualifier: "provisioned",
  }).promise();

这很好用,但当我试图在下班时间再次部署我的函数时(这是常态),CloudFormation错误如下:

代码语言:javascript
运行
复制
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)

有没有人有一个整洁的解决方案,可以在一天中的某些时间关闭预置的容量?

EN

回答 1

Stack Overflow用户

发布于 2021-08-16 23:08:51

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

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

如果你愿意放弃你的编排功能,亚马逊网络服务建议使用Application Auto Scaling,这对你正在做的事情非常有用。(向@mpv致敬)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68785753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档