gpt4 book ai didi

java - Spring Cloud AWS SQS无法在本地连接到服务端点

转载 作者:行者123 更新时间:2023-12-01 12:11:15 24 4
gpt4 key购买 nike

我正在尝试在一个正在进行的项目中使用Spring Cloud的AWS SQS。目前,我只在我的开发机器上本地运行该应用程序。因此,我想要的是连接到AWS上的SQS,而不必将我的应用程序部署到EC2实例。

但是,似乎Spring Cloud的AWS软件包中使用的AWS开发工具包将尝试通过元数据进行身份验证,并希望解析169.254.169.254/latest/meta-data/instance-id。由于我仍在本地运行应用程序,因此无法解析端点,并引发错误:

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]
...

我试图在我的bean中显式提供SQS端点,但是它仍然尝试连接到 169.254.169.254,从而导致上述错误:
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();
}

尽管我不确定这一点,但我怀疑发生了错误,因为我在开发机器上本地运行该应用程序,因此无法解析为端点。但是我对此也不完全确定,因为我正在使用AWS开发工具包在同一应用程序中运行其他AWS服务,但没有此错误。

我的pom.xml中具有以下依赖项,似乎其中任何一个都会导致发生错误。也就是说,我什至不必创建bean来产生该错误。由于某些原因,添加这些依赖项将立即导致SDK尝试解析该端点,并因该错误而失败。
        <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>

我应该怎么做才能解决无法连接到服务端点的错误?

最佳答案

据我了解,它试图从stacktrace第五行最后一行检查您的应用程序是否在云环境上运行

org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38)



我 checkout 了 repo,这是代码段-
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;
}

按照该片段,它尝试获取实例 metadata,如果失败,则尝试获取 return false,这意味着您不在 Cloud Environment上。但是,此代码有望捕获 AmazonClientException,但是您共享的 堆栈跟踪会引发 SdkClientException异常,该代码段的这一部分无法 catch,因此无法返回不在云环境中的 false

似乎此库构建存在一些问题,根据stacktrace,您使用的是 2.2.1.RELEASE1,该版本仅在 9天发行后才发布。您能否尝试使用 较旧的版本之一,然后报告是否仍然遇到相同的问题。

或者,作为临时解决方案,您可以尝试 隧道传输到 VPC's entry server。您可以根据需要使用 sshuttle进行隧道传输。这大部分将使该IP也可以从本地计算机访问。

关于java - Spring Cloud AWS SQS无法在本地连接到服务端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com