Различные учетные данные для Kinesis Stream, DynamoDB и CloudWatch внутри Spring Cloud Stream

Я использую связыватель Spring Cloud Stream Kinesis (версия 2.1.0)

По соображениям безопасности у меня должен быть один набор учетных данных для Kinesis и другой набор учетных данных для DynamoDB и CloudWatch.

Все работает нормально, если для spring.cloud.stream.kinesis.binder.kplKclEnabled установлено значение false. Но если для него установлено значение true, у меня будет исключение.

com.amazonaws.services.kinesis.model.ResourceNotFoundException: Stream {my_stream} under account {my_account} not found

Трассировка всего стека доступна по адресу https://pastebin.com/bjvKSzrg

Я хотел бы включить KCL, знает ли кто-нибудь, как избежать этой ошибки?

Я знаю, что эта ошибка возникает из-за того, что учетные данные пользователя для cloudwatch и Dynamodb не видят упомянутый поток Kinesis. Но зачем им это видеть? Кроме того, если KCL отключен, он работает должным образом. так что не понимаю, почему это не работает с включенным KCL

Вот мой файл свойств

spring.main.allow-bean-definition-overriding=true
spring.cloud.stream.bindings.input.destination=streamName
spring.cloud.stream.bindings.input.group=worker
spring.cloud.stream.bindings.input.content-type=application/json
spring.cloud.stream.kinesis.bindings.input.consumer.listener-mode=batch
spring.cloud.stream.bindings.input.binder=kinesisConsumer



spring.cloud.stream.binders.kinesisConsumer.type=kinesis
spring.cloud.stream.binders.kinesisConsumer.defaultCandidate=false
spring.cloud.stream.binders.kinesisConsumer.environment.spring.main.sources=com.philips.ka.oneka.kinesis.config.KinesisOutputConfiguration

cloud.aws.stack.auto=false
cloud.aws.credentials.useDefaultAwsCredentialsChain=false
cloud.aws.credentials.instanceProfile=true

spring.cloud.stream.kinesis.binder.kplKclEnabled=true

Упомянутый класс конфигурации

@Configuration
@EnableConfigurationProperties(AwsProperties.class)
public class KinesisOutputConfiguration {
    AwsProperties.Properties properties;

    public KinesisOutputConfiguration(AwsProperties awsProperties) {
        this.properties = awsProperties.getStreamType().get(AwsProperties.StreamType.SPECTRE);
    }

    @Bean(destroyMethod = "shutdown")
    public AmazonKinesisAsync amazonKinesis() {
        RefreshingCredentials refreshingCredentials = new RefreshingCredentials(this.properties.getRefreshed.getUrl(), this.properties.getHsdp().getClientId(),
                this.properties.getRefreshed().getClientSecret(), this.properties.getRefreshed().getUsername(), this.properties.getRefreshed().getPassword(),
                this.properties.getRefreshed().getDiscoveryUrl(), new UriTemplate("{databroker_url}/Stream/$getaccessdetails"),
                new RestTemplate());
        return AmazonKinesisAsyncClientBuilder.standard().withCredentials(credentialsProvider).withRegion("eu-west-1").build();
    }


    @Bean(destroyMethod = "shutdown")
    public AmazonCloudWatchAsync cloudWatch() {
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new BasicAWSCredentials(this.properties.getAccessKey(),
                this.properties.getSecretKey()));
        return AmazonCloudWatchAsyncClientBuilder.standard().withCredentials(credentialsProvider).withRegion("us-east-2").build();
    }

    @Bean(destroyMethod = "shutdown")
    @Primary
    public AmazonDynamoDBAsync dynamoDBAsync() {
        AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(new BasicAWSCredentials(this.properties.getAccessKey(),
                this.properties.getSecretKey()));
        return AmazonDynamoDBAsyncClientBuilder.standard().withCredentials(credentialsProvider).withRegion("us-east-2").build();
    }

}

person Marin Krešo    schedule 11.03.2021    source источник


Ответы (1)


Ваша конфигурация верна: если вам нужно использовать разные учетные данные для этих служб, вам обязательно нужно объявить для них настраиваемые bean-компоненты. DynamoDB и CloudWatch - обязательные службы для клиентской библиотеки Kinesis. Он используется, с одной стороны, для управления смещением от сегментов потока, а с другой - для обработки изменений экземпляров потребителей в кластере для монопольного доступа к сегментам. Итак, действительно факт, что ресурс Kinesis должен быть доступен для пользователей DynamoDB и CloudWatch.

См. Дополнительную информацию в клиентской библиотеке Kinesis или обратитесь в службу поддержки AWS: Kinesis Binder ничего не может сделать для вас в этом вопросе ...

https://docs.aws.amazon.com/streams/latest/dev/monitoring-with-kcl.html

person Artem Bilan    schedule 11.03.2021
comment
Спасибо за быстрый ответ и разъяснения! - person Marin Krešo; 11.03.2021
comment
Привет, @Artem Bilan, эта ветка функций KCL говорит о другом github.com/awslabs/amazon -kinesis-client / pull / 111 Знаете ли вы, что это можно использовать в Spring Cloud Stream? - person Marin Krešo; 12.03.2021
comment
Это достижимо, если также создается KinesisClientLibConfiguration. Одна странность заключается в том, что учетные данные должны быть определены как для компонентов KinesisClientLibConfiguration, так и для компонентов (Kinesis, CloudWatch, DynamoDB). Поскольку 1. Kcl фактически использует учетные данные, определенные в KinesisClientLibConfiguration 2. Построители по умолчанию для kinesis, cloudwatch, Dynamodb не будут работать без явной настройки учетных данных. - person Marin Krešo; 12.03.2021
comment
Это правильно. Поскольку bean-компоненты по умолчанию полагаются на автоматически настраиваемые учетные данные AWS - соглашение о конфигурации. Все остальное - на усмотрение AWS KCL. Или вы видите что-то, что можно улучшить в проекте подшивки? Например, избавьтесь от этих бобов для KCL, но просто позвольте полагаться на KinesisClientLibConfiguration? - person Artem Bilan; 12.03.2021
comment
Да, я хотел бы иметь возможность просто создать KinesisClientLibConfiguration. В настоящее время это не сработает, и мне нужно создать все beans (Kinesis, Cloudwatch, Dynamodb, KinesisClientLibConfiguration). Не уверен, что это проблема связующего или kcl. - person Marin Krešo; 13.03.2021
comment
Пожалуйста, поднимите вопрос в проекте Binder, чтобы я не забыл однажды взглянуть на него. Спасибо - person Artem Bilan; 13.03.2021