Как подключиться к DynamoDB на AWS с помощью приложения Spring Boot, работающего в локальной системе?

#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.