通过Lambda生成S3预签名URL时遇CredentialsProviderError问题排查
问题解决:Lambda生成S3预签名URL时的CredentialsProviderError
问题根源
你代码里用了fromIni()加载凭证,这是从本地~/.aws/credentials文件读取凭证的方式。但Lambda运行环境没有这个文件,它是通过IAM执行角色自动获取临时凭证的,指定fromIni()会导致找不到凭证,抛出错误。
修复步骤
删掉S3RequestPresigner配置里的credentials: fromIni()这一行,让AWS SDK自动使用Lambda的默认凭证提供者即可。
修改后的代码:
const createPresignedUrlWithoutClient = async (key) => { const url = parseUrl(`https://${BUCKET_NAME}.s3.${LOCATION}.amazonaws.com/${key}`); const presigner = new S3RequestPresigner({ region: LOCATION, sha256: Hash.bind(null, "sha256"), }); const signedUrlObject = await presigner.presign( new HttpRequest({ ...url, method: "PUT" }), ); return formatUrl(signedUrlObject); };
额外确认
- 确保Lambda的IAM执行角色包含
s3:PutObject权限(对应你生成PUT类型预签名URL的需求),权限策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::你的存储桶名称/*" } ] }
- 确认Lambda执行角色的信任关系配置正确,允许
lambda.amazonaws.com扮演该角色。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

