我有一个非常简单的无服务器框架服务。在服务中,我使用
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)
感谢有关规避此问题的正确方法的指导!
您的
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]