无服务器框架,Python 服务太大

问题描述 投票:0回答:1

我有一个非常简单的无服务器框架服务。在服务中,我使用

serverless-python-requirements
插件进行部署。我能够从我的本地机器成功部署,但在我的 CI/CD 管道中部署失败:

UPDATE_FAILED:AzurePhishSimReportFunctionLambdaFunction(AWS::Lambda::Function) 资源处理程序返回消息:“解压缩的大小必须小于 262144000 字节(服务:Lambda,状态代码:400,请求 ID:2b53c48c-adb8-45b8-8844-8bfb317612bb)”(RequestToken:126200f8-fd75-9bd8-4c0e-6ebf4d0c4e40 , HandlerErrorCode: InvalidRequest)

从我的本地机器部署时,服务被压缩成一个小包:

上传服务 azure-phishing-simulation-reporter.zip 文件到 S3 (16.58 MB)

但是,从 CI/CD 部署时,包明显更大:

上传服务 azure-phishing-simulation-reporter.zip 文件到 S3 (136.71 MB)

我的理解是这可能是因为本地缓存,但是下面提出的解决方案没有效果。 https://forum.serverless.com/t/different-package-sizes-when-deploying/7819/2。无论如何,我并不过分担心这一点,因为我计划通过 CI/CD 进行部署。

一个不幸的现实——该服务只有三个高级需求:

azure-phishing-simulation-reporter ➜  /bin/cat Pipfile
...

[packages]
requests = "*"
boto3 = "*"
msal = "*"

...

查看需求目录,很明显 botocore(boto3 的 dep)和 cryptography(所有三个的 dep)是主要问题:

azure-phishing-simulation-reporter ➜  du -s .serverless/requirements/* | sort -nr
154592  .serverless/requirements/botocore
31528   .serverless/requirements/cryptography
2088    .serverless/requirements/boto3
1264    .serverless/requirements/pycparser
976 .serverless/requirements/dateutil
936 .serverless/requirements/charset_normalizer
920 .serverless/requirements/urllib3
800 .serverless/requirements/cffi
632 .serverless/requirements/msal
600 .serverless/requirements/s3transfer
576 .serverless/requirements/certifi
568 .serverless/requirements/idna
440 .serverless/requirements/requests
424 .serverless/requirements/_cffi_backend.cpython-39-darwin.so
160 .serverless/requirements/jwt
160 .serverless/requirements/jmespath
72  .serverless/requirements/six.py
16  .serverless/requirements/bin
8   .serverless/requirements/requirements.txt

虽然可能,但我读到依赖 AWS Lambda 运行时提供 boto3 库和与 botocore 捆绑的请求库是不好的做法:https://github.com/serverless/serverless-python-requirements/issues/ 304#issuecomment-455359902

大家好。我是 AWS 的 SA。

我们的主要做法是将您自己的 boto 版本作为处理程序 zip 的一部分或作为层(对于较大的项目)与您的应用程序代码一起发布。

现在我尝试了什么,这几乎是 serverless-python-requirements 插件原生的每个选项(https://www.serverless.com/plugins/serverless-python-requirements):

  • 拉链
  • 苗条

我还尝试通过 serverless.yml 中的以下块排除文件/目录:

package:
  patterns:
    - '!.git/**'
    - '!test/**'
    - '!e2e/**'
    - '!src/**'
    - '!node_modules/**'
    - '!venv/**'
    - '!__pycache__/**'
    - '!requirements.txt'
    - '!Pipfile'
    - '!Pipfile.lock'
    - '!README.md'

没有任何作用。我觉得这应该是一个容易解决的问题,并且发现 AWS 自己的库基本上负责导致不符合其自身大小限制的臃肿部署包,这令人沮丧。我对使用层寄予厚望,并震惊地发现层与部署包相比很小:

上传服务 azure-phishing-simulation-reporter.zip 文件到 S3 (119.5 MB)

上传服务 pythonRequirements.zip 文件到 S3 (17.77 MB)

感谢有关规避此问题的正确方法的指导!

python serverless-framework
1个回答
0
投票

您的

patterns
列表基本上包括所有最常见的目录和文件,以防止包装。

请记住,根文件夹中的所有内容都将打包在可部署的 zip 中,因此,我建议您在根文件夹中运行

du
命令,并查看隐藏文件。

另一个建议是做一个

git clean -xdfn
看看 git 没有跟踪什么,如果列表中没有什么对你很重要,那么做一个
git clean -xdf
并尝试无服务器部署,就像你在 CI 环境中一样您的存储库/分支的新副本。

第一:

git clean -xdf

然后:

 npm install -g serverless serverless-python-requirements

最后:

serverless deploy --stage [stage] --aws-profile [profile]
© www.soinside.com 2019 - 2024. All rights reserved.