package com.sungardas.enhancedsnapshots.aws; import com.amazonaws.auth.InstanceProfileCredentialsProvider; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.autoscaling.AmazonAutoScaling; import com.amazonaws.services.autoscaling.AmazonAutoScalingClient; import com.amazonaws.services.cloudformation.AmazonCloudFormation; import com.amazonaws.services.cloudformation.AmazonCloudFormationClient; import com.amazonaws.services.cloudwatch.AmazonCloudWatch; import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; import com.amazonaws.services.ec2.AmazonEC2; import com.amazonaws.services.ec2.AmazonEC2Client; import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancing; import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClient; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.AmazonSNSClient; import com.amazonaws.services.sqs.AmazonSQS; import com.amazonaws.services.sqs.AmazonSQSClient; import com.sungardas.enhancedsnapshots.components.RetryInterceptor; import com.sungardas.enhancedsnapshots.util.SystemUtils; import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories; import org.springframework.aop.framework.ProxyFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @Profile("prod") @EnableDynamoDBRepositories(basePackages = "com.sungardas.enhancedsnapshots.aws.dynamodb.repository", dynamoDBMapperConfigRef = "dynamoDBMapperConfig") public class AmazonConfigProvider { private InstanceProfileCredentialsProvider credentialsProvider; @Bean(name = "retryInterceptor") public RetryInterceptor retryInterceptor() { return new RetryInterceptor(); } @Bean public InstanceProfileCredentialsProvider amazonCredentialsProvider() { if (credentialsProvider == null) { credentialsProvider = new InstanceProfileCredentialsProvider(true); } return credentialsProvider; } @Bean(name = "amazonDynamoDB") public ProxyFactoryBean amazonDynamoDbProxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonDynamoDB()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonEC2Proxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonEC2()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonS3Proxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonS3()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public DynamoDBMapperConfig dynamoDBMapperConfig() { DynamoDBMapperConfig.Builder builder = new DynamoDBMapperConfig.Builder(); builder.withTableNameOverride(DynamoDBMapperConfig.TableNameOverride. withTableNamePrefix(getDynamoDbPrefix())); return builder.build(); } @Bean (name = "amazonDynamoDbMapper") public ProxyFactoryBean amazonDynamoDbMapperProxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(dynamoDBMapper()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean(name = "dynamoDB") public AmazonDynamoDB amazonDynamoDB() { AmazonDynamoDB amazonDynamoDB = new AmazonDynamoDBClient(amazonCredentialsProvider()); amazonDynamoDB.setRegion(getRegion()); return amazonDynamoDB; } @Bean(name = "dbMapperWithoutProxy") public DynamoDBMapper dynamoDBMapper() { return new DynamoDBMapper(amazonDynamoDB(), dynamoDBMapperConfig()); } @Bean public ProxyFactoryBean amazonAutoScalingProxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(autoScalingClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonELBProxy() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(elasticLoadBalancingClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonCloudWatch() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(cloudWatchClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonSNS() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonSNSClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonSQS() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonSQSClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } @Bean public ProxyFactoryBean amazonCloudFormation() { ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean(); proxyFactoryBean.setTarget(amazonCloudFormationClient()); proxyFactoryBean.setInterceptorNames("retryInterceptor"); return proxyFactoryBean; } protected AmazonEC2 amazonEC2() { AmazonEC2 amazonEC2 = new AmazonEC2Client(amazonCredentialsProvider()); amazonEC2.setRegion(getRegion()); return amazonEC2; } protected AmazonS3 amazonS3() { AmazonS3 amazonS3 = new AmazonS3Client(amazonCredentialsProvider()); Region current = getRegion(); if (!current.equals(Region.getRegion(Regions.US_EAST_1))) { amazonS3.setRegion(current); } return amazonS3; } protected AmazonSNS amazonSNSClient() { AmazonSNSClient snsClient = new AmazonSNSClient(amazonCredentialsProvider()); snsClient.setRegion(getRegion()); return snsClient; } protected AmazonSQS amazonSQSClient() { AmazonSQSClient sqsClient = new AmazonSQSClient(amazonCredentialsProvider()); sqsClient.setRegion(getRegion()); return sqsClient; } protected AmazonAutoScaling autoScalingClient() { AmazonAutoScalingClient autoScalingClient = new AmazonAutoScalingClient(amazonCredentialsProvider()); autoScalingClient.setRegion(getRegion()); return autoScalingClient; } protected AmazonElasticLoadBalancing elasticLoadBalancingClient() { AmazonElasticLoadBalancingClient elasticLoadBalancingClient = new AmazonElasticLoadBalancingClient(amazonCredentialsProvider()); elasticLoadBalancingClient.setRegion(getRegion()); return elasticLoadBalancingClient; } protected AmazonCloudFormation amazonCloudFormationClient() { AmazonCloudFormation amazonCloudFormation = new AmazonCloudFormationClient(amazonCredentialsProvider()); amazonCloudFormation.setRegion(getRegion()); return amazonCloudFormation; } protected AmazonCloudWatch cloudWatchClient() { AmazonCloudWatchClient cloudWatchClient = new AmazonCloudWatchClient(amazonCredentialsProvider()); cloudWatchClient.setRegion(getRegion()); return cloudWatchClient; } public static String getDynamoDbPrefix() { return getDynamoDbPrefix(SystemUtils.getSystemId()); } public static String getDynamoDbPrefix(String systemId) { return "ENHANCEDSNAPSHOTS_" + systemId + "_"; } protected Region getRegion (){ return Regions.getCurrentRegion(); } }