Lambda函数生成S3预签名URL提示Access key不存在如何解决
问题根因
你返回的错误中AWSAccessKeyId为AKIAJ4LNLEBHJ5LTJZ5A,AKIA前缀是AWS长期用户凭证的标识,而Lambda执行角色自动注入运行环境的是ASIA前缀的临时凭证(还会附带SessionToken参数)。这说明你的AWS SDK在Lambda运行时读取到了优先级更高的无效凭证,覆盖了Lambda自带的执行角色凭证。
最常见的原因是你打包lambda.zip部署包时,把本地开发环境的.aws/credentials凭证文件、或者存储了硬编码AWS长期凭证的配置文件一同打进了部署包,AWS SDK默认会优先读取本地凭证文件的配置,而这个长期凭证可能已经被删除、禁用或者权限不匹配,导致生成的预签名URL使用了无效的密钥。
排查修复步骤
- 检查打包配置:在打包lambda.zip时排除项目内的
.aws目录、本地.env等存储了AWS凭证的文件,不要将其包含在部署包中。 - 检查Lambda环境变量:确认你的Lambda配置中没有手动设置
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY这类硬编码的长期凭证变量,手动设置的环境变量优先级也高于Lambda自带的执行角色凭证,如有请删除。 - 可选校验:你可以在生成预签名URL的代码中临时加一行日志打印
AWS.config.credentials,确认实际使用的凭证前缀是否为ASIA,如果还是AKIA就说明存在更高优先级的凭证来源需要清理。
常见疑问解答
- Lambda内调用
getSignedUrl()不需要显式传入凭证,只要没有更高优先级的凭证来源覆盖,SDK会自动获取Lambda执行角色的临时凭证生成签名。 - 用Lambda执行角色临时凭证生成的预签名URL最长有效期为36小时(129600秒),如果需要更长有效期的预签名URL才需要专门使用长期凭证生成。
内容的提问来源于stack exchange,提问作者Wintermute
相关产品推荐
相关产品推荐

