AmazonS3Exception: запросить ошибку подписи только на удаленном сервере Linux? - PullRequest
0 голосов
/ 07 октября 2018

Я написал Java-программу для вывода списка всех блоков и загрузки файла в S3-совместимую службу хранения объектов.Программа отлично работает в Windows на моей локальной машине, но когда я (после изменения пути к файлу, который нужно загрузить, конечно) перенесу исполняемый файл jar на удаленный сервер Linux и запустил его, я получаю следующую ошибку:

> Exception in thread "main"
> com.amazonaws.services.s3.model.AmazonS3Exception: The request
> signature we calculated does not match the signature you provided.
> Check your AWS Secret Access Key and signing method. For more
> information, see REST Authentication and SOAP Authentication for
> details. (Service: Amazon S3; Status Code: 403; Error Code:
> SignatureDoesNotMatch; Request ID:
> 4e271b5b-d7f5-42b3-a4ad-886988bcb785; S3 Extended Request ID: null),
> S3 Extended Request ID: null

Кажется, проблема во второй половине программы, так как список сегментов возвращается в linux env.также, но во время загрузки файла выдает ошибку.

import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.S3ClientOptions;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.services.s3.model.Bucket;

/**
 * List your Amazon S3 buckets.
 */
public class ListBuckets
{
    private static void listObjects(AmazonS3 s3) {
        List<Bucket> buckets = s3.listBuckets();
        System.out.println("Your Amazon S3 buckets are:");
        for (Bucket b : buckets) {
            System.out.println("* " + b.getName());
        }
    }
    private static void putObject(AmazonS3 s3, String bucketName, String objectName, String pathName) throws Exception
{

    s3.putObject(bucketName, objectName, new File(pathName));


}
private static void time(String t) {
    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Date date = new Date();
    System.out.println(t+"-->"+dateFormat.format(date));
}
public static void main(String[] args) throws Exception
{
    final String accessKey = "XXXXXXXXXXXXXX";
    final String secretKey = "XXXXXXXXXXXXXXXXXXXXXXXX";
    BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
    @SuppressWarnings("deprecation")
    final AmazonS3 s3 = new AmazonS3Client(credentials);
    S3ClientOptions opts = new S3ClientOptions().withPathStyleAccess(true);
    s3.setS3ClientOptions(opts);

    s3.setEndpoint("https://XXXXXX.com");
    ListBuckets.time("startTime");
    ListBuckets.listObjects(s3);
    //String pathName = "C:\\Users\\XXXXXX\\Documents\\New folder\\New Text Document - Copy.txt";
    String pathName = "/home/abcd/XXXXX/objectStorage/CHANGELOG.mdown";
    ListBuckets.putObject(s3, "snap-shot/sample-aws-ex", pathName, pathName);
    ListBuckets.time("end time");
}

} `

1 Ответ

0 голосов
/ 08 октября 2018

Невероятно!Вы знаете, что проблема была в Linux?Имя объекта и путь - это две разные вещи.

putObject(AmazonS3 s3, String bucketName, String objectName, String pathName)

где pathName - путь к вашему файлу, т.е.

String pathName = "/home/abc/xxxxx/objectStorage/errorlog.txt";

Обратите внимание, что он начинается с косой черты, тогда как имя объекта не должно начинаться с /, т. Е.

String objectName = "home/abc/xxxxxx/objectStorage/errorlog.txt";

Я хотел бы, чтобы выброшенное исключение дало бы лучшую ясность в отношении того, что было не так.Исключение только заставило меня отклониться от основной причины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...