AWS Python Lambda执行偶现PermissionError,疑与update-function-code更新冲突
问题根因
- 打包逻辑存在缺陷:一是原始打包命令多写了一个开头的
zip关键字,部分执行环境下会导致增量打包逻辑异常;二是使用-g参数做增量压缩包更新时,原有压缩包内的同名文件权限不会被本地新修改的文件权限覆盖,即便提前执行了chmod命令修复本地权限,压缩包内的文件仍可能保留错误的旧权限,这是PermissionError偶发的核心原因。 - Lambda更新是异步流程:
aws lambda update-function-code命令返回成功仅代表AWS服务端收到了更新请求,不代表新版本已经完成部署。此时如果有请求进入触发函数加载,会命中部署过程中的竞态条件,Lambda会自动回滚到上一个可用版本,导致本次更新的版本直接失效。
修复方案
- 修正打包逻辑,完全停用增量打包,每次重新生成完整压缩包:
替换原有打包命令为以下内容:# 清理历史压缩包 rm -f lambda_function.zip # 修复权限,使用exec写法避免文件名带空格时命令执行异常 find . -type f -exec chmod 644 {} + find . -type d -exec chmod 755 {} + # 全新打包 zip lambda_function.zip lambda_function.py - 增加打包后校验步骤,确认压缩包内权限正确:
打包完成后执行以下命令,验证文件权限符合要求,校验不通过则终止CI流程:
正常输出的权限位应为unzip -lvl lambda_function.zip | grep lambda_function.py-rw-r--r--,对应644可读权限。 - 调整Lambda更新逻辑,等待部署完成后再结束CI流程:
更新时增加--publish参数生成明确的版本号,同时调用wait命令阻塞到部署完成:aws lambda update-function-code --function-name 替换为你的函数名 --zip-file fileb://lambda_function.zip --publish aws lambda wait function-updated --function-name 替换为你的函数名 - 长期优化建议:使用Lambda别名做流量管理,每次更新先发布独立新版本,冒烟测试验证通过后再将别名的流量切到新版本,可完全避免更新过程中的流量受损,也支持秒级回滚。
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

