Accept Once Filter Using Redis MetadataStore
Accept Once Filter Using Redis MetadataStore
References:
https://jira-agile.mbopartners.com/browse/DO-9831
https://jira-agile.mbopartners.com/browse/DO-10211
https://jira-agile.mbopartners.com/browse/DO-10374
For Development
https://jira-agile.mbopartners.com/browse/DO-11243
https://jira-agile.mbopartners.com/browse/DO-10050
After getting access to AWS, follow below steps to verify your access to
redis:
#!/bin/bash
mfa_device="arn:aws:iam::XXX:mfa/YYY"
echo -e "AWS_ACCESS_KEY_ID=${access_key}\nAWS_SECRET_ACCESS_KEY=$
{secret_key}\nAWS_SESSION_TOKEN=${session_token}" > ~/mfa.env
6. Update your User details in above script by replacing XXX and YYY
with proper values.
7. Execute above script in your terminal with command sh
aws_mfa_auth.sh
8. Enter your One Time Passcode from your configured identity provider
for AWS account.
9. You should be getting response similar to below output.
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=YYY
export AWS_SESSION_TOKEN=ZZZ
10. If you get the values then you are properly configured with
Redis. If not, please check with Dev-Ops team.
package com.mbopartners.api.common.redis.config.test;
import com.mbopartners.api.common.redis.config.IAMAuthTokenRequest;
import
com.mbopartners.api.common.redis.config.RedisIAMAuthCredentialsProvider;
public class RedisPasswordGenerator {
public static void main(String[] args) {
RedisIAMAuthCredentialsProvider
redisIAMAuthCredentialsProvider = new RedisIAMAuthCredentialsProvider();
IAMAuthTokenRequest iamAuthTokenRequest = new
IAMAuthTokenRequest();
iamAuthTokenRequest.setReplicationGroupId("preprod-
elasticache-redis");
iamAuthTokenRequest.setRegion("us-east-1");
iamAuthTokenRequest.setAccessTokenRefreshInSeconds("900");
redisIAMAuthCredentialsProvider.setAccessTokenRefreshInSeconds("900");
iamAuthTokenRequest.setUserId("XXX");
redisIAMAuthCredentialsProvider.setUserId("XXX");
redisIAMAuthCredentialsProvider.setSessionId("YYY");
redisIAMAuthCredentialsProvider.setAccessKeyId("ZZZ");
redisIAMAuthCredentialsProvider.setSecretAccessKey("WWW");
redisIAMAuthCredentialsProvider.setIamAuthTokenRequest(iamAuthTokenRequest)
;
redisIAMAuthCredentialsProvider.init();
System.out.println("PASSWORD: " +
redisIAMAuthCredentialsProvider.getIamAuthToken());
}
}
redis-cli -c -h clustercfg.preprod-elasticache-
redis.8stnx9.use1.cache.amazonaws.com -p 6379 --tls --user XXX -a 'YYY'
"value"
5.Now redis is ready for integration
<dependency>
<groupId>com.mbopartners</groupId>
<artifactId>api-redis</artifactId>
<version>0.0.55</version>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-redis</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>auth</artifactId>
<version>2.20.150</version>
</dependency>
spring:
application:
name: non-vms-transformer
session:
store-type: ${SESSION_STORE_TYPE:none}
cache:
type: ${APP_CACHE_TYPE:simple}
redis:
key-prefix: ${REDIS_KEY_PREFIX:dev::}
use-key-prefix: true
redis:
host: ${REDIS_HOST:clustercfg.preprod-elasticache-
redis.8stnx9.use1.cache.amazonaws.com}
port: ${REDIS_PORT:6379}
ssl: true
cluster:
nodes: ${spring.redis.host}:${spring.redis.port}
aws:
userId: ${REDIS_USER_ID:xxxx}
accessKeyId: ${REDIS_CACHE_USERNAME:yyyyy}
secretAccessKey: ${REDIS_CACHE_PASSWORD:zzzzzzz}
replicationGroupId: ${REDIS_REPLICATION_GROUP_ID:preprod-elasticache-
redis}
region: ${REDIS_REGION:us-east-1}
sessionId:
accessTokenRefreshIntervalInSeconds: 900
connect-timeout: 100000
client-type: ${REDIS_CLIENT_TYPE:jedis}
filepoller:
metadatastore: redis
metadatakey: local::non-vms-transformer-input-file-metadata
If we are using redis session, add below configurations to configure with redis
session.
spring:
session:
store-type: ${SESSION_STORE_TYPE:redis}
redis:
flush-mode: on_save
cleanup-cron: "0 */30 * * * *"
configure-action: none
namespace: ${REDIS_KEY_PREFIX:dev::}${spring.application.name}
save-mode: always
3. Update spring.redis.aws.sessionId with AWS_SESSION_TOKEN
4. Update spring.redis.key-prefix based on env with format env::
5. Update spring.redis.aws.userId with data provided from Dev-Ops for each env
(refer https://jira-agile.mbopartners.com/browse/DO-10374)
6. Update spring.redis.aws.replicationGroupId with data provided from Dev-
Ops for each env (refer https://jira-agile.mbopartners.com/browse/DO-
10374)
7. If redis session is enabled, update 'spring.session.redis.namespace' with proper
env and app name.
8. Now Redis integration is completed.
@Configuration
@Data
public class RedisMetadataStoreConfig {
@Value("${filepoller.metadatakey}")
private String filePollerMetaDataKey;
@Bean
public RedisMetadataStore redisMetadataStore(JedisConnectionFactory
jedisConnectionFactory) {
return new
RedisMetadataStore(jedisConnectionFactory,filePollerMetaDataKey);
}
}
@Bean
S3PersistentAcceptOnceFileListFilter acceptOnceFilter(){
return new
S3PersistentAcceptOnceFileListFilter(metadataStore,bucketName);
}
@Bean
public CompositeFileListFilter compositeFileListFilter(){
CompositeFileListFilter compositeFileListFilter = new
CompositeFileListFilter();
compositeFileListFilter.addFilter(acceptOnceFilter());
compositeFileListFilter.addFilter(new
S3RegexPatternFileListFilter(".*\\.csv$"));
return compositeFileListFilter;
}
@Bean
@InboundChannelAdapter(value = AppConstant.NONVMS_INBOUND_CHANNEL_ADAPTER,
poller = @Poller(fixedDelay = "${nonvms.job.fixed.delay.milliseconds}"))
public MessageSource<InputStream>
nonVMSTransformerInboundStreamingMessageSource() {
S3StreamingMessageSource messageSource = new
S3StreamingMessageSource(nonVMSTransformerTemplate());
messageSource.setRemoteDirectory(bucketName.concat(AppConstant.SLASH).conca
t(inFolderPath));
messageSource.setFilter(compositeFileListFilter());
messageSource.setMaxFetchSize(1);
return messageSource;
}
Disabling redis
spring:
session:
# Disable redis session management
store-type: none
cache:
# Disable caching including redis. Update to SIMPLE to use in memory
cache
type: none
redis:
aws:
userId: ${REDIS_USER_ID:redis-app-dev-svc}
accessKeyId: ${REDIS_CACHE_USERNAME:xxx}
secretAccessKey: ${REDIS_CACHE_PASSWORD:yyy}
replicationGroupId: ${REDIS_REPLICATION_GROUP_ID:preprod-elasticache-
redis}
region: ${REDIS_REGION:us-east-1}
sessionId:
accessTokenRefreshIntervalInSeconds: 900
connect-timeout: 100000
# Update client-type to lettuce to stop redis config issue after
disabling redis
client-type: ${REDIS_CLIENT_TYPE:lettuce}