【问题标题】:How to connect to DynamoDB on AWS using a Spring Boot application running on local system?如何使用在本地系统上运行的 Spring Boot 应用程序连接到 AWS 上的 DynamoDB?
【发布时间】:2019-08-09 15:22:27
【问题描述】:

我正在开发基于 Spring Boot 微服务 REST 的应用程序,backedn 数据库目前是本地 Dynamodb 数据库。我可以使用 Postman 对本地运行的应用程序进行 REST 调用,并且可以使用本地 dynamodb 数据库执行 CRUD 操作。 现在我想对配置进行更改,以便每当我在本地运行的应用程序上进行类似的 CRUD 操作时,数据应该保存/更新到在 AWS 而不是本地运行的实际 DynamoDB 上。基本上,我想将应用程序指向远程 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

请帮忙。谢谢

【问题讨论】:

    标签: java amazon-web-services spring-boot amazon-dynamodb microservices


    【解决方案1】:

    要从本地系统连接到 AWS 上的 DynamoDB,请使用以下配置。下面的示例连接到 US_EAST_1 区域。替换为运行 DynamoDb 的 aws 区域。

    @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));
        }
    
    }
    

    将以下属性添加到您的 application.properties

    aws.access.key = <YOUR_AWS_ACCESS_KEY>
    aws.secret.key = <YOUR_AWS_SECRET_KEY>
    

    注意:仅当您的 IAM 角色有权使用上述凭证访问服务时,上述代码才有效。

    如果微服务要部署在aws EC2 实例中,那么就如同用aws 访问DynamoDB。在大多数情况下,它将使用相同的 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。必须在 EC2 端配置 IAM 角色才能访问 DynamoDB 实例。

    【讨论】:

      【解决方案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 端点设置为正确的系统,请参阅https://docs.aws.amazon.com/general/latest/gr/rande.html

        在你的情况下,它可能是dynamodb.us-east-1.amazonaws.com

        您不妨使用正确的 accessKey 和 secretAccessKey。

        【讨论】:

          猜你喜欢
          • 2020-11-21
          • 2018-03-15
          • 2017-03-26
          • 2022-01-19
          • 2017-02-02
          • 2017-04-19
          • 1970-01-01
          • 2018-08-11
          • 1970-01-01
          相关资源
          最近更新 更多