AWS SDK 1.11.844 在连接到 Kinesis Stream 时不断抛出错误
AWS SDK 1.11.844 is throwing Continuously ERROR while connecting to Kinesis Stream
我正在使用 Spring Cloud Data Stream 和 Kinesis Spring Binder 连接到 Kinesis: https://github.com/spring-cloud/spring-cloud-stream-binder-aws-kinesis/blob/master/spring-cloud-stream-binder-kinesis-docs/src/main/asciidoc/overview.adoc
默认情况下,它使用 aws-sdk 1.11.415,在 Kubernetes 环境 (AWS EKS) 中部署时不能将其用于 Assumed Role。我发现我需要将库升级到 aws-sdk 1.11.844 以支持基于 WebIdentityToken 的凭证提供程序。这在 Kubernetes 中有效。现在从我的本地机器上,我试图通过启用实例配置文件(禁用基于 WebIdentityToken 的流程)连接到 Kinesis,它继续抛出以下错误并且不连接。当我评论这个升级后的库时,它会返回到按预期工作的 aws-sdk 1.11.415。但是我需要为基于 WebIdentityToken 的凭据提供程序升级它。
如果有人对此有任何解决方案,请帮助我。我无法更改为 AWS SDKV2,因为 Spring Binder 不支持它。任何其他解决方案都会有所帮助。
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371) ~[aws-java-sdk-core-1.11.844.jar:?]
at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38) ~[spring-cloud-aws-context-2.2.2.RELEASE.jar:2.2.2.RELEASE]
......
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at com.baxter.renal.app.s3.poc.CAPDTreatmentUploadApplication.main(CAPDTreatmentUploadApplication.java:22) [classes/:?]
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.waitForConnect(Native Method) ~[?:?]
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) ~[?:?]
问题是您的本地计算机没有实例配置文件。
如果您查看堆栈跟踪,您会看到 EC2MetadataUtils.getItems()
。这是试图从 instance metadata 端点 http://169.254.169.254
读取。在 returns 快速的 EC2 实例上;在您的本地计算机上它将 time-out 因为该 IP 地址不存在。
如果您希望从本地计算机使用 AWS 服务,则必须使用可在本地检索信息的凭证提供程序。我建议使用 DefaultAWSCredentialsProviderChain,它会查找本地配置(在 $HOME/.aws
中或通过环境变量或系统属性),并且还支持实例配置文件(如果您在 EC2 上 运行实例)。
我在本地遇到了这个问题。关闭 ContextInstanceDataAutoConfiguration
是最好的解决方案。只需添加
spring.autoconfigure.exclude: org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
到您的 application.yml 文件。
我正在使用 Spring Cloud Data Stream 和 Kinesis Spring Binder 连接到 Kinesis: https://github.com/spring-cloud/spring-cloud-stream-binder-aws-kinesis/blob/master/spring-cloud-stream-binder-kinesis-docs/src/main/asciidoc/overview.adoc 默认情况下,它使用 aws-sdk 1.11.415,在 Kubernetes 环境 (AWS EKS) 中部署时不能将其用于 Assumed Role。我发现我需要将库升级到 aws-sdk 1.11.844 以支持基于 WebIdentityToken 的凭证提供程序。这在 Kubernetes 中有效。现在从我的本地机器上,我试图通过启用实例配置文件(禁用基于 WebIdentityToken 的流程)连接到 Kinesis,它继续抛出以下错误并且不连接。当我评论这个升级后的库时,它会返回到按预期工作的 aws-sdk 1.11.415。但是我需要为基于 WebIdentityToken 的凭据提供程序升级它。
如果有人对此有任何解决方案,请帮助我。我无法更改为 AWS SDKV2,因为 Spring Binder 不支持它。任何其他解决方案都会有所帮助。
com.amazonaws.SdkClientException: Failed to connect to service endpoint:
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:100) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.EC2ResourceFetcher.doReadResource(EC2ResourceFetcher.java:70) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.InstanceMetadataServiceResourceFetcher.readResource(InstanceMetadataServiceResourceFetcher.java:75) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.internal.EC2ResourceFetcher.readResource(EC2ResourceFetcher.java:66) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.util.EC2MetadataUtils.getItems(EC2MetadataUtils.java:402) ~[aws-java-sdk-core-1.11.844.jar:?]
at com.amazonaws.util.EC2MetadataUtils.getData(EC2MetadataUtils.java:371) ~[aws-java-sdk-core-1.11.844.jar:?]
at org.springframework.cloud.aws.context.support.env.AwsCloudEnvironmentCheckUtils.isRunningOnCloudEnvironment(AwsCloudEnvironmentCheckUtils.java:38) ~[spring-cloud-aws-context-2.2.2.RELEASE.jar:2.2.2.RELEASE]
......
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at com.baxter.renal.app.s3.poc.CAPDTreatmentUploadApplication.main(CAPDTreatmentUploadApplication.java:22) [classes/:?]
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.waitForConnect(Native Method) ~[?:?]
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) ~[?:?]
问题是您的本地计算机没有实例配置文件。
如果您查看堆栈跟踪,您会看到 EC2MetadataUtils.getItems()
。这是试图从 instance metadata 端点 http://169.254.169.254
读取。在 returns 快速的 EC2 实例上;在您的本地计算机上它将 time-out 因为该 IP 地址不存在。
如果您希望从本地计算机使用 AWS 服务,则必须使用可在本地检索信息的凭证提供程序。我建议使用 DefaultAWSCredentialsProviderChain,它会查找本地配置(在 $HOME/.aws
中或通过环境变量或系统属性),并且还支持实例配置文件(如果您在 EC2 上 运行实例)。
我在本地遇到了这个问题。关闭 ContextInstanceDataAutoConfiguration
是最好的解决方案。只需添加
spring.autoconfigure.exclude: org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
到您的 application.yml 文件。