Spring Cloud AWS SQS ne parvient pas à se connecter localement au point de terminaison de service


J'essaie d'utiliser AWS SQS de Spring Cloud dans un projet sur lequel je travaille. Pour le moment, je n'exécute l'application que localement sur ma machine de développement. Ainsi, ce que je veux, c'est me connecter au SQS sur AWS sans avoir à déployer mon application sur une instance EC2.

Cependant, il semble que le SDK AWS utilisé dans le package AWS de Spring Cloud tentera de s'authentifier via des métadonnées et souhaite résoudre 169.254.169.254/latest/meta-data/instance-id. Puisque j'exécute toujours l'application localement, le point de terminaison ne peut pas être résolu et une erreur est levée:

2019-12-29 16:38:27.420  WARN 22462 --- [  restartedMain] com.amazonaws.util.EC2MetadataUtils      : Unable to retrieve the requested metadata (/latest/meta-data/instance-id). Failed to connect to service endpoint: 

com.amazonaws.SdkClientException: Failed to connect to service endpoint: 
    at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) ~[aws-java-sdk-core-1.11.699.jar:na]
    at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) ~[aws-java-sdk-core-1.11.699.jar:na]
    at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) ~[aws-java-sdk-core-1.11.699.jar:na]
    at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:62) ~[aws-java-sdk-core-1.11.699.jar:na]
    at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:400) ~[aws-java-sdk-core-1.11.699.jar:na]
    at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:369) ~[aws-java-sdk-core-1.11.699.jar:na]
    at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38) ~[spring-cloud-aws-context-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.cloud.aws.context.annotation.OnAwsCloudEnvironmentCondition.matches(OnAwsCloudEnvironmentCondition.java:37) ~[spring-cloud-aws-context-2.2.1.RELEASE.jar:2.2.1.RELEASE]
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:221) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:587) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE]
...

J'ai essayé de fournir explicitement un point de terminaison SQS dans mon bean, mais il tente toujours de se connecter à 169.254.169.254 entraînant l'erreur ci-dessus:

public AmazonSQSAsync sqsClient() {
   EndpointConfiguration endpointConfig = new AwsClientBuilder.EndpointConfiguration(
        "sqs.us-east-1.amazonaws.com",
        "us-east-1"
   );

   return AmazonSQSAsyncClientBuilder
                .standard()
                .withEndpointConfiguration(endpointConfig)
                .withCredentials(new AWSStaticCredentialsProvider(new DefaultAWSCredentialsProviderChain().getCredentials()))
                .build();
}

Bien que je ne sois pas certain à ce sujet, je soupçonne que l'erreur se produit parce que j'exécute l'application localement sur ma machine de développement et qu'elle ne peut donc pas se résoudre au point de terminaison. Mais je ne suis pas tout à fait sûr à ce sujet aussi parce que j'exécute d'autres services AWS dans la même application en utilisant le SDK AWS et je ne pas avoir cette erreur.

J'ai les dépendances suivantes dans mon pompon.xml et il semble que l'un d'entre eux provoquera l'erreur. Autrement dit, je n'ai même pas besoin de créer les beans pour avoir cette erreur. L'ajout de ces dépendances entraînera immédiatement, pour une raison quelconque, la tentative du SDK de résoudre ce point de terminaison et l'échec avec cette erreur.

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws-messaging</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

Que dois-je faire d'autre pour corriger l'erreur selon laquelle il n'a pas réussi à se connecter au point de terminaison de service?

Author: Carven, 2019-12-29

6 answers

Le problème est avec la version spring-cloud Hoxton.SR8. Remplacez votre version spring-cloud dans votre pom.xml avec Finchley.SR1.

 2
Author: Ronaq Behura, 2020-11-07 11:52:26
  1. Définissez la propriété cloud.aws.region.auto sur false dans les propriétés de l'application Spring (ou via les variables d'environnement, etc.).
  2. Définir la propriété cloud.aws.region.static.

Cela indiquera à Spring de ne pas utiliser de métadonnées EC2 basées sur la détection automatique. Quelques détails .

Vous devrez peut-être configurer les informations d'identification de la même manière, vous pouvez trouver des informations connexes dans le même document.

 1
Author: nickolay.laptev, 2019-12-29 20:37:40

Je recevais le même type d'erreur lors de l'exécution du seau s3 dans spring boot que j'ai résolu en utilisant l'emplacement utilisé lors de la création du seau:

   return AmazonS3ClientBuilder
            .standard()
            .withRegion("us-east-1")  //This is the code i added to fix 
            .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
            .build();
 1
Author: Arjun Gautam, 2020-11-13 08:20:56

Résoudre le problème en ajoutant dans l'application.fichier yaml:

logging:
  level:
    com:
      amazonaws:
        util:
          EC2MetadataUtils: error
 1
Author: jsierra93, 2020-12-07 21:56:34

Pour autant que je sache, il essaie de vérifier si votre application s'exécute sur un environnement cloud, à partir de la 5ème dernière ligne du stacktrace

Org.springframework.nuage.aws.cadre.soutien.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment (AwsCloudEnvironmentCheckUtils.java:38)

J'ai vérifié la la repo et voici l'extrait de code -

public static boolean isRunningOnCloudEnvironment() {
    if (isCloudEnvironment == null) {
        try {
            isCloudEnvironment = EC2MetadataUtils
                    .getData(EC2_METADATA_ROOT + "/instance-id", 1) != null;
        }
        catch (AmazonClientException e) {
            isCloudEnvironment = false;
        }
    }
    return isCloudEnvironment;
}

Selon l'extrait, il a essayé de récupérer l'instance {[3] } et s'il échoue, il return false, ce qui signifie que vous n'êtes pas sur le Cloud Environment. Cependant, ce code devrait attraper AmazonClientExceptionmais le stacktrace que vous avez partagé lève SdkClientException exception, que cette partie de l'extrait ne peut pas catch et ne peut donc pas renvoyer false que vous n'êtes pas sur un environnement cloud.

Semble être un problème avec cette construction de la bibliothèque, Selon la stacktrace que vous utilisez 2.2.1.RELEASE1qui a été publié 9 jours en arrière seulement. Pourriez-vous essayer d'utiliser l'une des anciennes version et signalez ensuite si vous êtes toujours confronté au même problème.


Ou en tant que correctif temporaire, vous pouvez essayer tunneling à votre VPC's entry server. Vous pouvez utiliser sshuttle à des fins de tunneling si vous le souhaitez. Cela rendra la plupart du temps cette adresse IP accessible à partir de la machine locale.

 0
Author: Saurav Kumar Singh, 2019-12-29 10:07:15

Lorsque vous utilisez le SDK AWS Java en dehors d'une instance EC2, vous pouvez désactiver le chargement des informations d'identification ou des régions à partir du service d'instance de métadonnées EC2 avec une propriété système ou une variable d'environnement .

  • Propriété système: com.amazonaws.sdk.disableEc2Metadata
  • Variable d'environnement: AWS_EC2_METADATA_DISABLED

Cependant, vous recevrez toujours un avertissement au démarrage de l'application, il vous indique que EC2Metadata est désactivé par la configuration: "EC2 Instance Metadata Service is désactivé "

2020-03-27 18:10:42.483  WARN 71123 --- [main] com.amazonaws.util.EC2MetadataUtils      : Unable to retrieve the requested metadata (/latest/meta-data/instance-id). EC2 Instance Metadata Service is disabled

com.amazonaws.AmazonClientException: EC2 Instance Metadata Service is disabled
    at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:65)
    at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66)
    at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402)
    at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371)
    at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38)
    ...
 0
Author: nicono, 2020-03-27 17:15:01