我刚刚开始使用AWS S3和Cloudfront服务。 到目前为止,我已经创建了一个S3实例和一个Node.js服务器,该服务器将文件从S3流传输到到达服务器端点的用户。
const params = {
Bucket: BUCKET_NAME,
Key: KEY
};
const obj = s3.getObject(params);
const stream = obj.createReadStream()
stream.pipe(res); // RES is the result send back to user
据我了解,如果您启动CloudFront发行版,您将获得文件的CDN,因此下一步是将Cloudfront添加到我的S3存储桶中。
我的下一个动作是将端点添加到代码中的S3实例中:
const s3 = new aws.S3({
endpoint: CLOUDFRONT_URL
})
现在,当人们到达终点时,我得到以下错误:
UnknownEndpoint:无法访问的主机: BUCKET_NAME。CLOUDFRONT_URL。此服务可能在“ us-east-1”地区不可用。
从错误消息看来,Cloudfront在美国东部地区不可用,这对我来说似乎很奇怪?我以为我在代码中配置它时犯了一个错误。有什么建议吗?
编辑:
我的用例如下:
我有一个允许下载视频内容的应用。这些视频存储在AWS S3上。由于来自世界各地的人们都在访问这些视频,所以我的想法是使存储桶中的Cloudfront能够在离用户更近的服务器上进行下载,从而提高下载速度。
当前,用户要求端点下载文件,然后Node.js服务器将视频文件从S3流传输到用户。
我可能误解了Cloudfront的用例。
答案 0 :(得分:0)
可以通过如下对给定配置进行一些更改来尝试这种操作:
更改代码段:
const s3 = new aws.S3({
endpoint: CLOUDFRONT_URL
})
到
const s3 = new aws.S3({
"accessKeyId": "Access_Key",
"secretAccessKey": "Secret_access_key",
"s3BucketEndpoint": "true",
"endpoint": "YourS3ENDPoint"
})
这应该有帮助!
答案 1 :(得分:0)
您可以使用SDK来获取预签名的URL,以供下载,而不是创建readStream。这样一来,您无需为Cloudfront支付额外费用。
这里是一个例子:
const Aws = require('aws-sdk');
const s3 = new Aws.S3();
Aws.config.update({accessKeyId: 'accessKey created on IAM',
secretAccessKey: 'secretKey created on IAM',
region: 'default region'
});
const download_url = s3.getSignedUrl('getObject', {
Bucket: 'bucket of file',
Key: 'filename of filepath within the bucket',
Expires: 'case you need to expire the url (value in seconds)'})
console.log(download_url);
如果解决了,请告诉我:)