AWS Lambda帐户并发,限制

时间:2019-03-16 15:14:57

标签: amazon-web-services lambda aws-lambda aws-api-gateway

出于性能原因,我正在考虑不使用API​​网关。相反,我想将lambda函数直接公开到Web。未经身份验证的IAM凭证是必需的,并由AWS JavaScript SDK提供。我意识到,如果一个坏演员试图以天文数字的速度调用我的功能并引起重大计费问题,这可能是一个问题。我认为这不太可能发生,因为有人特别需要将我的应用程序作为目标,请求IAM凭据,然后调用该请求。。。

为了保护我的Lambda函数免受攻击,我正在考虑使用帐户并发功能。默认情况下,帐户并发功能限制为该帐户上的1,000个并发请求。我可以指定特定于Lambda函数的储备并发性,以减少剩余的整体帐户并发限制(其余帐户的并发限制)。

这项工作是否可行:创建虚拟Lambda函数(不可公开访问),将虚拟Lambda函数保留的并发设置得很高,例如950 ...这将为我的“真正的” Lambda函数留下50个并发的lambda请求...这似乎是在不使用API​​网关等情况下限制lambda的简单方法。

有想法吗?

2 个答案:

答案 0 :(得分:2)

按照您描述的一种保护方式完全可以实现:) 无需像您描述的那样创建第二个 dummy函数

Lambda带有 Reserved Concurrency 限制,使您可以设置并发接受的Lambda的最大数量。如果请求数超过该限制,则溢出请求将收到错误500响应。

要设置并发限制,您有几个选择:

控制台

在AWS控制台内部导航到您的lambda,在配置页面中向下滚动到 Concurrency 框,然后选择 Reserved Concurrency (输入所需的数字50) >

enter image description here

命令行

要通过命令行修改保留并发,请使用以下command

aws lambda put-function-concurrency --function-name YOUR_FUNCTION_NAME_HERE --reserved-concurrent-executions 50 

无服务器框架文件

如果使用无服务器框架部署功能,则可以为文件function部分内的任何lambda修改保留并发

service: stackoverflow # NOTE: update this with your service name

provider:
  name: aws
  runtime: python3.7
  stage: ${opt:stage, 'dev'}
  region: ${opt:region, 'us-east-1'}
  profile: ${opt:profile, 'default'}
  environment:
    region: ${self:provider.region}
    stage: ${self:provider.stage}
  stackTags:
    Owner : krapes
    Project : concurrencyLimits
    Service : concurrencyLimits
    Team : brokenLeg
  stackPolicy: # This policy allows updates to all resources
    - Effect: Allow
      Principal: "*"
      Action: "Update:*"
      Resource: "*"

  iamRoleStatements:



functions:
  dummy:
    handler: dummy.main
    timeout: 10
    ## This parameter sets the reserved concurrency for the lambda 'dummy'
    reservedConcurrency: 50
#    events:
#      - http:
#          method: GET
#          path: /dummy
#          resp: json

#plugins:
#  - serverless-python-requirements


custom:
  pythonRequirements:
     dockerizePip: non-linux

现在,当testing您的lambda时,您会看到 with Reserved Concurrency 设置了多余的请求,并返回了错误500代码,从而受到保护系统。

没有保留的并发限制:
Details (average, fastest, slowest):
  DNS+dialup:   0.0009 secs, 2.0200 secs, 6.0415 secs
  DNS-lookup:   0.0002 secs, 0.0000 secs, 0.0185 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0030 secs
  resp wait:    3.5561 secs, 2.0199 secs, 6.0414 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0032 secs

Status code distribution:
  [200] 5000 responses
具有保留的并发限制:
Details (average, fastest, slowest):
  DNS+dialup:   0.0007 secs, 0.0094 secs, 5.6580 secs
  DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0119 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0033 secs
  resp wait:    1.1845 secs, 0.0093 secs, 5.5826 secs
  resp read:    0.0000 secs, 0.0000 secs, 0.0032 secs

Status code distribution:
  [200] 1638 responses
  [500] 3362 responses

上面的输出是使用lambdaLoadTesting工具生成的,没有使用 reservedConcurrency 并将其设置为25。

答案 1 :(得分:0)

您只需在该Lambda函数上将function-level concurrency limit设置为50。

不确定“未经身份验证的凭据”是什么意思?如果您希望客户端直接调用Lambda函数,则客户端需要凭据和允许Lambda调用的关联策略。