仅 AWS S3 JavaScript SDK getSignedUrl returns 基本路径

AWS S3 JavaScript SDK getSignedUrl returns base path only

我有一些非常简单的代码来生成 S3 URL。我从 SDK 返回的 URL 只有 S3 的基本路径。它不包含任何其他内容。为什么会这样?

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

var s3 = new AWS.S3();

console.log(s3.getSignedUrl('getObject', {
  Bucket: 'test',
  Key: 'test'
}));

// Returns "https://s3.amazonaws.com/"

Node.js v0.12.0,AWS SDK 2.1.15 或 2.1.17,Windows 7 64 位,

问题不在于代码。事实证明,当您没有在您的环境中正确设置 AWS 凭证时,AWS SDK 不会抱怨。修复 ~/.aws/credentials 中的凭据解决了问题。

我也遇到了同样的问题。我通过更改以下

获得了正确的输出

AWS_Access_Key_Id = myaccesskeyaws_access_key_id=myaccesskey

与密钥类似。这意味着你不应该在 =

之前和之后使用大写并且没有 space

EC2 IAM 角色

如果您在使用 EC2 IAM 角色(例如在 Fargate 中)时遇到此问题并且您的代码如下所示:

const url = await s3.getSignedUrl('getObject', params);

您应该使用异步回调调用此方法。最简单的可能是使用 Promise 包装。

const url = await new Promise((resolve, reject) =>
    s3.getSignedUrl('getObject', params, (err, url) => {
        if (err) {
          reject(err);
        } else {
          resolve(url);
        }
    }),
);

来自S3 Documentation

Note: You must ensure that you have static or previously resolved credentials if you call this method synchronously (with no callback), otherwise it may not properly sign the request. If you cannot guarantee this (you are using an asynchronous credential provider, i.e., EC2 IAM roles), you should always call this method with an asynchronous callback.

接下来,确保为角色赋予正确的权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "Bucket/*"
        }
    ]
}