AWS Сбой DynamoDb при доступе из экземпляра EC2 с данными Spring - PullRequest
0 голосов
/ 19 марта 2020

Ребята, когда я запускаю свой проект Spring Boot 2 с локального компьютера (Ubuntu), все в порядке, но когда я пытался получить доступ к таблицам DynamoDb из моего проекта Spring Boot 2, запущенного на экземпляре E C 2, я получил эту ошибку :

"The security token included in the request is invalid. (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: UnrecognizedClientException; Request ID: E0JP23I9DK11PE64OQV5MNLGR3VV4KQNSO5AEMVJF66Q9ASUAAJG)"

После компиляции моего проекта я запускаю его (на EC2 или локальном компьютере) с помощью командной строки:

java -Daws.accessKeyId=... -Daws.secretKey=... -jar myApp.jar 

Для входа в DynamoDB мой код:

@Configuration
@EnableDynamoDBRepositories(basePackages = "app.repositories")
public class DynamoDBConfig {

    @Autowired
    private ConfigProperties config;

    @Bean
    public AmazonDynamoDB amazonDynamoDB() {
        AWSCredentialsProvider credentialsProvider = buildCredentials();
        AmazonDynamoDBClient.builder().withCredentials(credentialsProvider).withRegion("");
        return AmazonDynamoDBClientBuilder.defaultClient();
    }

    private AWSCredentialsProvider buildCredentials() {
        AWSCredentialsProvider credentialsProvider = new AWSCredentialsProvider(){

            @Override
            public AWSCredentials getCredentials() {
                return new BasicAWSCredentials(config.getAwsAccessKey(), config.getAwsSecretKey());
            }

            @Override
            public void refresh() {
                // TODO Auto-generated method stub

            }

        };
        return credentialsProvider;
    }

}

Для доступа к таблицам я использую этот код:

@Getter
@Setter
@DynamoDBTable(tableName = "user")
public class UserModel {

    @DynamoDBHashKey
    @DynamoDBAutoGeneratedKey   
    private String id;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "idx_global_userMatricula")
    @DynamoDBAttribute  
    private String matricula;

    @DynamoDBAttribute
    private String nome;

    @DynamoDBAttribute
    private String senha;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "idx_global_userClinicaId")
    @DynamoDBAttribute
    private String clinicaId;

    @DynamoDBAttribute
    private boolean active;

    @DynamoDBAttribute
    private boolean grantCli;

    @DynamoDBAttribute
    private boolean grantUser;

    @DynamoDBAttribute
    private String collection;

}

И мой класс хранилища:

@EnableScan
public interface UserRepository extends CrudRepository<UserModel,String>{

}

Tks ...

1 Ответ

0 голосов
/ 20 марта 2020

Реализовывать собственный провайдер учетных данных не очень хорошая практика. Я предполагаю, что проблема заключается в том, что пользовательский способ получения учетных данных на локальном компьютере не настроен на экземпляре EC2.

Я бы порекомендовал использовать DefaultCredentialsProvider , который проходит через 5 различные методы поиска учетных данных (см. документацию).

Некоторые из этих методов хорошо работают на локальном компьютере для тестирования, таких как переменные среды, а также файл ~/.aws/credentials, который настраивается при локальном запуске команды aws configure.

Некоторые методы более идеальны для экземпляров EC2, например, для использования роли IAM профиля экземпляра, связанной с экземпляром EC2.

Использование DefaultCredentialsProvider позволит вам использовать эти различные механизмы без необходимости иметь разные провайдеры учетных данных для локальных развертываний против EC2.

...