FastAPI部署至AWS Lambda后表单文件上传S3报InvalidAccessKeyId错误问询
问题根因
本地运行时硬编码的密钥有效,部署到Lambda后触发InvalidAccessKeyId报错,常见原因如下:
- 配置的
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量未正确同步到Lambda运行环境,可能是部署时漏填Lambda环境变量配置,或变量名大小写错误、存在隐藏空格等格式问题。 - 使用根用户访问密钥属于AWS强烈不推荐的高危操作,部分区域服务对根用户密钥调用存在额外限制;如果密钥包含特殊字符,自动化部署工具可能存在转义错误,导致运行时实际读取到的密钥和预期不符。
- 硬编码初始化S3客户端的方式会和Lambda默认自带的IAM执行角色权限冲突:boto3在Lambda环境中会优先读取Lambda执行角色的临时凭证,若代码中的凭证变量读取失败(如环境变量未配置),boto3不会使用本地测试用的固定密钥,若代码里写入了空/无效的密钥值,就会触发报错。
解决方案
按优先级从高到低操作:
- 废弃硬编码密钥,改用Lambda执行角色授权 (最推荐)
这是AWS官方推荐的安全方案,不需要在代码中保留任何密钥信息:
- 进入Lambda函数的「配置」-「权限」页面,点击执行角色的跳转链接进入IAM控制台
- 给该执行角色附加允许S3写入的权限策略,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::替换为你的存储桶名称/*" } ] }
- 修改S3客户端初始化代码,删除硬编码的密钥参数:
# 初始化无需传入密钥,boto3会自动读取Lambda执行角色的临时凭证 s3_client = boto3.client('s3')
修改完成后重新部署即可,该方式可彻底规避密钥泄露、配置错误的问题。
- 若需保留固定密钥的写法,先校验Lambda环境变量配置
如果暂时不调整权限配置,先做以下检查:
- 进入Lambda函数的「配置」-「环境变量」页面,确认
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、S3_BUCKET_NAME三个变量的键名和代码中完全一致,值无前后空格,和本地使用的凭证完全相同 - 可在代码中添加临时日志,打印读取到的
AWS_ACCESS_KEY_ID前4位,部署后调用接口查看CloudWatch日志输出,确认读取到的密钥和配置一致(注意不要打印完整密钥到日志,避免泄露)。
额外注意事项
- 禁止使用根用户访问密钥:根用户权限过高,一旦泄露会导致账号全部资产面临风险,建议单独创建IAM用户,仅分配S3上传所需的最小权限后再生成密钥使用。
- 当前代码的异常捕获仅返回错误枚举,未打印具体异常信息,建议捕获异常时将异常详情输出到日志,方便后续排查其他S3相关问题,例如权限不足、存储桶不存在等报错。
内容的提问来源于stack exchange,提问作者Himal Acharya
相关产品推荐
相关产品推荐

