Azure DevOps部署Node.js Serverless到AWS Lambda遇[Errno 13]权限错误
权限拒绝错误排查:部署Node.js Serverless应用到AWS Lambda时的[Errno 13]问题
错误分析
错误日志显示在收集系统文件/run/cloud-init/combined-cloud-config.json和/run/cloud-init/network-config.json时触发权限拒绝,该目录属于root用户,Azure DevOps托管Ubuntu agent的运行用户无读取权限。
排查与修复步骤
1. 隔离触发任务
先定位错误来源:
- 临时注释掉流水线中的
LambdaDeployFunction@1任务,仅运行serverless部署脚本,观察是否仍出现权限错误。- 若错误消失:问题出在
LambdaDeployFunction@1任务的日志收集逻辑,该任务可能默认尝试读取系统级日志文件。 - 若错误仍存在:检查serverless脚本是否有隐含的系统文件读取操作。
- 若错误消失:问题出在
2. 修复LambdaDeployFunction任务问题
如果确认是该任务导致:
- 检查任务配置项,是否存在日志收集相关的开关,尝试关闭该功能。
- 若无法关闭,可改用自定义AWS CLI命令替代该任务的部署逻辑,避免自动日志收集:
- script: | aws lambda update-function-code --function-name "your-function-name" --zip-file fileb://./your-deployment-package.zip --region eu-west-1 env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY) displayName: 'Deploy Lambda via AWS CLI'
3. 优化Serverless部署脚本
针对serverless部署环节,修复潜在权限问题并提升安全性:
- 全局安装serverless时,添加
--unsafe-perm参数绕过权限限制:npm install -g serverless --unsafe-perm - 移除硬编码的AWS密钥,改用Azure DevOps服务连接的环境变量传递:
(需在流水线的服务连接或变量组中配置AWS密钥,避免硬编码泄露)- script: | npm install npm install -g serverless --unsafe-perm serverless deploy --stage local --region eu-west-1 --aws-access-key-id $(AWS_ACCESS_KEY_ID) --aws-secret-access-key $(AWS_SECRET_ACCESS_KEY) env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY) displayName: 'Deploy to AWS via Serverless'
4. 临时绕过非致命错误
如果该权限错误不影响实际部署(仅日志收集失败),可设置任务继续执行:
- task: LambdaDeployFunction@1 inputs: awsCredentials: 'Credential Name' regionName: 'region' deploymentMode: 'codeonly' functionName: 'function name here' codeLocation: 'localfile' continueOnError: true
内容的提问来源于stack exchange,提问作者Nisar
相关产品推荐
相关产品推荐

