Javascript 用于视频文件的AWS S3和Cloudfront CDN

Javascript 用于视频文件的AWS S3和Cloudfront CDN,javascript,node.js,amazon-web-services,amazon-s3,amazon-cloudfront,Javascript,Node.js,Amazon Web Services,Amazon S3,Amazon Cloudfront,我刚刚开始使用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 re

我刚刚开始使用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
})
但现在,当人们到达终点时,我会出现以下错误:

未知点:无法访问的主机: BUCKET\u NAME.CLOUDFRONT\u URL。“us-east-1”地区可能不提供这项服务

从错误信息来看,Cloudfront在美国东部地区不可用,这对我来说很奇怪?我想我只是在代码中配置了一个错误。有什么建议吗

编辑:

我的用例如下所示:

我有一个允许下载视频内容的应用程序。这些视频存储在AWS S3上。由于来自世界各地的人们都在访问这些视频,我的想法是让bucket上的Cloudfront能够在更接近用户的服务器上进行下载,从而获得更好的下载速度

当前,用户请求端点下载一个文件,Node.js服务器将视频文件从S3流式传输给用户


我可能误解了Cloudfront的用例。

这可以通过对给定配置进行一些更改来尝试,如下所示:

更改代码:

const s3 = new aws.S3({
  endpoint: CLOUDFRONT_URL
})  


这应该有帮助

您可以使用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); 


如果这个问题解决了,请告诉我:)

我觉得这个问题不对,在进行S3API调用时,您不能使用CloudFront URL。您正在进行S3 GETobject API调用,这在CloudFront URL上不起作用,CloudFront在简单的HTTP请求上起作用,只需在CloudFront URL上使用nodejs进行一个简单的HTTP/S get调用,它应该对您起作用。这意味着我不能使用JS库?@jones这不是什么意思。。。但要正确回答这个问题,我们需要更清楚地确切地理解你在做什么。通常,CloudFront由浏览器直接访问,而不是由应用程序服务器访问。有很多变体,但第一个问题是为什么Node.js服务器要处理负载。您可以使用浏览器→ 云锋→ S3和避免服务器接触数据流的需要。如果需要控制访问,可以使用预先签名的URL。请查看您是否可以编辑该问题,以提供到目前为止您的选择的更多详细信息。我知道,我已经在我的用例中编辑了CloudFront URL呢?“你的目标”-在那里放什么?是的。您可以将您的CloudFront URL。由于“我可能误解了Cloudfront的用例”而感到困惑。因此,我得到了一个状态代码403,代码为“禁止”,当我尝试这样做的时候。确保你的桶中的对象是公开的。此外,bucket策略必须允许访问s3:GetObject.Aha,通常我可以在不更改权限的情况下正常下载,但如果我想使用CloudFront,我必须这么做?似乎不值得为了获得更快的下载速度而公开所有内容。。。如果我误解了什么,请告诉我。嗯,我对CloudFront的CDN功能很感兴趣。我如何使用此下载url进行流式传输?
   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);