我正在尝试在我正在处理的项目中使用 Spring Cloud 的 AWS SQS。目前,我只在我的开发机器上本地运行应用程序。因此,我想要的是连接到 AWS 上的 SQS,而不必将我的应用程序部署到 EC2 实例。
但是,似乎 Spring Cloud 的 AWS 包中使用的 AWS SDK 将尝试通过元数据进行身份验证并希望解析 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 SDK 在同一应用程序中运行其他 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>
我还应该做什么来修复它无法连接到服务端点的错误?
原文由 Carven 发布,翻译遵循 CC BY-SA 4.0 许可协议
为 AWS SNS 运行 Spring Boot 项目时,我收到以下错误
已应用的解决方案:将以下代码片段添加到 SpringBootApplication 并单击 IDE 中的运行按钮