Apache Camel AWS S3 Bucket嵌套目录:

时间:2017-06-13 21:26:51

标签: amazon-s3 apache-camel

我目前正在尝试在AWS上使用带有S3存储桶的Apache Camel。我们目前为我们的代码库提供了每个环境1个桶(例如:dev bucket,e2e bucket,prod bucket)。

我们想在内部使用1个带有多个目录的存储桶,以避免混乱并巩固空间。然后我们可以将camel指向端点内的一个文件夹来监听(似乎可行)。在尝试配置时,这已成为极其困难的问题。 Camel似乎期望它可以连接到每个端点的存储桶。

是否有人可以了解这是否可行,或者每个端点是否需要1个桶? camel documentation未指定是否可行。

2 个答案:

答案 0 :(得分:2)

确实正如Alex Nano写的那样,s3文件夹只是对象键的前缀(“文件名”),因此如果你想设置监控不同s3“文件夹”的多个路由,你可以使用aws的前缀选项: s3端点

前缀与您使用aws s3 cli的功能相同, 例如

aws s3 ls s3://mybucket/myfolderInsideBucket/

JUnit示例

public class CamelAwsS3Test extends CamelTestSupport {

@EndpointInject(uri = "mock:result")
private MockEndpoint resultEndpoint;

@Before
public void setup() throws Exception {
    context.start();
}

@Test
public void foo() throws Exception {
    int expectedFileCount = 3
    resultEndpoint.expectedMessageCount(expectedFileCount);
    resultEndpoint.assertIsSatisfied();
}

@Override
protected JndiRegistry createRegistry() throws Exception {
    JndiRegistry registry = super.createRegistry();
    final String accessKey = "ACCESSKEY";
    final String secretKey = "SECRETKEY";
    AmazonS3 client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey));
    registry.bind("amazonS3Client", client);

    return registry;
}

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {

    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("aws-s3://{BUCKET}?amazonS3Client=#amazonS3Client&prefix=${FOLDER}")
                    .log("hey ${body}").to("mock:result");
        }
    };
}

}

答案 1 :(得分:1)

很少有想法:

S3只有看起来像文件夹一样。实际上,它是一个单一的名称:值对(bucket:key)。 也就是说,只有顶级“桶”实际上是文件夹;看起来像路径,只是一个关键。

所以 - 只需使用一个存储桶,然后过滤掉每个谓词(http://camel.apache.org/predicate.html)case语句的键,以处理您需要的内容。

我确信还有其他方法,但这似乎很简单。

还要注意AWS s3限制,证明您合并的冲动是正确的:

  • 每个AWS账户只有100个桶
  • 所有存储桶必须在区域中唯一命名(甚至跨所有 AWS账户)