#java #amazon-web-services #spring-boot #amazon-dynamodb #microservices
#java #amazon-веб-сервисы #spring-boot #amazon-dynamodb #микросервисы
Вопрос:
Я работаю над приложением Spring Boot на базе микросервиса REST, и поддерживаемая база данных в настоящее время является локальной базой данных Dynamodb. Я могу выполнять вызовы REST с помощью Postman для своего приложения, работающего локально, и могу выполнять операции CRUD с локальной базой данных dynamodb. Теперь я хочу внести изменения в конфигурацию, чтобы всякий раз, когда я выполняю аналогичные операции CRUD в своем локальном приложении, данные должны сохраняться / обновляться в реальном DynamoDB, работающем на AWS, а не локальном. В принципе, я хочу указать приложению на удаленную конечную точку DynamoDB. Возможно ли это? Существует ли какой-либо образец справочного руководства для внесения таких изменений в конфигурацию?
В настоящее время это мой класс конфигурации и файл свойств:-
package com.user.profile.jpa;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig;
import com.amazonaws.util.StringUtils;
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
//@Profile("dev")
@Configuration
@EnableDynamoDBRepositories(basePackages = "com.user.profile.jpa")
public class DynamoDbConfig {
@Value("${amazon.dynamodb.endpoint}")
private String amazonDynamoDBEndpoint;
@Value("${amazon.dynamodb.region}")
private String amazonDynamoDBRegion;
@Value("${amazon.aws.accesskey}")
private String accessKey;
@Value("${amazon.aws.secretkey}")
private String secretKey;
@Bean
public AmazonDynamoDB amazonDynamoDB() {
AmazonDynamoDB dynamoDB = new AmazonDynamoDBClient(amazonAWSCredentials());
if (!StringUtils.isNullOrEmpty(amazonDynamoDBEndpoint)) {
dynamoDB.setEndpoint(amazonDynamoDBEndpoint);
}
return dynamoDB;
}
@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(accessKey, secretKey);
}
}
amazon.dynamodb.endpoint=http://localhost:8000/
amazon.aws.accesskey=JGDSGJSGS8729224
amazon.aws.secretkey=HJKAHDD83ERWRnHAHDJASD8782rlGb0F1k2Ijg
amazon.dynamodb.region="us-east-1"
spring.main.allow-bean-definition-overriding=true
spring.profiles.active=dev
server.port=8090
Пожалуйста, помогите. Спасибо
Ответ №1:
Вы пробовали установить конечную точку DynamoDB в правильную систему, см.https://docs.aws.amazon.com/general/latest/gr/rande.html .
В вашем случае это может быть dynamodb.us-east-1.amazonaws.com
.
Вы могли бы также использовать правильные ключи доступа и secretAccessKey.
Ответ №2:
Просто измените конечную точку (оставьте пустой для удаленного) и учетные данные / ключи:
amazon.dynamodb.endpoint=[leave empty if using AWS, or http://localhost:[dynamodb port] if using local ]
amazon.aws.accesskey=[your AWS access key if using AWS or arbitrary text if using local]
amazon.aws.secretkey=[your AWS secret key if using AWS or arbitrary text if using local]
У вас есть несколько примеров здесь:
https://tech.smartling.com/getting-started-with-amazon-dynamodb-and-java-universal-language-850fa1c8a902
Ответ №3:
Чтобы подключиться к DynamoDB в AWS из локальной системы, используйте приведенную ниже конфигурацию. Приведенный ниже пример подключается к региону US_EAST_1. Замените на ваш регион aws, в котором запущен DynamoDB.
@Configuration
@EnableDynamoDBRepositories(basePackageClasses = YourRepository.class)
public class DynamoDBConfiguration {
@Value("${aws.access.key}")
private String awsAccessKey;
@Value("${aws.secret.key}")
private String awsSecretKey;
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return AmazonDynamoDBClientBuilder.standard()
.withCredentials(awsCredentialsProvider())
.withRegion(Regions.US_EAST_1).build();
}
private AWSCredentialsProvider awsCredentialsProvider(){
return new AWSStaticCredentialsProvider(
new BasicAWSCredentials(awsAccessKey, awsSecretKey));
}
}
Добавьте в свое приложение перечисленные ниже свойства.properties
aws.access.key = <YOUR_AWS_ACCESS_KEY>
aws.secret.key = <YOUR_AWS_SECRET_KEY>
Примечание: Приведенный выше код будет работать, только если ваша роль IAM имеет разрешение на доступ к сервису с использованием вышеуказанных учетных данных.
Если микросервис должен быть развернут в экземпляре aws EC2, то это все равно, что получить доступ к DynamoDB с помощью aws. В большинстве случаев это было бы с той же учетной записью aws и в том же регионе aws. В этом случае вам не нужно предоставлять никаких подробностей. Обратитесь к классу конфигурации ниже. Это то, что вам понадобится.
import org.socialsignin.spring.data.dynamodb.repository.config.EnableDynamoDBRepositories;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder;
import com.company.project.dao.YourRepository;
@Configuration
@EnableDynamoDBRepositories(basePackageClasses = YourRepository.class)
public class DynamoDBConfiguration {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return AmazonDynamoDBClientBuilder.standard().build();
}
}
Но при изменении региона вам придется передать значение региона с помощью конфигурации, как показано ниже.
@Configuration
@EnableDynamoDBRepositories(basePackageClasses = YourRepository.class)
public class DynamoDBConfiguration {
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_EAST_1).build();
}
}
Что касается авторизации, accessKey и SecretKey не понадобятся. Роль IAM должна быть настроена на стороне EC2 для доступа к экземпляру DynamoDB.