当S3中的文件发生更改时,在Elastic beanstalk应用程序的所有实例中触发操作

时间:2017-03-25 01:22:26

标签: java amazon-s3 notifications amazon-sns elastic-beanstalk

我在AWS Elasic Beanstalk中运行的spring-boot应用程序从Amazon S3中的某个位置加载数据。数据每10分钟刷新一次,我希望beanstalk的所有实例都从S3重新加载数据。

我有一种愚蠢的方式来完成这件事。我做了以下。

1. Implemented an end point in beanstalk application which, when called, triggers the reload.
2. I have a script that determines the IP address of each beanstalk instance given the beanstalk application's `environment name`.
3. I then iterate through all these IP addresses and call the end point mentioned in point 1 above.

到目前为止,这是有效的,因为实例的IP地址是公开可寻址的。由于我们不得不仅使用私有IP,因此不再是这种情况。

触发数据重新加载的正确方法是什么?我在考虑以下几点:

1. Set up Amazon S3 bucket to generate an event and post to a SNS topic.
2. Have an SNS client in my beanstalk application which subscribes to that topic and listens for events.
3. Upon receiving an event from that topic, trigger the data reload.

我做过(1)但不知道怎么做(2)和(3)。如何在Java代码中订阅该主题? SNS只允许3种通知方法 - 使用SQS(AWS简单排队服务),SMS和HTTP / HTTPS URL。

URL方法不起作用,因为它会将请求转发到负载均衡器后面的一个实例。因此,并非所有实例都会重新加载。

SQS也不起作用,因为一旦一个实例读取消息,消息将被排队,其他实例将不会收到触发消息。

电子邮件也不起作用(或者我不知道如何使它工作)。

任何帮助/想法?指向Java代码的指针将非常受欢迎。

1 个答案:

答案 0 :(得分:0)

我和您在同一条船上,我有一个ElasticBeanstalk自动缩放应用程序,我希望每个EC2实例都订阅一个SNS主题。因此,我想知道如何构建一个URL用作我的订阅侦听器端点。我不太确定Java是否会使用其IP功能来获取我的私有地址或公共地址。

我在网上论坛上看到过评论,这些评论批评说,在代码中添加HTTP Post侦听器以接收消息是一个糟糕的实现(从安全角度来看),仅此一项就意味着可能。但是,在其他情况下,谈论VPC听起来似乎又开始崩溃了。

即使我确实解决了所有上述问题,我可能还会遇到的另一个问题是在开发机器上运行相同的代码,很可能它将使用无法从Internet访问的私有IP地址,从而导致我的代码失败如果私有IP地址被窃取,在EC2实例上可能实际上是相同的问题。

从目前为止的内容来看,最好使用Amazon SQS,注册某种发布/订阅队列,然后在超时的情况下从EC2实例轮询更新。

就我而言,我需要确定应用程序是否正在关闭(ContextListener将在此处帮助您),然后停止SQS队列接收器循环,因此在超时之后,我可能会检查是否设置了关闭标志,如果不再循环。

当然,这似乎比SNS pub / sub复杂得多。我想分享我所学到的东西,希望它可以同时帮助您/其他人。另外,我已经开始在AWS Elastic Beanstalk EC2实例的上下文中,有关发布/订阅的question here堆栈溢出。