从AWS S3将大文件下载到EC2服务器的首选方法

时间:2019-04-03 13:31:48

标签: node.js amazon-s3

我在从S3到EC2实例下载较大的文件(3.5GB)时遇到一些间歇性问题。大约95%的时间,效果很好,而且非常快-大约30秒。但是,它有5%的时间停滞不前,并且可能需要2多个小时才能下载。重新启动作业通常可以解决此问题-表示该问题是暂时的。这使我认为我下载文件的方式存在问题。下面是我的实现-我将读取流通过管道写入磁盘,并返回一个承诺,该承诺在完成时将解决(或因错误而拒绝)。

这是使用node.js从S3下载大文件的首选方法吗?我应该知道任何“陷阱”吗?

@Component
public class Security { 
    private Security() {}   
    @Value("${auth.username}")
    private String userName;

    @Value("${auth.password}")
    private String password;

    /*
     <SOAP-ENV:Header>
      <wsse:Security soapenv:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
         xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
         <wsse:UsernameToken wsu:Id="UsernameToken-1529498874008" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>test</wsse:Username>
            <wsse:Password>password</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
    </SOAP-ENV:Header>
    */
    public SecurityHeaderType createSecurity () {
        ObjectFactory of = new ObjectFactory();
        UsernameTokenType usernameToken = of.createUsernameTokenType();
        usernameToken.getOtherAttributes().put(new QName("Id"), "UsernameToken-" + System.currentTimeMillis());
        usernameToken.getOtherAttributes().put(new QName("Username"), userName);
        usernameToken.getOtherAttributes().put(new QName("Password"), password);
        SecurityHeaderType securityHeader = of.createSecurityHeaderType();
        securityHeader.getOtherAttributes().put(new QName("mustUnderstand"), "0");
        securityHeader.getAny().add(usernameToken);     
        return securityHeader;
    }   
}

1 个答案:

答案 0 :(得分:0)

默认情况下,到s3的默认流量会通过Internet传输,因此下载速度可能变得不可预测。为了提高下载速度并出于安全原因,您可以配置aws端点,这是一个虚拟设备,可用于通过实例的内部网络将实例之间的流量路由到s3(比通过互联网快得多)。

在为s3创建端点服务时,您需要选择托管应用程序实例的路由表。创建后,您将在诸如destination (com.amazonaws.us-east-1.s3)-> target vpce-xxxxxx之类的路由表中看到一个条目,因此,当流量流向s3时,它将通过端点而不是通过Internet路由。

或者,您也可以尝试并行化下载,例如并行下载字节范围并合并,但是对于3.5GB以上的方法应该可以。