我在AWS Elasic Beanstalk中运行的spring-boot应用程序从Amazon S3中的某个位置加载数据。数据每10分钟刷新一次,我希望beanstalk的所有实例都从S3重新加载数据。
我有一个hacky方式来完成这件事。我做了以下。
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地址无法访问互联网,导致我的代码失败并可能实际上如果获取私有IP地址,则EC2实例上的问题相同。
根据我到目前为止所读到的内容,您最好使用Amazon SQS,注册某种发布/订阅队列,然后在超时时从EC2实例轮询更新。
在我的情况下,我需要解决如果我的应用程序正在关闭(ContextListener将在这里帮助)然后停止SQS队列接收器循环,所以在我的超时后我可能会检查是否设置了关闭标志,如果不是循环再次。
它肯定比SNS pub / sub复杂得多。我想分享我所学到的东西,希望它可以在此期间帮助你/其他人。此外,我在AWS Elastic Beanstalk EC2实例的上下文中关于pub / sub的堆栈溢出启动了question here。