Je joue avec une instance localestack exécutée sur docker. J'essaie d'accéder au service sns, mais je reçois une erreur lors de l'exécution de méthodes telles que "listTopics ()" ou "createTopic ()" Je n'ai pas encore trouvé d'aide sur Google, alors quelqu'un peut-il avoir une idée de ce qui ne va pas ici?
Erreur:
/opt/code/localstack # aws --endpoint-url=http://localhost:4566 sns create-topic --name my_topic { "TopicArn": "arn:aws:sns:us-east-1:000000000000:my_topic" } /opt/code/localstack # aws --endpoint-url=http://localhost:4566 sns list-topics { "Topics": [ { "TopicArn": "arn:aws:sns:us-east-1:000000000000:my_topic" } ] }
J'essaie d'accéder au service localstack sns via le java aws sdk:
version: '2.1' services: localstack: container_name: "localstack" image: localstack/localstack-full network_mode: bridge ports: - "4566-4599:4566-4599" - "${PORT_WEB_UI-8080}:${PORT_WEB_UI-8080}" environment: - SERVICES=s3,sns - DEBUG=${DEBUG- } - DATA_DIR=/tmp/localstack/data - PORT_WEB_UI=${PORT_WEB_UI- } - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- } - KINESIS_ERROR_PROBABILITY=${KINESIS_ERROR_PROBABILITY- } - DOCKER_HOST=unix:///var/run/docker.sock volumes: - "local_vol:/tmp/localstack" - "/var/run/docker.sock:/var/run/docker.sock" volumes: local_vol: driver: local
Le code dans mon application où l'erreur est générée ressemble à ceci:
private String serviceEndpoint = "http://localhost:4566"; private String signingRegion = "eu-west-1"; @Bean public AmazonSNS getSnsClient() { AmazonSNS sns = AmazonSNSClient.builder().withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(serviceEndpoint, signingRegion)).withCredentials(new DefaultAWSCredentialsProviderChain()).build(); System.out.println(sns.listTopics().toString()); return sns; }
J'exécute localstack sur Docker avec ce fichier docker-compose:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-sns</artifactId> <version>1.11.875</version> </dependency>
La création d'un sujet SNS via cmdline fonctionne bien, donc le service est en cours d'exécution!
Caused by: java.lang.NoSuchFieldError: ENDPOINT_OVERRIDDEN at com.amazonaws.services.sns.AmazonSNSClient.executeListTopics(AmazonSNSClient.java:1830) ~[aws-java-sdk-sns-1.11.875.jar:na] at com.amazonaws.services.sns.AmazonSNSClient.listTopics(AmazonSNSClient.java:1812) ~[aws-java-sdk-sns-1.11.875.jar:na] at com.amazonaws.services.sns.AmazonSNSClient.listTopics(AmazonSNSClient.java:1853) ~[aws-java-sdk-sns-1.11.875.jar:na] at com.example.dockerspringboot.DockerSpringBootApplication.getSnsClient(DockerSpringBootApplication.java:62) ~[classes/:na] at com.example.dockerspringboot.DockerSpringBootApplication$$EnhancerBySpringCGLIB$$a65fee3d.CGLIB$getSnsClient$2(<generated>) ~[classes/:na] at com.example.dockerspringboot.DockerSpringBootApplication$$EnhancerBySpringCGLIB$$a65fee3d$$FastClassBySpringCGLIB$$99ad7dfd.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.9.RELEASE.jar:5.2.9.RELEASE] at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE] at com.example.dockerspringboot.DockerSpringBootApplication$$EnhancerBySpringCGLIB$$a65fee3d.getSnsClient(<generated>) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.9.RELEASE.jar:5.2.9.RELEASE] ... 98 common frames omitted
btw.: J'utilise aussi le S3 de localstock, celui-ci fonctionne - ces 2 peuvent-ils entrer en conflit de toute façon?
J'espère que quelqu'un pourrait m'aider, résoudre ce problème. :)
3 Réponses :
Si quelqu'un rencontre cela, je ne pourrais pas trouver le problème réel ici, mais je l'ai fait fonctionner avec le sdk amazon aws pour java 2.0.
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sns</artifactId> <version>2.15.3</version> </dependency>
J'ai également rencontré cette erreur lors de l'utilisation d'AmazonRoute53Client.
Lors de la vérification, il n'y a pas de champ ENDPOINT_OVERRIDDEN sur la classe HandlerContextKey.
Cette classe se trouve dans la bibliothèque aws-java-sdk-core. ENDPOINT_OVERRIDDEN a été ajouté à partir du 1.11.873.
Solution: mettez à jour le aws-java-sdk-core au dernier ou au moins 1.11.873
Je rencontre également le même problème.
L'erreur provient de l'utilisation de 2 bibliothèques AWS différentes qui dépendent chacune d'une version de cœur du SDK AWS différente.
Nous devons nous assurer que les numéros de version sont cohérents. Ils publient des versions mises à jour tous les deux jours: https://github.com/aws/aws-sdk-java/releases
La méthode recommandée pour utiliser les dépendances AWS avec Maven est d'utiliser une nomenclature qui synchronisera les versions de dépendance AWS. Plus d'informations: https://aws.amazon.com/blogs/developer/managing-dependencies-with-aws-sdk-for-java-bill-of-materials-module-bom/