2017-04-13 13 views
0

AndroidのAWS SDKを使用してS3からAndroidタブレットにオブジェクトをダウンロードしています。 S3ダウンロードのダウンロード速度を抑えるためにプロキシを経由してトラフィックをルーティングしようとしています(現在はローカルネットワーク上のCharles Proxyをテストベッドとして使用しています)、私はClientConfiguration.setProxyHostとsetProxyPortを使用していますが、S3 TransferUtility設定を無視してプロキシではなくAWS S3に直接移動するように見えます。Android AWS S3 TransferUtilityは、ClientConfigurationのプロキシ設定を自動的に無視します。

プロキシセットのないコードは正常に動作します。オブジェクトは正常にダウンロードされます。プロキシセットのコードはまったく同じように動作し、プロキシはタブレットからの接続を表示しません。

私は、プロキシがAndroidタブレットWifi設定(プロキシを手動で設定)でプロキシホストとポートを設定し、プロキシがプロキシ経由で正常に移動するAWS S3接続を示していることを証明しました。

私はAmazonS3ClientがClientConfigurationを完全に無視していると思っていましたが、ClientConfiguration.setProtocolをHTTPSからHTTPに設定すると、AWS TransferUtilityがAWSエンドポイントとしてhttpからhttpsに変更されることが証明されました。

コードは、私がClientConfigurationとTransferUtilityを使用して見つけることができるプロキシを設定するための他のすべてのサンプルコードと同じように見えます。

ClientConfiguration getClientConfiguration() { 
    return new ClientConfiguration() 
      .withMaxConnections(2) 
      .withProxyHost("192.168.1.137") 
      .withProxyPort(8888) 
      .withConnectionTimeout(30 * 1000) // Wait 30 seconds to make a connection 
      .withSocketTimeout(0); // Keep open connections open indefinitely (we have very large downloads) 
} 
public S3Controller(Context context) { 
    java.util.logging.Logger.getLogger("com.amazonaws").setLevel(java.util.logging.Level.FINEST); 
    applicationContext = context.getApplicationContext(); 

    clientConfig = getClientConfiguration(); 

    s3Client = new AmazonS3Client(getCredentials(), clientConfig); 

    transferUtility = new TransferUtility(s3Client, applicationContext); 

    pendingTransfers = new PendingTransferQueue(); 

} 

// ...後で

TransferObserver observer = transferUtility.download(BuildConfig.S3_BUCKET, key, file); 

あなたは私もプロキシがなしで失敗した場合にいくつかの可視性を取得するために、FINESTにamazonawsのログレベルを設定しようとした見ることができるように追加のログが表示されます。

なぜAWS SDKがプロキシを無視しているのか、またどのようにロギングを設定してどこが失敗しているのか詳細を知ることができますか?

ありがとうございます。

+0

あなたは何SDKバージョンを使用していますか? –

+0

私はaws-android-sdk-coreとaws-android-sdk-s3 v2.3.8を使用していますが、私はそれを現行バージョン(v2.4.0)に変更せずにバンプしました。私はここでは、実行メソッドでプロキシを介して接続を開くカスタムHttpClientを記述することで解決策を強制しましたが、既存のHttpClientクラスの多くを複製します。私はまだもっと洗練されたソリューションを探しています。 –

答えて

1

私は、com.amazonaws.http.ApacheHttpClientクラスをインスタンス化でき、clientConfigで設定されたプロキシを設定するHttpClientFactoryパッケージを使用することを確認しました。

AmazonS3Clientの作成は、以下のように設定されたプロキシを持っているのHttpClientに渡すために別のコンストラクタを使用しています。

HttpClient httpClient = new ApacheHttpClient(clientConfig); 

s3Client = new AmazonS3Client(getCredentialsProvider(), clientConfig, httpClient); 
+0

これはAWS 2.3.3で私にとって役に立ちました – Sebastian