我使用 Apache Camel 和 aws2-s3 模块来访问 S3 存储桶。我正在使用端点 dsl 来编程我的路线。
我可以连接到存储桶并从中读取数据,但在尝试上传时遇到“访问被拒绝”的情况。
我需要启用SSE-S3。我看到其他帖子指出需要设置 x-amz-server-side-encryption 标头,但我该怎么做?
在 aws-s3 组件的文档中,它指出:
CamelAwsS3ServerSideEncryption
设置使用 AWS 托管密钥加密对象时的服务器端加密算法。例如使用 AES256。
我在文档中找不到任何其他对 AWS 托管密钥的引用,除非它指的是 KMS 或客户密钥。
我已经尝试过
.setHeader(AWS2S3Constants.SERVER_SIDE_ENCRYPTION, constant("AES256"))
,但似乎并没有真正启用 SSE-S3。
我还尝试通过其他方式设置标题:
Map<String,Object> headers = new HashMap<>();
headers.put("x-amz-server-side-encryption", "AES256");
...
.process(exchange -> {
exchange.getIn().setHeader("x-amz-server-side-encryption", "AES256");
})
.setHeader(AWS2S3Constants.SERVER_SIDE_ENCRYPTION, constant("AES256"))
.setHeader(AWS2S3Constants.METADATA, () -> headers)
.setHeader("CamelAwsS3Headers", () -> headers)
这应该通过以下方式解决:https://issues.apache.org/jira/browse/CAMEL-18064
在即将发布的 3.17.0 版本中提供。我今天早上修好了。
对于那些尝试在使用 Spring Boot 时实现此目的的人,您可以在
isUseSSES3
Camel 组件配置上设置 aws2-s3
标志。 kotlin 中类似以下内容:
@Configuration
class CamelConfiguration {
@Bean
fun contextConfiguration(): CamelContextConfiguration {
return object : CamelContextConfiguration {
override fun beforeApplicationStart(camelContext: CamelContext) {
(camelContext.getComponent("aws2-s3") as AWS2S3Component).apply {
configuration.isUseSSES3 = true
}
}
override fun afterApplicationStart(camelContext: CamelContext) {
// do nothing
}
}
}
}