Problème connexion bucket S3

Bonjour,

[Platform]
Status=OK
Version=4.0.P23
BuiltOn=2019-12-19 15:12 (revision 0e21e346c607c09a207f9a4d2adfae7b3802becc)
Encoding=UTF-8
EndpointIP=172.17.0.4
EndpointURL=http://3b7b7a6dd67d:8080
TimeZone=Europe/Paris
SystemDate=2020-01-28 15:12:40

Voici la méthode telle qu’elle est décrite dans la doc

public Boolean uploadFileCloud(String credentials, String file, String content) {
		CloudStorageTool cst = null;
		Boolean success = true;
        try {
        	//if (null == this.getGrant()) AppLog.info(getClass(), "uploadFileCloud", "getGrant() == null" , getGrant());
        	//if (null == getGrant().getJSONObjectParameter(credentials)) AppLog.info(getClass(), "uploadFileCloud", "getGrant().getJSONObjectParameter(credentials) == null" , getGrant());
            cst = new CloudStorageTool(getGrant().getJSONObjectParameter(credentials));
            String encoding = Globals.getPlatformEncoding();

            cst.put(new JSONObject()
                .put("name", file)
                .put("mime", HTTPTool.MIME_TYPE_HTML)
                .put("encoding", encoding)
                .put("content", content)
            );

            JSONObject fileJson = cst.get(file, true);
            AppLog.info(getClass(), "display", new String((byte[])fileJson.get("content"), encoding), getGrant());
        } catch (Exception e) {
            AppLog.error(getClass(), "uploadFileCloud", null, e, getGrant());
            success = false;
        } finally {
            if (cst != null) cst.close();
        }
		return success;
	}

à l’appel de cette méthode :

Boolean uploadSuccess = uploadFileCloud(s3Credentials, file, content); 

file = nom du fichier en format String
content = contenu du fichier sous format String
s3Credentials = “SITES_S3_STORAGE” system parameter contenant:

{
    "provider": "aws-s3",
    "accessKeyId": "############",
    "secretAccessKey": "############",
    "bucket": "#######"
}

Un message d’erreur se génère lors de l’appel de cette méthode :

    org.jclouds.aws.AWSResponseException: request POST https://dev-rfs-int.s3.amazonaws.com/renault/all/rfs/Downloads/RaftADFile28012020.txt?uploads HTTP/1.1 failed with code 400, error: AWSError{requestId='E659C88CF2150D7B', requestToken='ZD5NPtoJC8vf0fR2mNTyHRbHt1Ln24cOrNL1eF89hl5oYhcIY1+vXws/YlK/UWpEb3kzmOWRypE=', code='AuthorizationHeaderMalformed', message='The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-west-1'', context='{Region=eu-west-1, HostId=ZD5NPtoJC8vf0fR2mNTyHRbHt1Ln24cOrNL1eF89hl5oYhcIY1+vXws/YlK/UWpEb3kzmOWRypE=}'}
     at org.jclouds.aws.handlers.ParseAWSErrorFromXmlContent.handleError(ParseAWSErrorFromXmlContent.java:76)
     at org.jclouds.http.handlers.DelegatingErrorHandler.handleError(DelegatingErrorHandler.java:65)
     at org.jclouds.http.internal.BaseHttpCommandExecutorService.shouldContinue(BaseHttpCommandExecutorService.java:138)
     at org.jclouds.http.internal.BaseHttpCommandExecutorService.invoke(BaseHttpCommandExecutorService.java:107)
     at org.jclouds.rest.internal.InvokeHttpMethod.invoke(InvokeHttpMethod.java:91)
     at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:74)
     at org.jclouds.rest.internal.InvokeHttpMethod.apply(InvokeHttpMethod.java:45)
     at org.jclouds.rest.internal.DelegatesToInvocationFunction.handle(DelegatesToInvocationFunction.java:156)
     at org.jclouds.rest.internal.DelegatesToInvocationFunction.invoke(DelegatesToInvocationFunction.java:123)
     at com.sun.proxy.$Proxy59.initiateMultipartUpload(Unknown Source)
     at org.jclouds.s3.blobstore.S3BlobStore.initiateMultipartUpload(S3BlobStore.java:370)
     at org.jclouds.blobstore.internal.BaseBlobStore.putMultipartBlob(BaseBlobStore.java:356)
     at org.jclouds.blobstore.internal.BaseBlobStore.putMultipartBlob(BaseBlobStore.java:349)
     at org.jclouds.aws.s3.blobstore.AWSS3BlobStore.putBlob(AWSS3BlobStore.java:79)
     at com.simplicite.util.tools.CloudStorageTool.put(CloudStorageTool.java:193)
     at com.simplicite.objects.RenaultSites.SitesGenerateRaftAD.uploadFileCloud(SitesGenerateRaftAD.java:366)
     at com.simplicite.objects.RenaultSites.SitesGenerateRaftAD.generateRaftAD(SitesGenerateRaftAD.java:301)
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
     at java.base/java.lang.reflect.Method.invoke(Method.java:567)
     at com.simplicite.util.engine.ObjectManager.invokeActionSync(ObjectManager.java:3487)
     at com.simplicite.util.ObjectDirect.invokeAction(ObjectDirect.java:672)
     at com.simplicite.util.ObjectDB.invokeAction(ObjectDB.java:1697)
     at com.simplicite.util.CronJob.run(CronJob.java:356)

Faut il définir la région ? Si oui, dans le code ou dans un paramètre système?..

Merci de votre réponse

Vu le message The authorization header is malformed; the region 'us-east-1' is wrong; expecting 'eu-west-1'

Je pense que le pb c’est que les credentials que vous utilisezcorrespondent à une région incohérente avec la région de votre bucket.

J’ai éliminé cette hypothèse car j’ai essayé de faire un upload à la main
avec l’invit de commande (en utilisant les mêmes credentials) et l’upload a été effectué avec succès.

Avez vous fait des recherches au sujet de ce type d’erreur dans les sites (docs, forums, …) qui parlent d’Apache JClouds ? Comme vous le voyez dans le stacktrace ça se produit assez bas dans les methodes de ces libs tierces…

Or j’ai retesté avec des crédentials AWS et un bucket S3 sur un de mes instances à jour sur la branche “master” et ça marche. A noter que sur cette branche à jour nous avons les même libs JClouds (2.2.0) que sur votre instance P23 pas à jour.

Oui j’ai regardé, Essayé quelques propositions mais pas trouvé une solution qui convient…
Je vais creuser un peu plus.
Merci

Bonjour,

Le problème était lié aux droits attribués pour uploader des fichiers. La connexion est désormais assurée :)

Marwa