当前位置: 首页 > 知识库问答 >
问题:

如何从Spring引导应用程序连接两个AWS S3 Bucket

邢博学
2023-03-14

我想从Spring启动应用程序连接两个S3水桶。我用不同的凭证创建了两个不同的beans,并创建了一个@primary。现在我的应用程序可以正常运行了,但是当我试图访问第二个不是@primary的bucket时,它给出了403 Access Denied异常

com.amazonaws.services.s3.model.AmazonS3Exception: Access Deny (Service: Amazon S3;状态代码:403;错误代码:访问被拒绝;

以下是我的代码,任何帮助都将不胜感激,提前感谢

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个答案

胡永逸
2023-03-14

是否有必要将BasicAWSCredential作为应用程序的bean公开?你不能像下面这样内联凭证吗?

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

如果您想坚持使用当前的方法,将两个凭证都公开为beans,那么可以查看< code>@Qualifier注释,在注入凭证时指定正确的凭证/AmzonS3 bucket实例,例如

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

有一个很好的教程 贝尔东 为此。

 类似资料:
  • 我正在开发一些使用mysql的java(spring-boot)RestFul Web服务,比如关系数据库。现在,有时我会遇到以下异常: 我的应用程序部署在wildFly 10.0.0应用程序服务器上,否则我使用的是tomcat-jdbc 8.5.23类似的连接池。无论如何,这是我的pom.xml依赖项: 我阅读了更多关于此问题的文章:在Connector/J中调试通信链路故障异常 关于这个问题有

  • 我使用的是版本:2.1.6.在我的pom.xml-dependencies中发布form Spring Boot。为了连接到我的数据库,我在application.properties中放了以下内容: 检查postgresql中的连接量时,使用:

  • 我想实现一个netty“从”应用程序,它侦听传出的websocket连接上的请求。因此,在引导时,应用程序将: null ServerBootstrap需要本地侦听套接字 引导程序只有一个EventLoop AbstractBootstrap不能在包之外子类化,ServerBootstrap/Bootstrap是最终的 关于如何引导通道而不重复一堆现有的*引导代码,有什么建议吗?

  • 目前,我们正在一个GCP项目中开发一个spring boot应用程序,该应用程序连接到同一个GCP项目中的PubSubendpoint,但也连接到另一个GCP项目中的PubSubendpoint。我想使用普通的spring cloud GCP PubSub组件,但是使用这些组件,我没有机会设置到第二个GCP项目的第二个PubSub连接。此外,如果我有一个服务帐户,与PubSubTemplate对象

  • 我知道Spring Boot应用程序可以作为war文件部署到生产环境中。但是部署spring boot应用程序的典型方式是什么?它只需要jvm而不需要容器吗?

  • 我不知道如果我每次连接到远程服务器时都创建(新)一个引导程序,是否存在性能问题。所以我想使用一个单独的引导实例连接到多个服务器。我的代码如下: 不幸的是,它与: 至少,我应该使用相同的NioEventLoopGroup,对吗?