AWS SQS接收来自AWS之外的消息

5

我的公司有一个消息系统,它以JSON格式发送实时消息,并且并不是建立在AWS上,并且也不会与AWS建立任何VPN连接。

我们的团队正在尝试使用AWS SQS接收这些消息,然后由DynamoDB处理JSON消息到TSV,最后加载到RDS。

然而根据FAQ,SQS只能从AWS内部接收消息。 https://aws.amazon.com/sqs/faqs/

Q: 谁可以对消息队列执行操作?

只有AWS帐户所有者(或AWS帐户所有者授权的AWS帐户)才能对Amazon SQS消息队列执行操作。

为了使用SQS,我能想到的一种方法是创建一个面向公众的EC2实例,接收消息并传递给SQS。

我的问题如下:

  1. 我的想法正确吗?
  2. 如果正确,您可以分享有关如何在此EC2实例上构建任何应用程序以实现功能的详细信息吗?(我没有应用程序开发经验,非常感谢您的见解!)
  3. 是否有更简单/更好的选项在AWS中可以实现接收消息的目标?
5个回答

9
  1. 我的想法正确吗?

不,不正确。

您在FAQ中误解了信息(尽管有些不太清晰)。

SQS可以从互联网的任何地方访问和使用。它唯一开放的接口是HTTP(S)。事实上,在EC2内部,只有当EC2实例实际上具有对互联网的出站访问权限时,才能访问SQS。

文档中所述的重点并非您需要“在AWS内部”使用队列,而是您需要拥有经授权的AWS凭据集才能处理队列¹。

如果您拥有AWS帐户,则拥有凭据并可以使用SQS。没有必要从“AWS内部”访问队列。

选择距离服务器最近的终端节点(以获得最低延迟),您应该发现它在任何地方都可以打开和访问。


¹创建队列后可以配置队列以允许匿名访问。(不建议这样做,我只是说这是可能的。)此FAQ部分似乎是指某些操作子集,例如创建队列。


嗨,Michael,感谢回复。我应该在描述中更清楚一些。据我了解,如果公司的队列消息系统具有AWS凭据,或者如果它在具有访问SQS权限的角色的EC2上,则可以将消息发送到SQS。然而,我困扰的是公司的队列消息系统是通用的,广播消息时不使用任何AWS凭据。我还尝试使用POSTMAN发送没有AWS凭据的消息到SQS端点,但也失败了。所以我想知道是否有任何解决这种情况的方法。如果我说错了,请纠正我,谢谢。 - JJ Smith
1
那是一个不同的问题。可能比凭据更大的问题是,您必须按照SQS API所期望的格式进行通信。在您的情况下,一个相当简单的解决方法——我猜测——将是使用AWS API Gateway,它可以代理和重写针对像SQS这样的AWS服务的传入HTTPS请求。这符合您的需求吗?接受通过HTTPS发送的消息并将其放入队列中? - Michael - sqlbot
嗨,迈克尔,我看了一下AWS API Gateway,似乎很合适。是的,接受HTTPS消息并将它们放入SQS中正是我想要的。请问是否需要进行任何开发工作才能使其正常工作?非常感谢。 - JJ Smith
只是配置,我相信...请求和响应集成映射。 - Michael - sqlbot
最终目标是拥有一个实时(或尽可能接近实时)的消息接收和转换服务。例如,有一个服务接受来自公司消息系统的信息,然后另一个服务(或可能相同的服务)将接收到的JSON格式的消息转换为TSV格式,并实时加载到RDS中,而不是批量处理。 - JJ Smith

1

只要您通过accesskey&secret key或IAM角色获得适当的权限,就可以从任何地方访问sqs。

SQS不特定于vpc


1

0

很明显,您尝试做到这一点:

从公司消息系统获取消息,将其发送到 SQS。

使用您的方法(使用 EC2 作为桥梁)并没有错误。但是,您不需要 EC2 连接到 SQS。

只要提供了正确的凭据,所有 AWS 服务都可以通过互联网访问(例如 Python boto3 等 AWS API)。因此,只要您能够建立与所述服务的连接,就可以将您的“中间件”放在任何地方。

因此,对您来说有很多更多的选项可用。例如:从您的消息系统触发;使用 AWS Lambda 等。


0

感谢您与我分享信息和见解!

我已经测试了以下解决方案,它适用于我的使用情况:

  1. 在AWS API Gateway中创建了一个端点,该端点能够接收来自公司消息系统的消息,该系统不携带AWS凭据

  2. 创建了一个由API Gateway触发的Lambda函数,因此一旦消息到达,Lambda将消化JSON消息并将其转换为TSV,然后加载到RDS中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接