通过Java应用程序将对象放入S3会提示缺少AWS签名

0

【以下的问题经过翻译处理】 你好,

我正在尝试从我的Java应用程序向S3存储桶写入数据。我的应用程序运行在EKS上。我已经使用系统属性aws.accessKeyIdaws.secretAccessKey提供了AWS凭证。

当发送put请求时,我收到这个错误 - com.amazonaws.services.s3.model.AmazonS3Exception: Put Object requests with Object Lock parameters require AWS Signature Version 4 (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument

Java SDK应该自动使用凭证进行身份验证,不需要计算签名。我是否漏掉了什么?

profile picture
EXPERTE
gefragt vor 6 Monaten15 Aufrufe
1 Antwort
0

【以下的回答经过翻译处理】 该错误消息表明,您需要使用AWS Signature Version 4来验证带Object Lock参数的请求到Amazon S3。这是因为Object Lock是一项提供WORM(一次写入,多次读取)功能的特性,因此需要更高级别的安全性。

您可以通过从代码中删除.withClientConfiguration(new ClientConfiguration().withSignerOverride("AWSS3V4SignerType"))行来启用Signature Version 4。如果所调用的API需要它,AWS SDK for Java将自动使用Signature Version 4。

以下是更新后的代码:

final AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration(
            s3Endpoint,
            s3Region
    );

final AmazonS3 s3client = AmazonS3ClientBuilder
            .standard()
            .withEndpointConfiguration(endpoint)
            .enablePathStyleAccess()
            .build();

请注意,建议使用IAM role或Instance Profile为在EC2或EKS上运行的应用程序提供AWS凭证,而不是使用显式访问密钥。这种方法可以帮助提高安全性和简化凭证管理。

profile picture
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen