Платит реквестер AWS S3 Не работает с TransferManager
Я пытаюсь использовать класс TransferManager в моей java-программе для загрузки файла из Requester Pays Buckets. Я получаю исключение "Код состояния: 403" от Amazon AWS. Я написал простую программу для проверки этой функции и сравнения ее с одним способом подключения файла. Вот мой код:
import java.io.*;
import com.amazonaws.auth.*;
import com.amazonaws.services.s3.*;
import com.amazonaws.services.s3.model.*;
import com.amazonaws.services.s3.transfer.*;
import com.amazonaws.util.IOUtils;
public class RequesterPaysTest {
final static AWSCredentials awsCredentials = new BasicAWSCredentials(MY IAMAccessKey,MY IAMSecretKey);
final static String bucketName = "7268982505fe.mixnode.com";
final static String fileName = "5379-7268982505fe-0-1496081968663.warc.gz";
final static AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
final static AmazonS3 s3client = AmazonS3ClientBuilder.standard().withCredentials(awsCredentialsProvider).withRegion(MY bucketRegion).build();
final static GetObjectRequest getRequest = new GetObjectRequest(bucketName, fileName, true);
static void testSimpleRequesterPays() {
try {
S3Object object = s3client.getObject(getRequest);
InputStream objectData = object.getObjectContent();
FileOutputStream out = new FileOutputStream (new File(fileName));
IOUtils.copy(objectData, out);
out.close();
System.out.println(" Simple RequesterPays successful");
} catch (Exception e) {
System.out.println(" Simple RequesterPays unsuccessful: " + e.getMessage());
}
}
static void testTransferManagerRequesterPays() {
try {
TransferManager tx = TransferManagerBuilder.standard().withS3Client(s3client).build();
Download download = tx.download(getRequest, new File(fileName));
while (download.isDone() == false)
Thread.sleep(10);
System.out.println(" TransferManager RequesterPays successful");
} catch (Exception e) {
System.out.println(" TransferManager RequesterPays unsuccessful: " + e.getMessage());
}
}
public static void main(String[] args) throws IOException {
testSimpleRequesterPays();
testTransferManagerRequesterPays();
}
}
И вот вывод:
Simple RequesterPays successful
TransferManager RequesterPays unsuccessful: Forbidden (Service: Amazon S3; Status Code: 403; Error Code: 403 Forbidden; Request ID: 77D5EBF5EE195A7A)
Как видите, тот же файл можно загрузить простым способом, но не с помощью TransferManager. Я пытался создать свое собственное ведро и играл с разрешениями, но это не сработало. Мне было интересно, если я что-то упустил в моем коде? Или у AWS s3 нет поддержки использования TransferManager на платформе запрашивающей стороны?
1 ответ
Внутри TransferManager используется метод HTTP HEAD вместо GET для загрузки объектов (файлов). Вы можете найти его, отладив код TransferManager SDK. Если в вашем шлюзе aws api нет конфигурации метода HEAD, вам необходимо создать конфигурацию метода HEAD, соответствующую коду TransferManager SDK. Кстати, если ресурс не найден, он должен дать 404, но вы получаете 403. Причина здесь https://forums.aws.amazon.com/thread.jspa?threadID=216684