0
votes

Localstack - Accédez à SNS via java aws sdk: NoSuchFieldError: ENDPOINT_OVERRIDDEN

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. :)


0 commentaires

3 Réponses :


0
votes

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>


0 commentaires

2
votes

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

Code source Github

Bibliothèque: aws-java-sdk-core pour la version 1.11.873


0 commentaires

1
votes

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/


0 commentaires