Amazon web services AWS Lambda帐户并发,限制

Amazon web services AWS Lambda帐户并发,限制,amazon-web-services,aws-lambda,aws-api-gateway,Amazon Web Services,Aws Lambda,Aws Api Gateway,出于性能原因,我正在考虑不使用API网关。相反,我想直接向web公开lambda函数。需要未经验证的IAM凭据,并由AWS JavaScript SDK提供。我意识到,如果一个坏演员试图以天文数字般的速度调用我的函数,并导致重大的计费问题,这可能会引起关注。我不认为这是可能的,因为有人会专门针对我的应用程序,请求IAM凭据,然后调用请求。。。做了很多工作,收获很少,但是 为了保护Lambda函数不受攻击,我考虑了帐户并发特性。默认情况下,帐户并发功能限制为帐户上的1000个并发请求。我能够指定特

出于性能原因,我正在考虑不使用API网关。相反,我想直接向web公开lambda函数。需要未经验证的IAM凭据,并由AWS JavaScript SDK提供。我意识到,如果一个坏演员试图以天文数字般的速度调用我的函数,并导致重大的计费问题,这可能会引起关注。我不认为这是可能的,因为有人会专门针对我的应用程序,请求IAM凭据,然后调用请求。。。做了很多工作,收获很少,但是

为了保护Lambda函数不受攻击,我考虑了帐户并发特性。默认情况下,帐户并发功能限制为帐户上的1000个并发请求。我能够指定特定于Lambda函数的保留并发性,该函数可以减少剩余的总体帐户并发限制(帐户其余部分的并发限制)

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

想法?

您可以简单地将Lambda函数的值设置为50

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

您只需将Lambda函数设置为50即可


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

如您所述,作为一种保护形式的节流是完全可行的:) 并且不需要像您描述的那样创建第二个伪函数

lambda附带一个保留的并发限制,允许您设置最大数量的并发接受lambda。如果请求数超过该限制,溢出请求将收到错误500响应

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

控制台 在AWS控制台内,导航至lambda,在配置页面中向下滚动至并发框,并选择保留并发(输入所需的数字50)

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

无服务器框架文件 如果使用无服务器框架部署函数,则可以修改文件
函数
部分中任何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
现在,当您使用lambda时,您将看到使用保留并发设置时,多余的请求返回了一个错误代码500,从而保护了系统

无保留并发限制: 具有保留的并发限制:
上面的输出是使用工具生成的,没有reservedConcurrency,并且设置为25

您所描述的节流作为一种保护形式是完全可行的:) 并且不需要像您描述的那样创建第二个伪函数

lambda附带一个保留的并发限制,允许您设置最大数量的并发接受lambda。如果请求数超过该限制,溢出请求将收到错误500响应

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

控制台 在AWS控制台内,导航至lambda,在配置页面中向下滚动至并发框,并选择保留并发(输入所需的数字50)

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

无服务器框架文件 如果使用无服务器框架部署函数,则可以修改文件
函数
部分中任何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
现在,当您使用lambda时,您将看到使用保留并发设置时,多余的请求返回了一个错误代码500,从而保护了系统

无保留并发限制: 具有保留的并发限制:
上面的输出是使用工具生成的,没有reservedConcurrency,并且设置为25

谢谢。您知道由于保留并发而被阻止的lambda请求是否仍在计费吗?我想不会,但我可能误解了账单。我不这么认为,lambda是根据调用和持续时间收费的。在这个lambda上运行测试之后,调用度量在被reserved concurrency参数限制时显示了一个较低的计数。这500个错误似乎从未“启动”过lambda。@Cliff你的问题激发了我在github上发布(经过一点清理)的灵感。。。如果你有时间,我很想听听你的意见。谢谢。您知道由于保留并发而被阻止的lambda请求是否仍在计费吗?我想不会,但我可能误解了账单。我不这么认为,lambda是根据调用和持续时间收费的。在这个lambda上运行测试之后,调用度量在被reserved concurrency参数限制时显示了一个较低的计数。这500个错误似乎从未“启动”过lambda。@Cliff你的问题激发了我在github上发布(经过一点清理)的灵感。。。如果您有时间的话,我很想听听您的意见。“出于性能原因,我正在考虑不使用API网关。”问题的其余部分是以这一点为前提的。您认为API网关中存在什么性能问题?这似乎是一个解决错误问题的潜在案例,而且很难做到。我也想了解您面临的性能问题是什么?API网关是一个ab层
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