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

Java 当S3中的文件发生更改时,在Elastic beanstalk应用程序的所有实例中触发操作,java,amazon-s3,notifications,amazon-sns,amazon-elastic-beanstalk,Java,Amazon S3,Notifications,Amazon Sns,Amazon Elastic Beanstalk,在AWS Elasic Beanstalk中运行的spring boot应用程序从AmazonS3中的某个位置加载数据。数据每10分钟刷新一次,我希望beanstalk的所有实例都从S3重新加载数据 我有一个很好的方法来完成这件事。我做了以下几件事 1. Implemented an end point in beanstalk application which, when called, triggers the reload. 2. I have a script that determi

在AWS Elasic Beanstalk中运行的spring boot应用程序从AmazonS3中的某个位置加载数据。数据每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代码的指针,我将不胜感激。

我和你同舟共济,我有一个ElasticBeanstalk自动伸缩应用程序,我希望每个EC2实例都订阅一个SNS主题。因此,我想知道如何建立一个URL以用作订阅侦听器端点。我不太确定Java是否会用它的IP函数接收我的私有地址或公共地址

我在网上论坛上看到一些评论,批评在代码中添加HTTP Post侦听器来接收消息是一个糟糕的实现(从安全角度来看),这本身就意味着这是可能的。然而,在其他情况下,谈论VPC的时候,事情似乎又开始破裂了

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

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

在我的情况下,我需要确定我的应用程序是否正在关闭(ContextListener将在这里提供帮助),然后停止SQS队列接收器循环,因此在超时后,我可能会检查是否设置了关闭标志,如果没有,则再次循环


这显然比SNS酒吧/酒吧要复杂得多。我想与大家分享我学到的东西,希望它能同时帮助你/其他人。另外,我在AWS Elastic Beanstalk EC2实例的上下文中启动了一个关于发布/订阅的堆栈溢出。

如果每个EBS实例上都有一些数据需要重新加载,那么为什么不将数据保留在S3本身上呢?抱歉。我不明白你说的“KaranShah”是什么意思。数据已经驻留在S3中。它每10分钟更新一次。然后需要提醒beanstalk实例提取刷新的数据。根据您的描述,您的要求是从s3开始大约每隔10分钟将数据加载到您的EB实例,对吗?。如果您能告诉我们为什么要加载数据,那么就更容易给您提供答案。@Ashan:beanstalk应用程序需要这些数据。由于应用程序可能运行多个服务器,每个服务器都需要相同的数据,因此将数据存储在所有实例加载数据的位置是有意义的。所以我将这些数据存储在S3中。这些数据是关于产品的可用性的,它不断变化。因此,每隔10分钟,我会在S3中更新这些数据(使用后台脚本)。