我刚写了一个小函数,调用它时会返回我的S3存储桶的预签名网址。它看起来像这样:
import AWS from 'aws-sdk';
AWS.config.update({
accessKeyId: 'process.env.AWS_S3_KEY',
secretAccessKey: 'process.env.AWS_S3_SECRET'
});
const s3 = new AWS.S3({
signatureVersion: 'v4'
});
export const s3Auth = (req, res) => {
s3.getSignedUrl(
'putObject',
{
Bucket: 'mybucket',
Key: 'mykey',
Expires: 60
},
(error, url) => {
if (!error && url) {
res.send({
url
});
} else {
res.status(500);
res.send({ error: 'AWS error!' });
throw error;
}
}
);
};
在第三行,我设置了我的AWS凭据。问题是,我尝试将该部分(
AWS.config.update
)注释掉,它仍然为我生成预签名密钥!知道为什么会这样吗?
答案 0 :(得分:3)
生成预签名URL的行为实际上并不需要调用AWS。它只是使用请求的详细信息(例如存储桶和对象名称)与密钥一起签署请求。
该URL实际上将包含将用于获取对象访问权限的IAM实体的访问密钥,其签名充当URL有效的验证。
如果您的预先签名的URL中出现了访问密钥,则它会从某个位置获取访问密钥 - 在凭证文件,环境变量或分配给服务器的IAM角色中。
答案 1 :(得分:2)
这意味着您在其他地方定义了另一组凭据。最有可能的是:
AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。.aws/credentials
中有凭据存储。查看http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/configuring-the-jssdk.html
的所有可能性