Question

Can't use Spaces via Amazon S3 SDK

I’m trying to perform a PUT operation towards Spaces using AWS S3 Java SDK, but I keep getting the same error.

Here’s the definition of the client:

    public AmazonS3 spaces() {
        BasicAWSCredentials credentials = new BasicAWSCredentials(...);
        return AmazonS3ClientBuilder.standard().
                withCredentials(new AWSStaticCredentialsProvider(credentials)).
                withPathStyleAccessEnabled(true).
                withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("bucketname.ams3.digitaloceanspaces.com", "ams3")).
                build();
    }

Here’s usage:

spaces.putObject("bucketname", fullPath, tempFile);

And the error is:

com.amazonaws.services.s3.model.AmazonS3Exception: Bad request (Service: Amazon S3; Status Code: 400; Error Code: 400 Bad request; Request ID: null; S3 Extended Request ID: null)

SDK version:

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.274</version>
        </dependency>

I tried to replace AwsClientBuilder.EndpointConfiguration("bucketname.ams3.digitaloceanspaces.com", "ams3") with AwsClientBuilder.EndpointConfiguration("ams3.digitaloceanspaces.com", "ams3"), but it also didn’t work.

And when I try to GET the file, I surprisingly get a different error:

com.amazonaws.services.s3.model.AmazonS3Exception: null (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: ...; S3 Extended Request ID: ...)

Although I’m pretty sure that I’ve specified key and secret correctly: I double-checked it.

Show comments

Submit an answer

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in Q&A, subscribe to topics of interest, and get courses and tools that will help you grow as a developer and scale your project or business.

I am facing the same issue with AWS SDK: 1.11.528

(surprisingly after almost one and half years this is still not resolved)

Maybe a better strategy is not to claim DO spaces are S3 compatible.

For me it is working fine in Java:

	private static final String DO_ACCESS_KEY = "some_access_key";
	private static final String DO_SECRET_KEY = "some_secret_key";
	private static final String BUCKET_ENDPOINT = "fra1.digitaloceanspaces.com";
	private static final String BUCKET_REGION = "fra1";
	private static final String BUCKET_NAME = "my-bucket-name";

	public String uploadImageToStorage(byte[] byteimage) {
		AWSCredentialsProvider awscp = new AWSStaticCredentialsProvider(
				new BasicAWSCredentials(DO_ACCESS_KEY, DO_SECRET_KEY));

		AmazonS3 space = AmazonS3ClientBuilder
				.standard()
				.withCredentials(awscp)
				.withEndpointConfiguration(
						new AwsClientBuilder.EndpointConfiguration(BUCKET_ENDPOINT, BUCKET_REGION))
				.build();

		InputStream is = new ByteArrayInputStream(byteimage);

		ObjectMetadata om = new ObjectMetadata();
		om.setContentLength(byteimage.length);
		om.setContentType("image/jpg");

		String filepath = "images/users/test/testfile.jpg";
		space.putObject(BUCKET_NAME, filepath, is, om);

		return space.getUrl(BUCKET_NAME, filepath).toString();
	}

I know that the question is old but I faced the same issue and RESOLVED it. In my case, the problem was on the wrong date. The date was set up a few days in the future and I had the issue. After I put the correct date/time everything works fine :-)