amazon-web-services - 尽管使用依赖层 Lambda 函数包仍然很大

标签 amazon-web-services aws-lambda aws-lambda-layers

我有一个 Python Lambda,自从我开始使用 AWS X-Ray 以来,包大小从 445KB 激增到 9.5MB。

enter image description here

为了解决这个问题并加快我的代码部署,我单独打包了我的需求并在我的模板中添加了一个层。 documentation表明这种方法应该有效。

Packaging dependencies in a layer reduces the size of the deployment package that you upload when you modify your code.

pip install --target ../package/python -r requirements.txt
Resources:
  ...

  ProxyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Architectures:
        - x86_64
      CodeUri: proxy/
      Handler: app.lambda_handler
      Layers:
        - !Ref ProxyFunctionLibraries
      Role: !GetAtt ProxyFunctionRole.Arn
      Runtime: python3.8
      Tracing: Active

  ProxyFunctionLibraries:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: proxy-function-lib
      Description: Dependencies for the ProxyFunction.
      ContentUri: package/.
      CompatibleRuntimes:
        - python3.8

然而,这似乎并没有阻止 Lambda 仍然在顶层打包所有东西,我每次部署包仍然是 9.5MB。由于某种原因,新层的大小为 11MB,但只有在进行更改时才会部署。

如何减小 Lambda 函数包的大小?

enter image description here

最佳答案

实际上这里的解决方案非常简单,尽管对于非 Lambda 专家来说并不明显。

如问题中所述,第一步是构建包库。

pip install --target ../package/python -r requirements.txt

但是,当使用 sam build -u 构建 Lambda 时,会使用相同的“requirements.txt”文件,并且再次安装所需的依赖项,这次是作为应用程序的一部分。

所以我所要做的就是删除我希望打包在一个单独层中的需求并重新构建。这确实意味着我必须维护 2x“requirements.txt”,但这完全可以管理。

我打开了一个 issue希望 AWS 会更新他们的文档。

关于amazon-web-services - 尽管使用依赖层 Lambda 函数包仍然很大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71264263/

相关文章:

amazon-web-services - 描述卷中的 ec2-automate-backup 错误

node.js - AWS lambda nodejs 运行时 : io: read/write on closed pipe

python - AWS Lambda 无法从层导入模块

python - Pytest 找不到 Lambda 层中定义的函数

aws-lambda - 创建用户策略以使用特定别名调用 lambda

Python 层图像失败 : "Unable to import module ' lambda_function': cannot import name '_imaging' from 'PIL' "

amazon-web-services - 将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名

amazon-web-services - 无法在 aws 中使用 cfn-hup 更新源代码

java - 为什么我可以从 getClass().getResource() 获取有效的 url,但返回的 url 创建了一个不存在的文件

node.js - 为什么使用 pg-promise AWS Lambda 执行时间很长