繁体   English   中英

如何使用 Java SDK 访问受 IAM 角色保护的 S3 Bucket?

[英]How do you access S3 Bucket protected by an IAM role using the Java SDK?

我在 AWS 中有一个 S3 存储桶设置,它由 IAM 角色保护。 我正在编写一个应该访问该存储桶的应用程序。 应用程序部署到 EKS 集群并通过服务帐户设置获取角色(遵循 IRSA 概念)。 到目前为止,这工作正常。

但是对于测试/开发,我也希望能够在本地运行应用程序。 那么如何在本地运行时将 IAM 角色分配给我的应用程序呢?

在 EKS 中运行时,权限由集群处理,因此从 Java 代码中,我只需要创建一个默认的 S3 客户端,然后我就可以放置对象:

AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient();
s3Client.putObject(bucketName, key, data);

这当然不会在本地开箱即用。

我的配置文件中定义了一个 AWS 配置文件:

[profile test]
role_arn = arn:aws:iam::...
source_profile = default
region = eu-central-1

### MFA Authenticated
[default]
region = eu-central-1

登录后,我可以使用以下命令从控制台查看存储桶:

aws s3api list-objects --bucket <bucketname> --profile test

我通过提供环境变量将我的配置文件连接到应用程序:

AWS_PROFILE=test
AWS_REGION=eu-central-1

我也试过AWS_PROFILE="profile test"

运行我的代码时,我得到

com.amazonaws.services.s3.model.AmazonS3Exception: 
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
(Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; 

我正在使用 Java SDK 1.11.738 并确保在 maven 的 pom.xml 中 sdk-s3、sdk-core 和 sdk-kms 都具有相同的版本:

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.738</version>
            <exclusions>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>aws-java-sdk-kms</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.amazonaws</groupId>
                    <artifactId>jmespath-java</artifactId>
                </exclusion>
            </exclusions>        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
            <version>1.11.738</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-kms</artifactId>
            <version>1.11.738</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>jmespath-java</artifactId>
            <version>1.11.738</version>
        </dependency>

在我看来,您有不同的问题。

您收到的错误来自您尚未指定签名版本这一事实。

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");

进一步阅读

其次,关于角色,需要在EKS实例上设置角色。

您需要使用您的 arn 获取以下临时值。

AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN

然后将这些添加到您的服务的环境变量中,或者在本地启动服务时将它们作为环境变量传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM