SAM打包简单Hello World Lambda后CloudFormation模板超1MB如何解决
问题原因及解决方案
一、打包生成28.7M大文件的原因及解决
默认情况下SAM打包会将当前工作目录下所有未被忽略的文件全部打入代码包,没有配置CodeUri和忽略规则的场景下,会把开发依赖、版本控制目录、日志、本地缓存文件等无关内容全部打包,就会出现仅Hello World代码也打出几十M包的情况。
可按以下步骤优化体积:
- 正确配置Lambda函数的
CodeUri属性,指向仅存放业务代码的单独目录(如你提到的src/),不要和配置文件、依赖目录放在同一层级。 - 在项目根目录新增
.samignore文件,和.gitignore规则一致,列出所有不需要打包的内容,示例配置:
# 版本控制目录 .git/ .github/ # 开发环境相关 venv/ node_modules/ __pycache__/ .idea/ .vscode/ # 日志及临时文件 *.log tmp/ dist/ build/ # SAM打包产物 output.yaml *.zip
- 依赖裁剪:安装依赖时仅安装生产必要包,例如Node.js执行
npm install --production,Python执行pip install --target src/ -r requirements.txt --no-dev,排除所有开发调试类依赖。 - 大依赖抽离为Lambda层:如果有公共大依赖,可以单独抽成Lambda层,业务代码包仅放业务逻辑,进一步压缩代码包体积。
二、配置CodeUri后报「模板包含无效字符」的原因及解决
这个报错和CodeUri配置本身无关,基本是以下两个常见原因导致:
1. 模板语法错误
YAML格式对缩进、字符要求非常严格,常见错误点:
- 缩进错误:必须使用2空格缩进,不能用制表符,
CodeUri属性必须放在AWS::Serverless::Function资源的Properties子层级下,示例正确配置:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: app.lambdaHandler Runtime: nodejs18.x
- 模板内存在全角字符、不可见特殊字符:检查是否有全角空格、全角引号、复制粘贴带入的零宽空格等特殊符号,全部替换为半角字符。
2. CloudFormation调用参数填错(最常见原因)
你调用createStack时的TemplateURL参数填错了:
注意:
sam package命令会生成两个产物,一是打包好的代码zip包上传到S3,二是生成替换完代码地址的CloudFormation模板文件output.yaml。TemplateURL参数需要填写的是**output.yaml上传到S3后的访问地址**,而不是代码zip包的地址。你之前把代码zip包的地址填到TemplateURL,CloudFormation会把zip二进制文件当做YAML模板解析,自然会先报大小超限,代码包压缩后又会报无效字符。
正确操作流程:
- 执行
sam package生成output.yaml - 将
output.yaml上传到你的S3存储桶 - 调用
createStack时,TemplateURL填写output.yaml的S3地址即可。
内容的提问来源于stack exchange,提问作者Fernando Santiago
相关产品推荐
相关产品推荐

