【问题标题】:Node.js get signedurl with AWS EC2 IAM Role Credentials [duplicate]Node.js 使用 AWS EC2 IAM 角色凭证获取签名 URL [重复]
【发布时间】:2020-01-04 17:39:11
【问题描述】:

在我的 Node.js 项目中,我需要使用 AWS IAM 角色在 S3 中获取签名的 url。获取url的部分是这样的

            url = s3.getSignedUrl('getObject', {
                Bucket: myBucket,
                Key: myKey,
                Expires: signedUrlExpireSeconds
            })

我设置了这样的值

var AWS = require('aws-sdk');

AWS.config.update({signatureVersion: 'v4',
region: 'us-east-1'});
AWS.config.credentials = new AWS.EC2MetadataCredentials();
var s3 = new AWS.S3();

当我运行这个时,我得到的网址总是https://s3.amazonaws.com/

但是如果我像这样设置硬编码的凭据,而不是使用AWS.config.credentials = new AWS.EC2MetadataCredentials();,那么它会返回正确的 url

s3.config.update({
    accessKeyId: 'xxx',
    secretAccessKey: 'yyy',
});

据此,https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-iam.html 它应该自动获取凭据,而无需像上面那样设置。 你能告诉我我做错了什么吗?为什么不直接在代码中提供 accesskey 和 secrectkey 就不能工作。

在我们的 Java 项目中,它也可以在不指定这些键的情况下正常工作。但它在 Node.js 中不起作用。

【问题讨论】:

  • 我从来不需要这样做AWS.config.credentials = new AWS.EC2MetadataCredentials() 它只是从 IAM 角色工作
  • @ArunK 谢谢。所以你所做的就像我给的一样?我错过了什么吗?
  • 我会发一个nodejs代码来生成签名,看看对你有没有用
  • 发布了我的代码,它对我有用
  • @ArunK 非常感谢。我会试试的,然后告诉你。

标签: node.js amazon-s3 amazon-ec2 aws-sdk amazon-iam


【解决方案1】:

这是对我有用的 nodejs 代码。我不必传递凭据或任何签名版本配置。

const getPresignedUrl = async (fileName, fileType) => {
  const s3 = new AWS.S3();  // Create a new instance of S3

  // Set up the payload of what we are sending to the S3 api
  const s3Params = {
    Bucket: S3_BUCKET,
    Key: fileName,
    Expires: 5000,
    //ContentType: fileType,
    // ACL: 'public-read',
    ContentType: 'application/octet-stream'
  };
  // Make a request to the S3 API to get a signed URL which we can use to upload our file

  try {
    const data = await s3.getSignedUrlPromise('getObject', s3Params);
    const returnData = {
      signedRequest: data,
      url: `https://${S3_BUCKET}.s3.amazonaws.com/${fileName}`
    };

    return returnData;

  } catch (err) {
    console.log('err: ', err);
  }
}

希望对你有帮助

【讨论】:

  • 我认为 region 给你带来了麻烦。在终端中设置区域并运行您的脚本
  • 你还心动吗
  • 成功了。谢谢你。必须删除“ContentType”部分。
猜你喜欢
  • 2018-01-07
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多