Как соединить два AWS S3 Buckets из приложения весенней загрузки - PullRequest
0 голосов
/ 06 марта 2020

Я хочу подключить два S3 Buckets из приложения для весенней загрузки. Я делаю два разных bean-компонента с разными учетными данными и делаю один @primary, теперь мое приложение работает правильно, но когда я попытался получить доступ ко второму сегменту, который не является @primary, это дает мне 403 Исключение отказа в доступе

com.amazon aws .services.s3.model.AmazonS3Exception: доступ запрещен (Сервис: Amazon S3; код состояния: 403; код ошибки: AccessDenied;

Ниже приведен мой код, любая помощь будет высоко оценена Спасибо заранее

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class AWSConfiguration {

    @Value("${One.cloud.aws.credentials.accessKey}")
    private String accessKeyOne;

    @Value("${One.cloud.aws.credentials.secretKey}")
    private String secretKeyOne;

    @Value("${One.cloud.aws.region}")
    private String regionOne;

    @Value("${Two.bucket.accessKey}")
    private String accessKeyTwo;

    @Value("${Two.bucket.secretKey}")
    private String secretKeyTwo;

    @Value("${Two.bucket.region}")
    private String regionTwo;

    @Bean
    @Primary
    public BasicAWSCredentials basicAWSCredentialsOne() {
        return new BasicAWSCredentials(accessKeyOne, secretKeyOne);
    }

    @Bean
    @Primary
    public AmazonS3 amazonS3ClientOne(AWSCredentials awsCredentials) {
        AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
        builder.withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
        builder.setRegion(regionOne);
        AmazonS3 amazonS3 = builder.build();
        return amazonS3;
    }

    @Bean
    public BasicAWSCredentials basicAWSCredentialsTwo() {
        return new BasicAWSCredentials(accessKeyTwo, secretKeyTwo);
    }

    @Bean
    public AmazonS3 amazonS3ClientTwo(AWSCredentials awsCredentials) {
        AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
        builder.withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
        builder.setRegion(regionTwo);
        AmazonS3 amazonS3 = builder.build();
        return amazonS3;
    }
}

1 Ответ

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

Нужно ли выставлять оба BasicAWSCredentials как бины для вашего приложения? Разве вы не можете просто вставить учетные данные, как показано ниже:

@Configuration
public class AWSConfiguration {

    @Value("${One.cloud.aws.credentials.accessKey}")
    private String accessKeyOne;

    @Value("${One.cloud.aws.credentials.secretKey}")
    private String secretKeyOne;

    @Value("${One.cloud.aws.region}")
    private String regionOne;

    @Value("${Two.bucket.accessKey}")
    private String accessKeyTwo;

    @Value("${Two.bucket.secretKey}")
    private String secretKeyTwo;

    @Value("${Two.bucket.region}")
    private String regionTwo;

    @Bean
    @Primary
    public AmazonS3 amazonS3ClientOne(AWSCredentials awsCredentials) {
        AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
        builder.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKeyOne, secretKeyOne)));
        builder.setRegion(regionOne);
        AmazonS3 amazonS3 = builder.build();
        return amazonS3;
    }

    @Bean
    public AmazonS3 amazonS3ClientTwo(AWSCredentials awsCredentials) {
        AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
        builder.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKeyTwo, secretKeyTwo)));
        builder.setRegion(regionTwo);
        AmazonS3 amazonS3 = builder.build();
        return amazonS3;
    }
}

Если вы хотите придерживаться своего текущего подхода с представлением обоих учетных данных в виде компонентов, вы можете взглянуть на аннотацию @Qualifier, чтобы указать правильный экземпляр корзины Credentials / AmzonS3 во время их инъекции, например,

@Bean
public AmazonS3 amazonS3ClientTwo(@Qualifier("basicAWSCredentialsTwo") AWSCredentials awsCredentials) {
    AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard();
    builder.withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
    builder.setRegion(regionTwo);
    AmazonS3 amazonS3 = builder.build();
    return amazonS3;
}

. Для этого доступно хорошее руководство по Baeldung .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...