以“虚拟托管样式”格式生成 S3 URL

rea*_*dul 6 amazon-s3 amazon-web-services pre-signed-url aws-lambda

我在 AWS Lambda 上使用 Javascript SDK 来生成签名 URL。但getSignedUrl仅返回路径样式的URL。我尝试过设置s3ForcePathStyle为 false。

const params = {
    Bucket: 'bucket_name',
    Key: 'key_name'
};

const options = {
    signatureVersion: 'v4',
    useAccelerateEndpoint: false,
    // endpoint: new AWS.Endpoint('https://bucket_name.s3.amazonaws.com'),
    s3ForcePathStyle: false 
};

const client = new AWS.S3(options);
exports.handler = async (event) => {

    const signedURL = await (new Promise((resolve, reject) => {
        client.getSignedUrl('putObject', params, (err, data) => {
            if (err) {
                reject(err);
            } 
            else {
                resolve(data);
            }
         });
    }));
    return signedURL;
};

Run Code Online (Sandbox Code Playgroud)

如果我取消注释,endpoint: new AWS.Endpoint('https://bucket_name.s3.amazonaws.com')我会得到一个结合了两者的荒谬 URL:

https://bucket_name.s3.amazonaws.com/bucket_name/key_name......
Run Code Online (Sandbox Code Playgroud)

太长了;博士

https://s3.ap-south-1.amazonaws.com/bucket_name/key_name..... # Code returns path-style
https://bucket_name.s3.amazonaws.com/key_name..... # I want virtual-hosted-style
Run Code Online (Sandbox Code Playgroud)

小智 0

如果您拥有对象的密钥,则还有另一种方法,即为预签名者提供虚拟托管样式格式的未签名 URL。

const unsignedUrl = parseUrl("https://bucket_name.s3.region.amazonaws.com/key_name")
const presigner = new S3RequestPresigner({
    credentials,
    region,
    sha256: Hash.bind(null, "sha256")
});
const signedURL = await presigner.presign(new HttpRequest(unsignedUrl))
return formatUrl(signedURL)
Run Code Online (Sandbox Code Playgroud)

请参阅 2021 年的这篇博文(带有对象 url)和当前文档