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

时间:2019-04-10 15:24:16

标签: 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 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的用例。

2 个答案:

答案 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); 

如果解决了,请告诉我:)