首页 > 解决方案 > 在启用 KPL/KCL 的情况下启动 Spring Boot 微服务时出错

问题描述

我正在本地启动我的 Spring Boot 微服务,并运行 Localstack。当我开始它时spring.cloud.stream.kinesis.binder.kpl-kcl-enabled=false,它开始就好了。将此值设置为true会导致以下堆栈跟踪:

Unable to load credentials from com.amazonaws.auth.profile.ProfileCredentialsProvider@58faba32: Unable to load credentials into profile [default]: AWS Access Key ID is not specified.
c.a.s.kinesis.producer.KinesisProducer   : Error in child process
java.lang.RuntimeException: Error running child process
at com.amazonaws.services.kinesis.producer.Daemon.fatalError(Daemon.java:533)
at com.amazonaws.services.kinesis.producer.Daemon.fatalError(Daemon.java:513)
at com.amazonaws.services.kinesis.producer.Daemon.access$200(Daemon.java:63)
at com.amazonaws.services.kinesis.producer.Daemon$1.run(Daemon.java:135)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@71435b85: Unable to load credentials from service endpoint, com.amazonaws.auth.profile.ProfileCredentialsProvider@58faba32: Unable to load credentials into profile [default]: AWS Access Key ID is not specified.]
at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:136)
at com.amazonaws.services.kinesis.producer.Daemon.makeSetCredentialsMessage(Daemon.java:565)
at com.amazonaws.services.kinesis.producer.Daemon.startChildProcess(Daemon.java:436)
at com.amazonaws.services.kinesis.producer.Daemon.access$100(Daemon.java:63)
at com.amazonaws.services.kinesis.producer.Daemon$1.run(Daemon.java:133)

Kinesis Cloud Stream Kinesis Binder 2.0.0 版本的发布公告中,它指出“这两个版本的主题是关于使用本地堆栈框架的集成测试,它帮助我们发现了一些错误和竞争条件两个图书馆。”

我将环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY我的 Docker 堆栈使用的其他环境变量一起设置为环境变量,所以我很困惑为什么会收到此错误。

是否需要指定任何其他配置,以便我可以启用 KPL/KCL 并使用 LocalStack 在本地运行和测试它?

标签: spring-cloud-stream

解决方案


当涉及 KPL 时,我的本地堆栈 JUnit 配置如下:

@LocalstackDockerProperties(environmentVariableProvider = LocalStackSslEnvironmentProvider.class,
    services = { "kinesis", "dynamodb", "cloudwatch" })

哪里LocalStackSslEnvironmentProvider有这样的实现:

/**
 * An {@link IEnvironmentVariableProvider} implementation to provide a {@code USE_SSL}
 * environment variable for docker to start a Local Stack in TLS mode.
 * Also this class populates a {@value SDKGlobalConfiguration#DISABLE_CERT_CHECKING_SYSTEM_PROPERTY}
 * system property to disable SSL certificates validation.
 *
 * @author Artem Bilan
 *
 * @since 2.3
 */
public class LocalStackSslEnvironmentProvider implements IEnvironmentVariableProvider {

    static {
        System.setProperty(SDKGlobalConfiguration.DISABLE_CERT_CHECKING_SYSTEM_PROPERTY, "true");
    }

    @Override
    public Map<String, String> getEnvironmentVariables() {
        return Collections.singletonMap("USE_SSL", "true");
    }

}

希望这对你也有帮助。


推荐阅读